Python bindings for infiniloom - Repository context engine for LLMs
Project description
Infiniloom Python Bindings
Python bindings for Infiniloom - a repository context engine for Large Language Models.
Installation
pip install infiniloom
Building from Source
git clone https://github.com/Topos-Labs/infiniloom.git
cd infiniloom/bindings/python
pip install maturin
maturin develop # For development
maturin build --release # For production wheel
Quick Start
Functional API
import infiniloom
# Pack a repository into Claude-optimized XML
context = infiniloom.pack("/path/to/repo", format="xml", model="claude")
print(context)
# Scan repository and get statistics
stats = infiniloom.scan("/path/to/repo")
print(f"Files: {stats['total_files']}")
print(f"Languages: {stats['languages']}")
# Count tokens for a specific model
tokens = infiniloom.count_tokens("Hello, world!", model="claude")
print(f"Tokens: {tokens}")
Object-Oriented API
from infiniloom import Infiniloom
# Create an Infiniloom instance
loom = Infiniloom("/path/to/repo")
# Get repository statistics
stats = loom.stats()
print(stats)
# Generate repository context
context = loom.pack(format="xml", model="claude", compression="balanced")
# Get repository map with important symbols
repo_map = loom.map(map_budget=2000, max_symbols=50)
for symbol in repo_map['key_symbols']:
print(f"{symbol['name']} ({symbol['kind']}) in {symbol['file']}")
# Scan for security issues
findings = loom.scan_security()
for finding in findings:
print(f"{finding['severity']}: {finding['message']} at {finding['file']}:{finding['line']}")
# List all files
files = loom.files()
for file in files:
print(f"{file['path']} - {file['language']} ({file['tokens']} tokens)")
API Reference
Functions
pack(path, format="xml", model="claude", compression="balanced", map_budget=2000, max_symbols=50)
Pack a repository into an LLM-optimized format.
Parameters:
path(str): Path to the repositoryformat(str): Output format - "xml", "markdown", "json", "yaml", "toon", or "plain"model(str): Target model for token counting. Supports:- OpenAI GPT-5.x: "gpt-5.2", "gpt-5.2-pro", "gpt-5.1", "gpt-5.1-mini", "gpt-5.1-codex", "gpt-5", "gpt-5-mini", "gpt-5-nano"
- OpenAI O-series: "o4-mini", "o3", "o3-mini", "o1", "o1-mini", "o1-preview"
- OpenAI GPT-4: "gpt-4o", "gpt-4o-mini", "gpt-4", "gpt-3.5-turbo"
- Anthropic: "claude" (default)
- Google: "gemini"
- Meta: "llama", "codellama"
- Others: "deepseek", "mistral", "qwen", "cohere", "grok"
compression(str): Compression level - "none", "minimal", "balanced", "aggressive", "extreme", "focused", "semantic"map_budget(int): Token budget for repository map (default: 2000)max_symbols(int): Maximum symbols to include (default: 50)
Returns: str - Formatted repository context
scan(path, include_hidden=False, respect_gitignore=True)
Scan a repository and return statistics.
Parameters:
path(str): Path to the repositoryinclude_hidden(bool): Include hidden files (default: False)respect_gitignore(bool): Respect .gitignore files (default: True)
Returns: dict - Repository statistics including:
name: Repository namepath: Absolute pathtotal_files: Number of filestotal_lines: Total lines of codetotal_tokens: Token counts for each modellanguages: Language breakdownbranch: Git branch (if available)commit: Git commit hash (if available)
count_tokens(text, model="claude")
Count tokens in text for a specific model.
Parameters:
text(str): Text to count tokens formodel(str): Target model. Supports all models listed above inpack(), including GPT-5.x series
Returns: int - Number of tokens (exact for OpenAI models via tiktoken, calibrated estimates for others)
semantic_compress(text, similarity_threshold=0.7, budget_ratio=0.5)
Compress text using semantic compression while preserving important content.
Parameters:
text(str): Text to compresssimilarity_threshold(float): Threshold for grouping similar chunks (0.0-1.0, default: 0.7). Note: Only affects output when built with "embeddings" feature.budget_ratio(float): Target size as ratio of original (0.0-1.0, default: 0.5). Lower values = more aggressive compression.
Returns: str - Compressed text
import infiniloom
long_text = "... your long text content ..."
compressed = infiniloom.semantic_compress(long_text, budget_ratio=0.3)
print(compressed)
scan_security(path)
Scan repository for security issues.
Parameters:
path(str): Path to the repository
Returns: list[dict] - List of security findings with:
file: File pathline: Line numberseverity: Severity level ("Critical", "High", "Medium", "Low", "Info")kind: Type of finding (e.g., "aws_access_key", "github_token")pattern: The matched pattern
is_git_repo(path)
Check if a path is a git repository.
Parameters:
path(str): Path to check
Returns: bool - True if path is a git repository, False otherwise
from infiniloom import is_git_repo
if is_git_repo("/path/to/repo"):
print("This is a git repository")
Call Graph API
Query caller/callee relationships and navigate your codebase programmatically.
build_index(path, force=False, include_tests=False, max_file_size=None)
Build or update the symbol index for a repository (required for call graph queries).
Parameters:
path(str): Path to repository rootforce(bool): Force full rebuild even if index exists (default: False)include_tests(bool): Include test files in index (default: False)max_file_size(int): Maximum file size to index in bytes (default: 10MB)
Returns: dict - Index status with exists, file_count, symbol_count, last_built (ISO 8601 timestamp), version
import infiniloom
status = infiniloom.build_index("/path/to/repo")
print(f"Indexed {status['symbol_count']} symbols")
find_symbol(path, name)
Find symbols by name in the index.
Parameters:
path(str): Path to repository rootname(str): Symbol name to search for
Returns: list[dict] - List of matching symbols with id, name, kind, file, line, end_line, signature, visibility
import infiniloom
infiniloom.build_index("/path/to/repo")
symbols = infiniloom.find_symbol("/path/to/repo", "process_request")
for s in symbols:
print(f"{s['name']} ({s['kind']}) at {s['file']}:{s['line']}")
get_callers(path, symbol_name)
Get all functions/methods that call the target symbol.
Parameters:
path(str): Path to repository rootsymbol_name(str): Name of the symbol to find callers for
Returns: list[dict] - List of symbols that call the target
import infiniloom
infiniloom.build_index("/path/to/repo")
callers = infiniloom.get_callers("/path/to/repo", "authenticate")
print(f"authenticate is called by {len(callers)} functions")
for c in callers:
print(f" {c['name']} at {c['file']}:{c['line']}")
get_callees(path, symbol_name)
Get all functions/methods that the target symbol calls.
Parameters:
path(str): Path to repository rootsymbol_name(str): Name of the symbol to find callees for
Returns: list[dict] - List of symbols that the target calls
import infiniloom
infiniloom.build_index("/path/to/repo")
callees = infiniloom.get_callees("/path/to/repo", "main")
print(f"main calls {len(callees)} functions")
get_references(path, symbol_name)
Get all references to a symbol (calls, imports, inheritance).
Parameters:
path(str): Path to repository rootsymbol_name(str): Name of the symbol to find references for
Returns: list[dict] - List of references with symbol (dict) and kind (str)
import infiniloom
infiniloom.build_index("/path/to/repo")
refs = infiniloom.get_references("/path/to/repo", "UserService")
for r in refs:
print(f"{r['kind']}: {r['symbol']['name']} at {r['symbol']['file']}:{r['symbol']['line']}")
get_call_graph(path, max_nodes=None, max_edges=None)
Get the complete call graph with all symbols and call relationships.
Parameters:
path(str): Path to repository rootmax_nodes(int): Maximum number of nodes to return (default: unlimited)max_edges(int): Maximum number of edges to return (default: unlimited)
Returns: dict - Call graph with nodes (list), edges (list), stats (dict)
import infiniloom
infiniloom.build_index("/path/to/repo")
graph = infiniloom.get_call_graph("/path/to/repo")
print(f"{graph['stats']['total_symbols']} symbols, {graph['stats']['total_calls']} calls")
# Find most called functions
from collections import Counter
call_counts = Counter(edge['callee'] for edge in graph['edges'])
print("Most called:", call_counts.most_common(5))
Async versions
All call graph functions have async versions:
find_symbol_async(path, name)get_callers_async(path, symbol_name)get_callees_async(path, symbol_name)get_references_async(path, symbol_name)get_call_graph_async(path, max_nodes=None, max_edges=None)
import asyncio
import infiniloom
async def analyze_codebase():
await infiniloom.build_index_async("/path/to/repo")
callers = await infiniloom.get_callers_async("/path/to/repo", "authenticate")
print(f"Found {len(callers)} callers")
asyncio.run(analyze_codebase())
index_status(path)
Get the status of an existing index.
Parameters:
path(str): Path to repository root
Returns: dict - Index status with exists, file_count, symbol_count, last_built (ISO 8601 timestamp), version
import infiniloom
status = infiniloom.index_status("/path/to/repo")
if status["exists"]:
print(f"Index has {status['symbol_count']} symbols")
else:
print("No index found - run build_index first")
Chunking API
Split large repositories into manageable chunks for multi-turn LLM conversations.
chunk(path, strategy="module", max_tokens=8000, overlap=0, model="claude", priority_first=False)
Split repository into chunks for processing with limited context windows.
Parameters:
path(str): Path to repository rootstrategy(str): Chunking strategy - "fixed", "file", "module", "symbol", "semantic", "dependency"max_tokens(int): Maximum tokens per chunk (default: 8000)overlap(int): Token overlap between chunks (default: 0)model(str): Target model for token counting (default: "claude")priority_first(bool): Sort chunks by file priority (default: False)
Returns: list[dict] - List of chunks with index, total, focus, tokens, files, content
import infiniloom
# Split large repo into manageable chunks
chunks = infiniloom.chunk("/path/to/large-repo", strategy="module", max_tokens=50000)
for c in chunks:
print(f"Chunk {c['index']+1}/{c['total']}: {c['focus']} ({c['tokens']} tokens)")
# Send c['content'] to LLM for analysis
# Use dependency-aware chunking for better context
chunks = infiniloom.chunk("/path/to/repo", strategy="dependency", priority_first=True)
Strategies:
fixed: Split at fixed token boundariesfile: One file per chunkmodule: Group by module/directorysymbol: Group by symbol (function/class)semantic: Group by semantic similaritydependency: Group by dependency relationships
Impact Analysis API
Analyze the impact of changes to understand what code is affected.
analyze_impact(path, files, depth=2, include_tests=False, model=None, exclude=None, include=None)
Analyze the impact of changes to files or symbols.
Parameters:
path(str): Path to repository rootfiles(list[str]): List of files to analyzedepth(int): Depth of dependency traversal (1-3, default: 2)include_tests(bool): Include test files in analysis (default: False)model(str, optional): Target model for token counting (default: "claude")exclude(list[str], optional): Glob patterns to exclude (e.g., ["/*.test.py", "dist/"])include(list[str], optional): Glob patterns to include (e.g., ["src/**/*.py"])
Returns: dict - Impact analysis with:
changed_files: List of files being analyzeddependent_files: Files that depend on changed filestest_files: Related test filesaffected_symbols: List of affected symbols with name, kind, file, line, impact_typeimpact_level: Impact severity ("low", "medium", "high", "critical")summary: Human-readable summary
import infiniloom
# Build index first
infiniloom.build_index("/path/to/repo")
# Analyze impact of changing a file
impact = infiniloom.analyze_impact("/path/to/repo", ["src/auth.py"])
print(f"Impact level: {impact['impact_level']}")
print(f"Summary: {impact['summary']}")
# See what else needs updating
for dep in impact['dependent_files']:
print(f" Dependent: {dep}")
for sym in impact['affected_symbols']:
print(f" {sym['impact_type']}: {sym['name']} in {sym['file']}")
Diff Context API
Get semantic context around code changes for AI-powered code review.
get_diff_context(path, from_ref="", to_ref="HEAD", depth=2, budget=50000, include_diff=False, model=None, exclude=None, include=None)
Get context-aware diff with surrounding symbols and dependencies.
Parameters:
path(str): Path to repository rootfrom_ref(str): Starting ref - "" for unstaged, "HEAD" for staged, commit hash, branch nameto_ref(str): Ending ref - "HEAD", commit hash, branch namedepth(int): Context expansion depth (1-3, default: 2)budget(int): Token budget for context (default: 50000)include_diff(bool): Include actual diff content (default: False)model(str, optional): Target model for token counting (default: "claude")exclude(list[str], optional): Glob patterns to exclude (e.g., ["/*.test.py", "dist/"])include(list[str], optional): Glob patterns to include (e.g., ["src/**/*.py"])
Returns: dict - Diff context with:
changed_files: List of changed files with path, change_type, additions, deletions, diff (if requested)context_symbols: Related symbols with name, kind, file, line, reason, signaturerelated_tests: List of related test file pathstotal_tokens: Estimated token count
import infiniloom
# Build index for full context (optional but recommended)
infiniloom.build_index("/path/to/repo")
# Get context for uncommitted changes
context = infiniloom.get_diff_context("/path/to/repo")
print(f"Changed: {len(context['changed_files'])} files")
# Get context for last commit with diff content
context = infiniloom.get_diff_context(
"/path/to/repo",
from_ref="HEAD~1",
to_ref="HEAD",
include_diff=True
)
for f in context['changed_files']:
print(f"{f['change_type']}: {f['path']}")
if 'diff' in f:
print(f['diff'])
# Get context for a PR (branch comparison)
context = infiniloom.get_diff_context(
"/path/to/repo",
from_ref="main",
to_ref="feature-branch",
depth=3
)
print(f"Related symbols: {len(context['context_symbols'])}")
print(f"Related tests: {len(context['related_tests'])}")
Classes
Infiniloom(path)
Object-oriented interface for repository analysis.
Methods:
load(include_hidden=False, respect_gitignore=True)
Load the repository into memory.
stats()
Get repository statistics. Returns same structure as scan() function.
pack(format="xml", model="claude", compression="balanced", map_budget=2000)
Pack the repository. Returns formatted string.
map(map_budget=2000, max_symbols=50)
Get repository map with key symbols. Returns dict with:
summary: Text summarytoken_count: Estimated tokenskey_symbols: List of important symbols
scan_security()
Scan for security issues. Returns list of findings.
files()
Get list of all files. Returns list of dicts with file metadata.
GitRepo(path)
Git repository wrapper for accessing git operations like status, diff, log, and blame.
Constructor:
path(str): Path to the git repository
Raises: InfiniloomError if path is not a git repository
Methods:
current_branch()
Get the current branch name.
Returns: str - Current branch name (e.g., "main", "feature/xyz")
current_commit()
Get the current commit hash.
Returns: str - Full SHA-1 hash of HEAD commit (40 characters)
status()
Get working tree status (both staged and unstaged changes).
Returns: list[dict] - List of file status objects with:
path: File pathstatus: Status type ("Added", "Modified", "Deleted", "Renamed", "Copied", "Unknown")old_path: Old path for renames (optional)
log(count=10)
Get recent commits.
Parameters:
count(int): Maximum number of commits to return (default: 10)
Returns: list[dict] - List of commit objects with:
hash: Full commit hashshort_hash: Short commit hash (7 characters)author: Author nameemail: Author emaildate: Commit date (ISO 8601 format)message: Commit message (first line)
file_log(path, count=10)
Get commits that modified a specific file.
Parameters:
path(str): File path relative to repo rootcount(int): Maximum number of commits to return (default: 10)
Returns: list[dict] - List of commits that modified the file
blame(path)
Get blame information for a file.
Parameters:
path(str): File path relative to repo root
Returns: list[dict] - List of blame line objects with:
commit: Commit hash that introduced the lineauthor: Author who wrote the linedate: Date when line was writtenline_number: Line number (1-indexed)
ls_files()
Get list of files tracked by git.
Returns: list[str] - Array of file paths tracked by git
diff_files(from_ref, to_ref)
Get files changed between two commits.
Parameters:
from_ref(str): Starting commit/branch/tagto_ref(str): Ending commit/branch/tag
Returns: list[dict] - List of changed files with:
path: File pathstatus: Status ("Added", "Modified", "Deleted", "Renamed", "Copied")additions: Number of lines addeddeletions: Number of lines deleted
uncommitted_diff(path)
Get diff content for uncommitted changes in a file.
Parameters:
path(str): File path relative to repo root
Returns: str - Unified diff content
all_uncommitted_diffs()
Get diff for all uncommitted changes.
Returns: str - Combined unified diff for all changed files
has_changes(path)
Check if a file has uncommitted changes.
Parameters:
path(str): File path relative to repo root
Returns: bool - True if file has changes
last_modified_commit(path)
Get the last commit that modified a file.
Parameters:
path(str): File path relative to repo root
Returns: dict - Commit information object
file_change_frequency(path, days=30)
Get file change frequency in recent days.
Parameters:
path(str): File path relative to repo rootdays(int): Number of days to look back (default: 30)
Returns: int - Number of commits that modified the file in the period
file_at_ref(path, git_ref)
Get file content at a specific git ref (commit, branch, tag).
Parameters:
path(str): File path relative to repo rootgit_ref(str): Git ref (commit hash, branch name, tag, HEAD~n, etc.)
Returns: str - File content
repo = GitRepo("/path/to/repo")
old_version = repo.file_at_ref("src/main.py", "HEAD~5")
main_version = repo.file_at_ref("src/main.py", "main")
diff_hunks(from_ref, to_ref, path=None)
Parse diff between two refs into structured hunks with line-level changes. Useful for PR review tools that need to post comments at specific lines.
Parameters:
from_ref(str): Starting ref (e.g., "main", "HEAD~5", commit hash)to_ref(str): Ending ref (e.g., "HEAD", "feature-branch")path(str, optional): File path to filter to a single file
Returns: list[dict] - List of diff hunks with:
old_start: Starting line in old fileold_count: Number of lines in old filenew_start: Starting line in new filenew_count: Number of lines in new fileheader: Hunk headerlines: List of line dicts withchange_type,old_line,new_line,content
repo = GitRepo("/path/to/repo")
hunks = repo.diff_hunks("main", "HEAD", "src/index.py")
for hunk in hunks:
print(f"Hunk at old:{hunk['old_start']} new:{hunk['new_start']}")
for line in hunk['lines']:
print(f"{line['change_type']}: {line['content']}")
uncommitted_hunks(path=None)
Parse uncommitted changes (working tree vs HEAD) into structured hunks.
Parameters:
path(str, optional): File path to filter to a single file
Returns: list[dict] - List of diff hunks for uncommitted changes
staged_hunks(path=None)
Parse staged changes into structured hunks.
Parameters:
path(str, optional): File path to filter to a single file
Returns: list[dict] - List of diff hunks for staged changes only
Example:
from infiniloom import GitRepo, is_git_repo
# Check if path is a git repo first
if is_git_repo("/path/to/repo"):
repo = GitRepo("/path/to/repo")
# Get current state
print(f"Branch: {repo.current_branch()}")
print(f"Commit: {repo.current_commit()}")
# Get recent commits
for commit in repo.log(count=5):
print(f"{commit['short_hash']}: {commit['message']}")
# Get file history
for commit in repo.file_log("src/main.py", count=3):
print(f"{commit['date']}: {commit['message']}")
# Get blame information
for line in repo.blame("src/main.py")[:10]:
print(f"Line {line['line_number']}: {line['author']}")
# Check for uncommitted changes
if repo.has_changes("src/main.py"):
diff = repo.uncommitted_diff("src/main.py")
print(diff)
Async Functions
Infiniloom provides async versions of the main functions for use in async/await contexts. These use a thread pool executor to avoid blocking the event loop.
import asyncio
import infiniloom
async def main():
# Pack repository asynchronously
context = await infiniloom.pack_async("/path/to/repo", format="xml", model="claude")
# Scan repository asynchronously
stats = await infiniloom.scan_async("/path/to/repo")
# Count tokens asynchronously
tokens = await infiniloom.count_tokens_async("Hello, world!", model="claude")
# Scan security asynchronously
findings = await infiniloom.scan_security_async("/path/to/repo")
# Semantic compress asynchronously
compressed = await infiniloom.semantic_compress_async(long_text, budget_ratio=0.3)
asyncio.run(main())
Available Async Functions
pack_async(path, format="xml", model="claude", compression="balanced", ...)- Async packscan_async(path, include_hidden=False, respect_gitignore=True)- Async scancount_tokens_async(text, model="claude")- Async token countingscan_security_async(path)- Async security scanningsemantic_compress_async(text, similarity_threshold=0.7, budget_ratio=0.5)- Async compression
Formats
XML (Claude-optimized)
Best for Claude models. Uses XML structure that Claude understands well.
context = infiniloom.pack("/path/to/repo", format="xml", model="claude")
Markdown (GPT-optimized)
Best for GPT models. Uses Markdown with clear hierarchical structure.
context = infiniloom.pack("/path/to/repo", format="markdown", model="gpt")
JSON
Generic JSON format for programmatic processing.
context = infiniloom.pack("/path/to/repo", format="json")
YAML (Gemini-optimized)
Best for Gemini. Query should be placed at the end.
context = infiniloom.pack("/path/to/repo", format="yaml", model="gemini")
TOON (Token-Efficient)
Most token-efficient format (~40% smaller than JSON). Best for limited context windows.
context = infiniloom.pack("/path/to/repo", format="toon")
Compression Levels
- none: No compression (0% reduction)
- minimal: Remove empty lines, trim whitespace (15% reduction)
- balanced: Remove comments, normalize whitespace (35% reduction) - Default
- aggressive: Remove docstrings, keep signatures only (60% reduction)
- extreme: Key symbols only (80% reduction)
- focused: Key symbols with small context (75% reduction)
- semantic: Heuristic semantic compression (~60-70% reduction)
Integration Examples
With Anthropic Claude
import infiniloom
import anthropic
# Generate context
context = infiniloom.pack(
"/path/to/repo",
format="xml",
model="claude",
compression="balanced"
)
# Send to Claude
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=4096,
messages=[{
"role": "user",
"content": f"{context}\n\nExplain the architecture of this codebase."
}]
)
print(response.content[0].text)
With OpenAI GPT
import infiniloom
import openai
context = infiniloom.pack("/path/to/repo", format="markdown", model="gpt")
client = openai.OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"{context}\n\nWhat are the main components?"
}]
)
print(response.choices[0].message.content)
With Google Gemini
import infiniloom
import google.generativeai as genai
context = infiniloom.pack("/path/to/repo", format="yaml", model="gemini")
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content(f"{context}\n\nSummarize this codebase")
print(response.text)
Advanced Usage
Custom Token Budget
from infiniloom import Infiniloom
loom = Infiniloom("/large/repo")
# Generate smaller context for models with limited context windows
compact_map = loom.map(map_budget=1000, max_symbols=25)
# Generate larger context for models with large context windows
detailed_map = loom.map(map_budget=5000, max_symbols=200)
Security Scanning
from infiniloom import Infiniloom
loom = Infiniloom("/path/to/repo")
findings = loom.scan_security()
# Filter by severity
critical = [f for f in findings if f['severity'] == 'Critical']
high = [f for f in findings if f['severity'] == 'High']
print(f"Critical: {len(critical)}, High: {len(high)}")
for finding in critical:
print(f"{finding['file']}:{finding['line']}")
print(f" {finding['category']}: {finding['message']}")
File Filtering
from infiniloom import Infiniloom
loom = Infiniloom("/path/to/repo")
files = loom.files()
# Get Python files only
python_files = [f for f in files if f['language'] == 'python']
# Get high-importance files
important_files = [f for f in files if f['importance'] > 0.7]
# Get large files
large_files = [f for f in files if f['tokens'] > 1000]
Performance
Infiniloom is built in Rust for maximum performance:
- Fast scanning: Parallel file processing with ignore patterns
- Memory efficient: Streaming processing, optional content loading
- Native speed: No Python overhead for core operations
Requirements
- Python 3.8+
- Rust 1.91+ (for building from source)
License
MIT License - see LICENSE for details.
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file infiniloom-0.4.10.tar.gz.
File metadata
- Download URL: infiniloom-0.4.10.tar.gz
- Upload date:
- Size: 368.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f158800523df1e055d93f558ce5b009ce26a847c9da12fc5ed0a4ad83a906ee8
|
|
| MD5 |
ac03b58fc85d32e203b6b0a5c6d85cdf
|
|
| BLAKE2b-256 |
9ab4f76fd5f62a40aa26a22ec263223ae3bf958a98ac90f6c56de2d0cb9fba55
|
File details
Details for the file infiniloom-0.4.10-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: infiniloom-0.4.10-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 8.1 MB
- Tags: PyPy, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4aeba9fccd27c5b1bee527f7da64700ad63b6dbe8a5150c84fb35d97e123dd01
|
|
| MD5 |
b414137dfabfb8d60f39a48e4ab29571
|
|
| BLAKE2b-256 |
1f971a2f5488c5dbc91efcc2807cb7e715bc860abdf540e9cef3d6c7a5b8be04
|
File details
Details for the file infiniloom-0.4.10-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: infiniloom-0.4.10-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 8.1 MB
- Tags: PyPy, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa4363fd0baaceded3ca1018062db7b163477d4ca46c7fb4341123451fd93ccc
|
|
| MD5 |
56c32cc9376d0c0cbd397479ba1674f5
|
|
| BLAKE2b-256 |
d4a970a8dbf0a2dc976e0f1d85f6f61053edb5c65ab7d0f5d8ac20ea1683fa35
|
File details
Details for the file infiniloom-0.4.10-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: infiniloom-0.4.10-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 8.1 MB
- Tags: PyPy, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
debdaee1b5e3552ce71fb7bc292040b48ec39d115e4374a482699063f4fd8fac
|
|
| MD5 |
72375d0c54a7b884327da66e5e22816e
|
|
| BLAKE2b-256 |
60bb600bb711bc7001d63b85eb0858b9ebbcae0dbbb14a4a6ee40dbeb250734b
|
File details
Details for the file infiniloom-0.4.10-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: infiniloom-0.4.10-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 8.1 MB
- Tags: PyPy, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de06d570ef690882107c2aba43da73849bd5c2aa650923f10857254048468766
|
|
| MD5 |
8fe9affdbaa31c670d515bcb86fb5411
|
|
| BLAKE2b-256 |
5d9026654e7f44ed889e7599e8e122003acdb881ad46033d9a328b3d5f3011ae
|
File details
Details for the file infiniloom-0.4.10-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: infiniloom-0.4.10-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 8.2 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7323b2191a9ca3aa85d0d62563d42ba320ec6e2e5ab0d075f2f42e41dfa2765a
|
|
| MD5 |
70bc7b76d46caad137cd103585a682b9
|
|
| BLAKE2b-256 |
78e05ad8438bd39caa887eecb3e854ca7bf63bb006cf52ec7e9e5de011debc7f
|
File details
Details for the file infiniloom-0.4.10-cp38-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: infiniloom-0.4.10-cp38-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 8.1 MB
- Tags: CPython 3.8+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ba8dda2d1641b016bfa7378bcd91087b3961acbc10e29245284378fdae3dd8a
|
|
| MD5 |
1a3a0d54e896dee23e0dfd54d971e1bc
|
|
| BLAKE2b-256 |
a3975cdd652d1fdcef17c74a3ca27783fb2e88ded9e73dac1956f0f41fc751e4
|
File details
Details for the file infiniloom-0.4.10-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: infiniloom-0.4.10-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 8.3 MB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a6cd013d5e1f92597fda049c87925edd70691b9cf734c263393dd8ce932b01c
|
|
| MD5 |
adabcbdb1fbf7c186f2458345da87381
|
|
| BLAKE2b-256 |
ae89abd802c0fb6ee3e95009bdf75a8fb3e0a116f5889d9c3785177a679fe43a
|
File details
Details for the file infiniloom-0.4.10-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: infiniloom-0.4.10-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 8.3 MB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
abf6556ef0a9cfe3df13a9719a1a4c3d2ee2923004ab18223706e99f560f8d35
|
|
| MD5 |
d42854b8a021a69602cf8875befa754d
|
|
| BLAKE2b-256 |
2c5a2bfce6afa2ea8f198cbb338714927385e728315dcb322802b3cfe44d3a50
|
File details
Details for the file infiniloom-0.4.10-cp38-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: infiniloom-0.4.10-cp38-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 8.2 MB
- Tags: CPython 3.8+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4931ffa2f0eeb28c3fc380f9f64949645ac7068453ff44f74f334b98f5652c29
|
|
| MD5 |
d2bbf3ab141527c7955a72810b08fec3
|
|
| BLAKE2b-256 |
07b14e8cd491d0256181b52a728295a1d5781ab41070d14e078ebb83e8ea278a
|