deslop 0.2.0

A static analyzer that spots low-context and AI-assisted code patterns across naming, concurrency, security, performance, and test quality.
Documentation
use super::{RuleConfigurability, RuleDefaultSeverity, RuleDefinition, RuleLanguage, RuleStatus};

pub(crate) const RULE_DEFINITIONS: &[RuleDefinition] = &[
    RuleDefinition {
        id: "broad_exception_handler",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Broad except Exception: style handlers that still obscure failure shape even when not fully swallowed.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "builtin_reduction_candidate",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Loop shapes that look like obvious sum, any, or all candidates.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "commented_out_code",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Blocks of commented-out source code left in production files.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "environment_boundary_without_fallback",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Environment-variable lookups that omit a default value or explicit failure handler.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "eval_exec_usage",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Direct eval() or exec() usage in non-test Python code.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "exception_swallowed",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Broad exception handlers like except: or except Exception: that immediately suppress the error with pass, continue, break, or return.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "external_input_without_validation",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Request or CLI entry points that trust external input without obvious validation or guard checks.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "hardcoded_business_rule",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Hardcoded threshold, rate-limit, or pricing-style literals assigned inside non-test Python functions.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "hardcoded_path_string",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Hardcoded filesystem path literals assigned inside non-test Python functions.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "magic_value_branching",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Repeated branch-shaping numeric or string literals that likely want an explicit constant or policy name.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "missing_context_manager",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Resource management (files, network connections) inside non-test Python functions that omits with-statement context managers.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "mixed_sync_async_module",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Modules that expose public sync and async entry points together.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "network_boundary_without_timeout",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Request, sync, or job-style Python functions that call HTTP boundaries with no obvious timeout or retry policy.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "none_comparison",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "== None or != None checks instead of is None or is not None.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "print_debugging_leftover",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "print() calls left in non-test Python functions that do not look like obvious main-entrypoint output.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "public_api_missing_type_hints",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Public Python functions that omit complete parameter or return annotations.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "redundant_return_none",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Explicit return None in simple code paths where Python would already return None implicitly.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "reinvented_utility",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Obvious locally implemented utility helpers that overlap with already-imported standard-library style helpers.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "side_effect_comprehension",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "List, set, or dicit comprehensions used as standalone statements where the result is discarded.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
    RuleDefinition {
        id: "variadic_public_api",
        language: RuleLanguage::Python,
        family: "maintainability",
        default_severity: RuleDefaultSeverity::Contextual,
        status: RuleStatus::Stable,
        configurability: &[
            RuleConfigurability::Disable,
            RuleConfigurability::Ignore,
            RuleConfigurability::SeverityOverride,
        ],
        description: "Public Python functions that expose *args or **kwargs instead of a clearer interface.",
        binding_location: super::bindings::PYTHON_MAINTAINABILITY,
    },
];