Skip to main content

AI-powered Python performance analyzer that detects algorithmic bottlenecks

Project description

LoopSleuth

A Rust-based CLI tool that analyzes Python code for performance issues using local LLM inference.

Installation

Get started in 3 commands:

# 1. Install LoopSleuth
pip install loopsleuth

# 2. Download a model interactively
loopsleuth download-model

# 3. Run analysis!
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src

That's it! The download-model command will show you available models, download your choice to ~/.loopsleuth/models/, and show you how to use it.

Quick Start Guide: See docs/QUICKSTART.md for a complete walkthrough.

Features

  • Fully Configurable: Define checks, customize prompts, and set defaults via TOML configuration file
  • 8 Built-in Performance Checks: Detects multiple types of performance issues beyond just quadratic complexity
  • Parses Python code using Ruff's parser (fast and accurate)
  • Extracts functions from Python modules
  • Analyzes each function using a local LLM (llama.cpp)
  • Supports both single files and entire directories
  • Intelligent caching - Uses SQLite to cache analysis results per check, avoiding redundant LLM calls for unchanged functions
  • Flexible check selection - Run all checks, specific checks, or exclude certain checks

Performance Checks

LoopSleuth includes 8 built-in performance checks:

General Performance

  1. quadratic - Detects O(nยฒ) or worse time complexity (nested loops, etc.)
  2. linear-in-loop - Detects hidden O(n) operations in loops (x in list, .remove(), .index())
  3. n-plus-one - Detects repeated expensive operations in loops (file I/O, network, model loading)
  4. expensive-sort-key - Detects O(n) key functions in sort/sorted operations
  5. unbounded-alloc - Detects growing allocations in loops (string concat, repeated cat)
  6. growing-container - Detects loops that grow containers while iterating

ML-Specific

  1. conversion-churn - Detects repeated CPU/GPU or tensor/array conversions in loops
  2. ml-footguns - Detects ML-specific issues (repeated tokenization, mask rebuilding)

Configuration

LoopSleuth uses a TOML configuration file (loopsleuth.toml) to define performance checks. You can:

  • Customize existing checks
  • Add your own custom checks
  • Modify LLM prompts for better detection
  • Set default CLI options

Configuration File Locations

LoopSleuth looks for configuration in this order:

  1. Path specified with --config flag
  2. ~/.config/loopsleuth/loopsleuth.toml (user config)
  3. Built-in defaults (bundled with the tool)

Configuration Format

[settings]
# Optional: Set default CLI options (can be overridden by command-line flags)
model = "./models/qwen2.5-coder-3b-instruct-q4_k_m.gguf"
threads = 4
max_tokens = 512
context_size = 4096

[[check]]
key = "my-custom-check"
name = "My Custom Check"
description = "Detects my specific performance pattern"
category = "performance"
keyword = "MY_ISSUE"  # Keyword LLM should include if issue detected
detection_prompt = """<|im_start|>system
You are a code analyzer...
Use {function_source} placeholder for the function code.
<|im_end|>
<|im_start|>user
Analyze: {function_source}
<|im_end|>
<|im_start|>assistant
"""
solution_prompt = """<|im_start|>system
Provide solutions...
<|im_end|>
<|im_start|>user
Fix this: {function_source}
<|im_end|>
<|im_start|>assistant
"""

Using Custom Configuration

# Print default config to create your own
loopsleuth --print-default-config > my-loopsleuth.toml

# Edit my-loopsleuth.toml to customize checks or add new ones

# Use your custom config
loopsleuth --config my-loopsleuth.toml -m ~/.loopsleuth/models/qwen*.gguf ./src

# Or place it in ~/.config/loopsleuth/loopsleuth.toml for automatic loading
mkdir -p ~/.config/loopsleuth
cp my-loopsleuth.toml ~/.config/loopsleuth/loopsleuth.toml

Adding Custom Checks

  1. Get the default configuration:

    loopsleuth --print-default-config > ~/.config/loopsleuth/loopsleuth.toml
    
  2. Add a new check section:

    [[check]]
    key = "database-in-loop"
    name = "Database Queries in Loop"
    description = "Detects database queries inside loops"
    category = "performance"
    keyword = "DB_IN_LOOP"
    detection_prompt = """..."""
    solution_prompt = """..."""
    
  3. Run with your custom check:

    loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src --checks database-in-loop
    

Model Management

After installation, use these commands to manage models:

# Download a model interactively
loopsleuth download-model

# List downloaded models
loopsleuth list-models

# Use short form
loopsleuth download

Recommended models:

  • Qwen2.5-Coder (3B) โญ - Best for code analysis (~2GB)
  • Devstral Small 2 (24B) - Highest accuracy, requires more RAM (~15GB)
  • Qwen2.5 (3B) - General purpose, good balance (~2GB)
  • Qwen2.5 (0.5B) - Very fast, lower accuracy (~400MB)

The interactive download command will guide you through selecting and downloading the best model for your needs.

Building from Source

For development or if you prefer to build from source:

Prerequisites:

  • Rust toolchain from rustup.rs
  • CMake (brew install cmake on macOS, apt-get install cmake on Linux)
# Clone the repository
git clone https://github.com/tarekziade/loopsleuth.git
cd loopsleuth

# Build the project
cargo build --release

# Download a model
mkdir -p models
pip install huggingface_hub
hf download Qwen/Qwen2.5-Coder-3B-Instruct-GGUF \
  qwen2.5-coder-3b-instruct-q4_k_m.gguf \
  --local-dir ./models

# Run
./target/release/loopsleuth -m ./models/qwen*.gguf ./src

Note: The first build takes several minutes as it compiles llama.cpp from source. Subsequent builds are much faster.

For detailed build instructions and troubleshooting, see docs/PYTHON_INSTALL.md

Usage

Basic Usage

Analyze a single Python file (runs all checks by default):

loopsleuth -m ~/.loopsleuth/models/qwen2.5-coder-3b-instruct-q4_k_m.gguf example.py

Analyze an entire directory (recursive):

loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src

The tool automatically finds all .py files in subdirectories and groups results by file.

Check Selection

List all available checks:

loopsleuth --list-checks

Run specific checks only:

loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src --checks quadratic,linear-in-loop

Run all checks except specific ones:

loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./src --exclude conversion-churn,ml-footguns

Note: By default, all 8 checks are run. Use --checks to select specific checks or --exclude to skip certain checks.

Options

Required

  • -m, --model <MODEL> - Path to the GGUF model file (required unless using --list-checks)
  • <PATH> - Path to Python file or directory to analyze (required unless using --list-checks)

Check Selection

  • --list-checks - List all available checks and exit
  • --checks <CHECKS> - Comma-separated list of checks to run (e.g., "quadratic,linear-in-loop")
  • --exclude <CHECKS> - Comma-separated list of checks to exclude from analysis

Configuration

  • --config <FILE> - Path to custom checks configuration file (TOML format)
  • --print-default-config - Print the built-in default configuration and exit

LLM Options

  • -t, --threads <THREADS> - Number of threads for inference (default: 4)
  • --max-tokens <MAX_TOKENS> - Maximum tokens to generate (default: 512)
  • --context-size <SIZE> - Context window size in tokens (default: 4096)
  • -v, --verbose - Show verbose llama.cpp output (useful for debugging)

Output Options

  • -o, --output <FILE> - Save analysis report to markdown file
  • -d, --details - Show detailed report in stdout (always included in file output)
  • --skip-large <N> - Skip functions larger than N lines (0 = no limit)

Cache Options

  • --no-cache - Disable caching (forces re-analysis of all functions)
  • --clear-cache - Clear the cache before running analysis
  • --cache-dir <DIR> - Specify cache directory (default: .loopsleuth_cache)

Note:

  • The tool shows a real-time progress bar with function names and status
  • Cached results are shown with a ๐Ÿ’พ icon for instant retrieval
  • For extremely large functions (>500 lines), consider using --skip-large N
  • If you get "Function too large" warnings, increase --context-size to 8192 or higher

Example

# List all available checks
loopsleuth --list-checks

# Print default configuration
loopsleuth --print-default-config > my-loopsleuth.toml

# Run with custom configuration
loopsleuth --config my-loopsleuth.toml -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py

# Run all checks (default)
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py

# Run specific checks only
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --checks quadratic,linear-in-loop

# Run all except ML-specific checks
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --exclude conversion-churn,ml-footguns

# Full analysis in terminal
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --details

# Save detailed report to file
loopsleuth -m ~/.loopsleuth/models/qwen*.gguf ./test_examples/sample.py --output report.md

For developers: If you're building from source, use cargo run --release -- instead of loopsleuth, or use make example.

Output Format

LoopSleuth provides flexible output for different use cases:

Default: Concise Summary

A quick overview showing:

  • Total functions analyzed
  • Checks run
  • Count of functions with issues (any check)
  • List of issues grouped by function

Perfect for: Quick checks, CI/CD pipelines, daily development

With --details: Full Report to stdout

Each function with issues includes:

  • ๐Ÿ“ Full source code
  • โš ๏ธ Analysis for each detected issue
  • ๐Ÿ’ก Optimization suggestions with examples for each issue

Perfect for: Deep analysis, learning, immediate review

With --output FILE: Save Markdown Report

Generate a complete markdown file that can be:

  • Committed to your repository
  • Attached to pull requests
  • Shared in code reviews
  • Used as documentation

Note: File output always includes full details regardless of --details flag

Sample output:

๐Ÿ”ง Initializing LoopSleuth...
   โš™๏ธ  Setting up LLM backend...
   ๐Ÿ“ฆ Loading model: ./models/qwen2.5-coder-3b-instruct-q4_k_m.gguf...
   โœ… Ready! (context: 4096 tokens)

๐Ÿ” Scanning 1 Python file(s)...
๐Ÿ”ฌ Running 3 check(s): quadratic, linear-in-loop, unbounded-alloc
๐Ÿ“Š Analyzing 4 function(s)...

[โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ] 100% [4/4] | Issues: 3 | ๐Ÿ” [unbounded-alloc] clean_function
โœ… Analysis complete!

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘ LOOPSLEUTH ANALYSIS SUMMARY   โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

๐Ÿ“Š Total functions analyzed: 4
๐Ÿ” Checks run: 3 (quadratic, linear-in-loop, unbounded-alloc)
โš ๏ธ  Functions with issues: 3
โœ“  Functions clean: 1
๐Ÿ’พ Cache entries: 12 (expected: 12 = 4 functions ร— 3 checks), 8 with issues

๐Ÿ”ด ISSUES DETECTED:
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  โ€ข quadratic_example (test.py:1)
    - Quadratic Complexity
    - Linear Operations in Loops
    - Unbounded Allocations
  โ€ข linear_in_loop_example (test.py:10)
    - Quadratic Complexity
    - Linear Operations in Loops
  โ€ข string_concat_example (test.py:17)
    - Quadratic Complexity
    - Linear Operations in Loops
    - Unbounded Allocations

๐Ÿ’ก Tip: Use --details to see full analysis or --output FILE to save report

How It Works

  1. File Discovery: Walks through the specified path to find all .py files
  2. Parsing: Uses RustPython's parser to build an AST
  3. Function Extraction: Extracts all function definitions (including class methods)
  4. Check Selection: Determines which checks to run based on CLI flags (default: all 8 checks)
  5. For each function, run all selected checks:
    • Cache Check: Computes SHA256 hash of function source code + check key and checks SQLite cache
      • Cache Hit: Instantly returns cached analysis results (shown with ๐Ÿ’พ icon)
      • Cache Miss: Proceeds to LLM analysis
    • Two-Stage LLM Analysis (per check, when not in cache):
      • Stage 1 - Detection: Constructs a check-specific prompt asking the LLM to analyze for that issue
      • Runs inference using llama.cpp to identify the issue
      • Stage 2 - Solution: If issue detected, makes a second LLM call to:
        • Explain why the code has this issue
        • Propose specific optimization strategies
        • Provide optimized code examples
      • Cache Storage: Stores analysis results in SQLite with composite key (function_hash, check_key)
  6. Reporting: Displays findings grouped by function, showing all detected issues with solutions

Caching Benefits

The intelligent caching system provides significant benefits:

  • Speed: Instant results for unchanged functions (no LLM calls needed)
  • Cost: Saves computation time on repeated analyses
  • Consistency: Same function always gets same analysis (deterministic)
  • Automatic Invalidation: Cache key is based on function source code hash - any code change automatically invalidates cache entry
  • Persistent: Cache survives across runs (stored in .loopsleuth_cache/ by default)
  • Zero Configuration: Works automatically - just run the tool

Example speed improvement:

  • First run on 100 functions with 8 checks: ~40-60 minutes
  • Second run (all cached): ~10-20 seconds
  • Incremental run (95% cached): ~2-5 minutes
  • Single check (quadratic only): ~5-8 minutes first run, instant when cached

Cache behavior:

  • Results cached per (function, check) combination
  • Functions identified by SHA256 hash of source code
  • Changing even a single character in a function invalidates its cache entries for all checks
  • Cache automatically migrates from old single-check schema to new multi-check schema
  • Cache is stored in SQLite database (.loopsleuth_cache/analysis_cache.db)
  • Cache statistics shown in summary: "๐Ÿ’พ Cache entries: X (expected: Y = N functions ร— M checks), Z with issues"

Common Patterns Detected

Performance Issues

  • Quadratic complexity: Nested loops, repeated linear operations
  • Linear-in-loop: x in list, .remove(), .index(), .pop(0) in loops
  • N+1 problem: File I/O, network calls, model loading in loops
  • Expensive sort keys: O(n) key functions in sorting
  • Unbounded allocations: String concatenation, repeated concatenation in loops
  • Growing containers: Appending to lists while iterating

ML-Specific Issues

  • Conversion churn: Repeated .cpu(), .cuda(), .numpy() conversions
  • ML anti-patterns: Repeated tokenization, mask rebuilding, Python loops over tensors

Model Recommendations

Model Size Speed Accuracy Best For
Qwen2.5-Coder (3B) โญ ~2GB Fast Excellent Recommended - Code-specific training
Devstral Small 2 (24B) ~15GB Slower Excellent Production, very detailed analysis
Qwen2.5 (3B) ~2GB Fast Good General purpose
Qwen2.5 (0.5B) ~400MB Very Fast Fair Quick checks, testing

Performance

  • Model loading: ~1-3 seconds (depending on model size)
  • Per-function, per-check analysis (2 LLM calls when issue detected):
    • Detection: ~2-5 seconds
    • Solution proposal: ~3-8 seconds
    • Cached retrieval: <10ms (instant!)
  • Running all 8 checks: ~8x time compared to single check (but only on first run - subsequent runs use cache)
  • The tool processes functions sequentially to manage memory
  • Larger models (24B) provide more detailed and accurate analysis but require more RAM
  • Cache dramatically improves repeated runs: Second analysis on same codebase is ~100x faster
  • Tip: Use --checks to run only the checks you need for faster first-time analysis

Troubleshooting

Large Functions

Symptoms: "Function too large" warnings for very large functions (>500 lines)

Solution: Increase context size to accommodate larger functions

loopsleuth --context-size 8192 -m ~/.loopsleuth/models/qwen*.gguf ./code

Or skip analyzing extremely large functions:

loopsleuth --skip-large 300 -m ~/.loopsleuth/models/qwen*.gguf ./code

Slow Analysis

Symptoms: Takes a while to analyze many functions

This is normal:

  • Each function requires 2 LLM calls per check (detection + solution) if issue found
  • With all 8 checks: expect ~40-80 seconds per function on first run (depending on issues found)
  • With single check: expect ~5-10 seconds per function with 3B model
  • Progress bar shows real-time status with check name and function name
  • Second run is instant if code hasn't changed (cache hit)

To speed up:

  • Use --checks to run only needed checks (e.g., --checks quadratic,linear-in-loop)
  • Use --exclude to skip ML-specific checks if not relevant
  • Use smaller models (Qwen2.5-0.5B) for faster analysis at cost of accuracy
  • Use --skip-large to skip very large functions
  • Let the cache work - subsequent runs are ~100x faster

Out of Memory

Symptoms: System runs out of RAM (rare with default settings)

Solutions:

  • Use smaller model (Qwen2.5-0.5B instead of 3B)
  • Close other memory-intensive applications

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

loopsleuth-0.1.0.tar.gz (60.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

loopsleuth-0.1.0-cp314-cp314-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.14Windows x86-64

loopsleuth-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.0-cp314-cp314-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

loopsleuth-0.1.0-cp313-cp313-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.13Windows x86-64

loopsleuth-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.0-cp313-cp313-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

loopsleuth-0.1.0-cp312-cp312-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.12Windows x86-64

loopsleuth-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.0-cp312-cp312-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

loopsleuth-0.1.0-cp311-cp311-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.11Windows x86-64

loopsleuth-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.0-cp311-cp311-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

loopsleuth-0.1.0-cp310-cp310-win_amd64.whl (3.5 MB view details)

Uploaded CPython 3.10Windows x86-64

loopsleuth-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

loopsleuth-0.1.0-cp310-cp310-macosx_11_0_arm64.whl (3.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file loopsleuth-0.1.0.tar.gz.

File metadata

  • Download URL: loopsleuth-0.1.0.tar.gz
  • Upload date:
  • Size: 60.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.0.tar.gz
Algorithm Hash digest
SHA256 682d8dfd43684452ce9b01fc435ccf8e5a46537b5c5112abe2cb78de18a928e0
MD5 40314a8b65092f597328326999a6278f
BLAKE2b-256 f4d03bb8fc073454e949b2cf09e348e5a2f4e343d9c89762dc328cacf8ff9b22

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0.tar.gz:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f0a0cd4a9d81a2ba0d848e164d417c966d1a3e5e0259c412b44baf74d0d906d0
MD5 d36382ca28ac59640571fb0996fe56d5
BLAKE2b-256 fd1fdfe925a2bd3fd10b62c8ee188fead6dcf8619d096afd0db3137130b8da4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 98bb376be6afd8d037320189dcf7434b8df8395affd5e18bb127049c37378f4a
MD5 5965f852c352e80c07b8d4210fd1013c
BLAKE2b-256 b0bdf778a883a535970287c1b5a3ef5d6dc11cf8255539ee5b174921c239c37b

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 447c33b9e1a96a57fcaff442272731f1df5e30aecc498caf20d7ea2a1b386be7
MD5 e51b0fb797a92a75a023045eadb7c12d
BLAKE2b-256 fb0b63ce6c67b8221f33d9f580326ade6dab45f09fea8dbbacf2c6716b4eb73f

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f71296b8b1d09580b16a44c368a805c4e063c575d31dfcb3837717b083d71ee6
MD5 7e185011bb30b47df264c3b91a5e5e65
BLAKE2b-256 cef96a2f909fd21c32b98f404424eb95d03a185a802eb0a5d826be333556aeb5

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 68348f44a9650075f3ebf9936d96c9157f4dfea7a9e7f20427724f77b9d6d449
MD5 834152beb86c4564dc469ac82b421a6e
BLAKE2b-256 a8a12f625988b2b4d4f9c84de8a09b272246c3b74c87e1c4f387bbd82f781c07

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 93efff76c70a46670d6f8b5260b388daabf36884e49143306e2b0d4d87423d17
MD5 f35462b5f47c9893f41ae7bf2eb2b35e
BLAKE2b-256 94e1929ddab0fe955539c469ed87cd53152cb126917ffbc98d1e0687425ca3ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d4d352761407224f304ae49e2753a422fd54d004cc1539f7bcb353574a4b92c9
MD5 c0b44fe894bd10918df629b613044864
BLAKE2b-256 5b8d5ece5cbe54ead1041f45bd4f93861fbe0d6e6e179f129d888a200d1c723d

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9a815893f0e51300b75b0673db781ac918e4fd14a9db9dd624bb8931680e483e
MD5 71354132ab30cceb59196442dfe5ef4d
BLAKE2b-256 6f9942bd82677b052c4033dbb3b34610f515ec8ed39c233ff6d8bcc28a36a557

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a98d1b967df04cad016f4b2f80c1f4617ef5a9a2b9337015ba2c7d12a1017c3a
MD5 875acdf30db2a71b65f644939a8927cd
BLAKE2b-256 0eedab0bf784cb5d3942f6d83bb534175bfaca35c736e920891ec2f2ca3f3620

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ba74e3e260e19f542a758af3ba8181ffcf51066616143332309b7695cfe5906c
MD5 8ec2c792795f1fa0ef22bd230a0dbef8
BLAKE2b-256 da5d2d3b3ada4195add9787ec80ce316fd4124d4fb5a89279b189dce66622976

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8619fa656d4e5282da771568fa3652f3779bebb9748f7a1840b8e7c40ee149a9
MD5 daeff0be6cfcc5e266ef08683b0791d7
BLAKE2b-256 d1fea7b12d3a98132f112a12bfec07e61e442592e840e51df1ea354fa17f170c

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3335823eaa29845755ebe8d1e7442451ee733eab09b08fb3c24ab6736b998c06
MD5 10813cc08ed2f7d418befedba10b7d54
BLAKE2b-256 5cf324957be4aa04287fe3b9555a4d682b7732bd4a01d0881ba5ca6dba5ee6cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: loopsleuth-0.1.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for loopsleuth-0.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dd937507154b878e3916e8fae0ae8c9ea416d9bde7a6b90f9f43dcff0811a759
MD5 f9d7cfefa633a7c0acb60af6a1a44855
BLAKE2b-256 b93f8891a8bd4f80cea1ae9d5c87609d09447403ec43e151992b0e2cc9937688

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fba235a31a7ab1794027e35fc5843df57aec5e1d668d9e906848c394de9760a0
MD5 3fcc64df27e8881c32eb559177fee827
BLAKE2b-256 c8c5f3718eb53d5424eb32b67943b473a4e04912431c40b0ad7f1ad54b4d886b

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loopsleuth-0.1.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for loopsleuth-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a9aaceadf2de87c0a8033d41b6291ea86206e2b6fd8b9521d68fd2ad136b360
MD5 f7cae8daca266fedfbd40b5233a70b48
BLAKE2b-256 907bc8abf20db00d9fdec88a0329340d9a77ceadea0936fe7f09eda87cbc2aab

See more details on using hashes here.

Provenance

The following attestation bundles were made for loopsleuth-0.1.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on tarekziade/loopsleuth

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page