pyrustor


Namepyrustor JSON
Version 0.1.18 PyPI version JSON
download
home_pagehttps://github.com/loonghao/PyRustor
SummaryA high-performance Python code parsing and refactoring tool written in Rust
upload_time2025-08-04 03:54:06
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords python parser refactoring ast code-analysis rust
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            # PyRustor

[![PyPI version](https://img.shields.io/pypi/v/pyrustor.svg)](https://pypi.org/project/pyrustor/)
[![PyPI downloads](https://img.shields.io/pypi/dm/pyrustor.svg)](https://pypi.org/project/pyrustor/)
[![Python versions](https://img.shields.io/pypi/pyversions/pyrustor.svg)](https://pypi.org/project/pyrustor/)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Rust](https://img.shields.io/badge/rust-1.87+-orange.svg)](https://www.rust-lang.org)
[![CI](https://github.com/loonghao/PyRustor/workflows/CI/badge.svg)](https://github.com/loonghao/PyRustor/actions)

English | [δΈ­ζ–‡](README_zh.md)

A **blazingly fast** Python code parsing and refactoring tool written in Rust with Python bindings.

## πŸš€ Features

### 🌟 **Core Advantages**

- **⚑ Superior Performance**: Built on Ruff's blazing-fast Python parser - 10-100x faster than traditional Python tools
- **πŸ”„ Python AST Parsing**: Parse Python code into AST for analysis using Ruff's proven parsing engine
- **πŸ› οΈ Code Refactoring**: Rename functions, classes, modernize syntax
- **🧡 Safe Concurrency**: Built with Rust's fearless concurrency
- **🐍 Python Bindings**: Easy-to-use Python API

### πŸŽ›οΈ **Refactoring Operations**

- **Function Renaming**: Rename functions throughout codebase
- **Class Renaming**: Rename classes and update references
- **Import Modernization**: Update deprecated imports to modern alternatives
- **Syntax Modernization**: Convert old Python syntax to modern patterns
- **Custom Transformations**: Apply custom AST transformations

## πŸš€ Quick Start

```bash
pip install pyrustor
```

```python
import pyrustor

# Parse Python code
parser = pyrustor.Parser()
ast = parser.parse_string("def hello(): pass")

# Create refactor instance
refactor = pyrustor.Refactor(ast)
refactor.rename_function("hello", "greet")

# Get the modified code
result = refactor.get_code()
print(result)  # def greet(): pass
```

### ✨ Key Features Demonstration

```python
import pyrustor

# 1. Function and Class Renaming
code = '''
def old_function(x, y):
    return x + y

class OldClass:
    def method(self):
        return old_function(1, 2)
'''

parser = pyrustor.Parser()
ast = parser.parse_string(code)
refactor = pyrustor.Refactor(ast)

# Rename function and class
refactor.rename_function("old_function", "new_function")
refactor.rename_class("OldClass", "NewClass")

print("Refactored code:")
print(refactor.get_code())

# 2. Import Modernization
legacy_code = '''
import ConfigParser
import imp
from urllib2 import urlopen
'''

ast2 = parser.parse_string(legacy_code)
refactor2 = pyrustor.Refactor(ast2)

# Modernize imports
refactor2.replace_import("ConfigParser", "configparser")
refactor2.replace_import("imp", "importlib")
refactor2.replace_import("urllib2", "urllib.request")

print("Modernized imports:")
print(refactor2.get_code())

# 3. Get detailed change information
print("Changes made:")
for change in refactor2.change_summary():
    print(f"  - {change}")
```

## πŸ“¦ Installation

### From PyPI (Recommended)

```bash
# Standard installation (Python version-specific wheels)
pip install pyrustor

# ABI3 installation (compatible with Python 3.8+)
pip install pyrustor --prefer-binary
```

### Prerequisites (Building from Source)

- Rust 1.87+ (for building from source)
- Python 3.8+
- maturin (for building Python bindings)

### Build from Source

```bash
# Clone the repository
git clone https://github.com/loonghao/PyRustor.git
cd PyRustor

# Install dependencies
just install

# Build the extension
just build
```

## πŸ”§ Usage Examples

### Basic Operations

```python
import pyrustor

# Parse Python code
parser = pyrustor.Parser()
ast = parser.parse_string("""
def old_function():
    return "Hello, World!"

class OldClass:
    pass
""")

# Create refactor instance
refactor = pyrustor.Refactor(ast)

# Rename function
refactor.rename_function("old_function", "new_function")

# Rename class
refactor.rename_class("OldClass", "NewClass")

# Get refactored code
print(refactor.get_code())
```

### File Operations

```python
import pyrustor

# Parse from file
parser = pyrustor.Parser()
ast = parser.parse_file("example.py")

# Apply refactoring
refactor = pyrustor.Refactor(ast)
refactor.modernize_syntax()

# Save to file
refactor.save_to_file("refactored_example.py")

# Get change summary
print(refactor.change_summary())
```

### Complete Refactoring Workflow

```python
import pyrustor

def modernize_legacy_code(source_code: str) -> str:
    """Complete workflow for modernizing legacy Python code."""
    parser = pyrustor.Parser()
    ast = parser.parse_string(source_code)
    refactor = pyrustor.Refactor(ast)

    # Step 1: Modernize imports
    refactor.replace_import("ConfigParser", "configparser")
    refactor.replace_import("urllib2", "urllib.request")
    refactor.replace_import("imp", "importlib")

    # Step 2: Rename outdated functions/classes
    refactor.rename_function("old_function", "new_function")
    refactor.rename_class("LegacyClass", "ModernClass")

    # Step 3: Apply syntax modernization
    refactor.modernize_syntax()

    # Step 4: Get the final result
    return refactor.get_code()

# Example usage
legacy_code = '''
import ConfigParser
import urllib2

def old_function():
    config = ConfigParser.ConfigParser()
    response = urllib2.urlopen("http://example.com")
    return response.read()

class LegacyClass:
    def __init__(self):
        self.data = old_function()
'''

modernized = modernize_legacy_code(legacy_code)
print("Modernized code:")
print(modernized)

# Get detailed change information
parser = pyrustor.Parser()
ast = parser.parse_string(legacy_code)
refactor = pyrustor.Refactor(ast)
refactor.replace_import("ConfigParser", "configparser")
refactor.rename_function("old_function", "new_function")

print("\nChanges made:")
for change in refactor.change_summary():
    print(f"  - {change}")
```

### Error Handling and Validation

```python
import pyrustor

def safe_refactor(code: str, old_name: str, new_name: str) -> tuple[str, bool]:
    """Safely refactor code with error handling."""
    try:
        parser = pyrustor.Parser()
        ast = parser.parse_string(code)
        refactor = pyrustor.Refactor(ast)

        # Attempt to rename function
        refactor.rename_function(old_name, new_name)

        return refactor.get_code(), True

    except Exception as e:
        print(f"Refactoring failed: {e}")
        return code, False  # Return original code if refactoring fails

# Example usage
code = "def hello(): pass"
result, success = safe_refactor(code, "hello", "greet")

if success:
    print("Refactoring successful:")
    print(result)
else:
    print("Refactoring failed, original code preserved")
```

### Advanced Refactoring

```python
import pyrustor

parser = pyrustor.Parser()
ast = parser.parse_string("""
import ConfigParser
from imp import reload

def format_string(name, age):
    return "Name: %s, Age: %d" % (name, age)
""")

refactor = pyrustor.Refactor(ast)

# Modernize imports
refactor.replace_import("ConfigParser", "configparser")
refactor.replace_import("imp", "importlib")

# Modernize syntax
refactor.modernize_syntax()

print(refactor.to_string())
print("Changes made:")
print(refactor.change_summary())
```

### Ruff Formatter Integration

```python
import pyrustor

# Messy code that needs refactoring and formatting
messy_code = '''def   old_function(  x,y  ):
    return x+y

class   OldClass:
    def __init__(self,name):
        self.name=name'''

parser = pyrustor.Parser()
ast = parser.parse_string(messy_code)
refactor = pyrustor.Refactor(ast)

# Refactor with automatic formatting
refactor.rename_function_with_format("old_function", "new_function", apply_formatting=True)
refactor.rename_class_with_format("OldClass", "NewClass", apply_formatting=True)

# Or apply formatting at the end
refactor.modernize_syntax()
formatted_result = refactor.refactor_and_format()

print("Beautifully formatted result:")
print(formatted_result)
```

### Building pyupgrade-style Tools

```python
import pyrustor

def modernize_python_code(source_code: str) -> str:
    """Build a pyupgrade-style modernization tool."""
    parser = pyrustor.Parser()
    ast = parser.parse_string(source_code)
    refactor = pyrustor.Refactor(ast)

    # Apply common modernizations
    refactor.replace_import("ConfigParser", "configparser")
    refactor.replace_import("urllib2", "urllib.request")
    refactor.modernize_syntax()  # % formatting -> f-strings, etc.

    # Return beautifully formatted result
    return refactor.refactor_and_format()

# Example usage
legacy_code = '''import ConfigParser
def greet(name):
    return "Hello, %s!" % name'''

modernized = modernize_python_code(legacy_code)
print(modernized)
# Output: Clean, modern Python code with f-strings and updated imports
```

## πŸ“š API Reference

### Parser Class

```python
parser = pyrustor.Parser()

# Parse from string
ast = parser.parse_string(source_code)

# Parse from file
ast = parser.parse_file("path/to/file.py")

# Parse directory
results = parser.parse_directory("path/to/dir", recursive=True)
```

### PythonAst Class

```python
# Check if AST is empty
if ast.is_empty():
    print("No code found")

# Get statistics
print(f"Statements: {ast.statement_count()}")
print(f"Functions: {ast.function_names()}")
print(f"Classes: {ast.class_names()}")
print(f"Imports: {ast.imports()}")

# Convert back to string
source_code = ast.to_string()
```

### Refactor Class

```python
refactor = pyrustor.Refactor(ast)

# Basic refactoring
refactor.rename_function("old_name", "new_name")
refactor.rename_class("OldClass", "NewClass")
refactor.replace_import("old_module", "new_module")

# Refactoring with automatic formatting
refactor.rename_function_with_format("old_name", "new_name", apply_formatting=True)
refactor.rename_class_with_format("OldClass", "NewClass", apply_formatting=True)
refactor.modernize_syntax_with_format(apply_formatting=True)

# Advanced refactoring
refactor.modernize_syntax()
refactor.modernize_imports()

# Formatting options
refactor.format_code()  # Apply Ruff formatting
formatted_result = refactor.refactor_and_format()  # Refactor + format in one step
conditional_format = refactor.to_string_with_format(apply_formatting=True)

# Get results
refactored_code = refactor.to_string()
changes = refactor.change_summary()

# Save to file
refactor.save_to_file("output.py")
```

## πŸ§ͺ Development

### Setup Development Environment

```bash
# Install just (command runner)
cargo install just

# Setup development environment
just dev

# Run tests
just test

# Format code
just format

# Run linting
just lint

# Build release
just release
```

### Testing

PyRustor has comprehensive test coverage with 257+ tests across Rust and Python components.

```bash
# Run all tests (Rust + Python)
just test

# Run specific test categories
just test-rust          # 91 Rust tests
just test-python        # 166 Python tests

# Run with coverage reporting
just coverage-all       # Generate coverage reports for both languages
just coverage-python    # Python coverage only
just coverage-rust      # Rust coverage only

# Run specific test types
pytest tests/ -m "unit"           # Unit tests only
pytest tests/ -m "integration"    # Integration tests only
pytest tests/ -m "benchmark"      # Performance benchmarks
pytest tests/ -m "not slow"       # Skip slow tests
```

#### Test Categories

- **Unit Tests**: Core functionality testing
- **Integration Tests**: End-to-end workflow testing
- **Edge Case Tests**: Boundary conditions and error handling
- **Performance Tests**: Benchmarking and regression detection
- **Unicode Tests**: International character support
- **Error Handling Tests**: Robust error recovery

#### Coverage Reports

After running coverage tests, view detailed reports:
- **Python**: `htmlcov/index.html`
- **Rust**: `target/tarpaulin/tarpaulin-report.html`

### Quality Assurance

```bash
# Run all quality checks
just check-all

# Individual quality checks
just quality            # Code quality analysis
just security           # Security vulnerability scanning
just performance        # Performance benchmarking
just docs-check         # Documentation validation

# CI-specific checks
just ci-check-all       # All checks optimized for CI
```

### Available Commands

```bash
just --list  # Show all available commands
```

## 🀝 Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Submit a pull request

## πŸ“„ License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## πŸ™ Acknowledgments

- [**Ruff**](https://github.com/astral-sh/ruff) - PyRustor is built on Ruff's high-performance Python AST parsing engine (`ruff_python_ast`). Ruff is an extremely fast Python linter and code formatter written in Rust, developed by [Astral](https://astral.sh). We leverage Ruff's proven parsing technology to deliver blazing-fast Python code analysis and refactoring capabilities.
- [PyO3](https://github.com/PyO3/pyo3) for excellent Python-Rust bindings
- [maturin](https://github.com/PyO3/maturin) for seamless Python package building


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/loonghao/PyRustor",
    "name": "pyrustor",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "python, parser, refactoring, ast, code-analysis, rust",
    "author": null,
    "author_email": "Hal <hal.long@outlook.com>",
    "download_url": "https://files.pythonhosted.org/packages/1c/1c/680f645265c6908f339a8cad2a39795eccda0e7ae540531f9495d84ecb58/pyrustor-0.1.18.tar.gz",
    "platform": null,
    "description": "# PyRustor\n\n[![PyPI version](https://img.shields.io/pypi/v/pyrustor.svg)](https://pypi.org/project/pyrustor/)\n[![PyPI downloads](https://img.shields.io/pypi/dm/pyrustor.svg)](https://pypi.org/project/pyrustor/)\n[![Python versions](https://img.shields.io/pypi/pyversions/pyrustor.svg)](https://pypi.org/project/pyrustor/)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Rust](https://img.shields.io/badge/rust-1.87+-orange.svg)](https://www.rust-lang.org)\n[![CI](https://github.com/loonghao/PyRustor/workflows/CI/badge.svg)](https://github.com/loonghao/PyRustor/actions)\n\nEnglish | [\u4e2d\u6587](README_zh.md)\n\nA **blazingly fast** Python code parsing and refactoring tool written in Rust with Python bindings.\n\n## \ud83d\ude80 Features\n\n### \ud83c\udf1f **Core Advantages**\n\n- **\u26a1 Superior Performance**: Built on Ruff's blazing-fast Python parser - 10-100x faster than traditional Python tools\n- **\ud83d\udd04 Python AST Parsing**: Parse Python code into AST for analysis using Ruff's proven parsing engine\n- **\ud83d\udee0\ufe0f Code Refactoring**: Rename functions, classes, modernize syntax\n- **\ud83e\uddf5 Safe Concurrency**: Built with Rust's fearless concurrency\n- **\ud83d\udc0d Python Bindings**: Easy-to-use Python API\n\n### \ud83c\udf9b\ufe0f **Refactoring Operations**\n\n- **Function Renaming**: Rename functions throughout codebase\n- **Class Renaming**: Rename classes and update references\n- **Import Modernization**: Update deprecated imports to modern alternatives\n- **Syntax Modernization**: Convert old Python syntax to modern patterns\n- **Custom Transformations**: Apply custom AST transformations\n\n## \ud83d\ude80 Quick Start\n\n```bash\npip install pyrustor\n```\n\n```python\nimport pyrustor\n\n# Parse Python code\nparser = pyrustor.Parser()\nast = parser.parse_string(\"def hello(): pass\")\n\n# Create refactor instance\nrefactor = pyrustor.Refactor(ast)\nrefactor.rename_function(\"hello\", \"greet\")\n\n# Get the modified code\nresult = refactor.get_code()\nprint(result)  # def greet(): pass\n```\n\n### \u2728 Key Features Demonstration\n\n```python\nimport pyrustor\n\n# 1. Function and Class Renaming\ncode = '''\ndef old_function(x, y):\n    return x + y\n\nclass OldClass:\n    def method(self):\n        return old_function(1, 2)\n'''\n\nparser = pyrustor.Parser()\nast = parser.parse_string(code)\nrefactor = pyrustor.Refactor(ast)\n\n# Rename function and class\nrefactor.rename_function(\"old_function\", \"new_function\")\nrefactor.rename_class(\"OldClass\", \"NewClass\")\n\nprint(\"Refactored code:\")\nprint(refactor.get_code())\n\n# 2. Import Modernization\nlegacy_code = '''\nimport ConfigParser\nimport imp\nfrom urllib2 import urlopen\n'''\n\nast2 = parser.parse_string(legacy_code)\nrefactor2 = pyrustor.Refactor(ast2)\n\n# Modernize imports\nrefactor2.replace_import(\"ConfigParser\", \"configparser\")\nrefactor2.replace_import(\"imp\", \"importlib\")\nrefactor2.replace_import(\"urllib2\", \"urllib.request\")\n\nprint(\"Modernized imports:\")\nprint(refactor2.get_code())\n\n# 3. Get detailed change information\nprint(\"Changes made:\")\nfor change in refactor2.change_summary():\n    print(f\"  - {change}\")\n```\n\n## \ud83d\udce6 Installation\n\n### From PyPI (Recommended)\n\n```bash\n# Standard installation (Python version-specific wheels)\npip install pyrustor\n\n# ABI3 installation (compatible with Python 3.8+)\npip install pyrustor --prefer-binary\n```\n\n### Prerequisites (Building from Source)\n\n- Rust 1.87+ (for building from source)\n- Python 3.8+\n- maturin (for building Python bindings)\n\n### Build from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/loonghao/PyRustor.git\ncd PyRustor\n\n# Install dependencies\njust install\n\n# Build the extension\njust build\n```\n\n## \ud83d\udd27 Usage Examples\n\n### Basic Operations\n\n```python\nimport pyrustor\n\n# Parse Python code\nparser = pyrustor.Parser()\nast = parser.parse_string(\"\"\"\ndef old_function():\n    return \"Hello, World!\"\n\nclass OldClass:\n    pass\n\"\"\")\n\n# Create refactor instance\nrefactor = pyrustor.Refactor(ast)\n\n# Rename function\nrefactor.rename_function(\"old_function\", \"new_function\")\n\n# Rename class\nrefactor.rename_class(\"OldClass\", \"NewClass\")\n\n# Get refactored code\nprint(refactor.get_code())\n```\n\n### File Operations\n\n```python\nimport pyrustor\n\n# Parse from file\nparser = pyrustor.Parser()\nast = parser.parse_file(\"example.py\")\n\n# Apply refactoring\nrefactor = pyrustor.Refactor(ast)\nrefactor.modernize_syntax()\n\n# Save to file\nrefactor.save_to_file(\"refactored_example.py\")\n\n# Get change summary\nprint(refactor.change_summary())\n```\n\n### Complete Refactoring Workflow\n\n```python\nimport pyrustor\n\ndef modernize_legacy_code(source_code: str) -> str:\n    \"\"\"Complete workflow for modernizing legacy Python code.\"\"\"\n    parser = pyrustor.Parser()\n    ast = parser.parse_string(source_code)\n    refactor = pyrustor.Refactor(ast)\n\n    # Step 1: Modernize imports\n    refactor.replace_import(\"ConfigParser\", \"configparser\")\n    refactor.replace_import(\"urllib2\", \"urllib.request\")\n    refactor.replace_import(\"imp\", \"importlib\")\n\n    # Step 2: Rename outdated functions/classes\n    refactor.rename_function(\"old_function\", \"new_function\")\n    refactor.rename_class(\"LegacyClass\", \"ModernClass\")\n\n    # Step 3: Apply syntax modernization\n    refactor.modernize_syntax()\n\n    # Step 4: Get the final result\n    return refactor.get_code()\n\n# Example usage\nlegacy_code = '''\nimport ConfigParser\nimport urllib2\n\ndef old_function():\n    config = ConfigParser.ConfigParser()\n    response = urllib2.urlopen(\"http://example.com\")\n    return response.read()\n\nclass LegacyClass:\n    def __init__(self):\n        self.data = old_function()\n'''\n\nmodernized = modernize_legacy_code(legacy_code)\nprint(\"Modernized code:\")\nprint(modernized)\n\n# Get detailed change information\nparser = pyrustor.Parser()\nast = parser.parse_string(legacy_code)\nrefactor = pyrustor.Refactor(ast)\nrefactor.replace_import(\"ConfigParser\", \"configparser\")\nrefactor.rename_function(\"old_function\", \"new_function\")\n\nprint(\"\\nChanges made:\")\nfor change in refactor.change_summary():\n    print(f\"  - {change}\")\n```\n\n### Error Handling and Validation\n\n```python\nimport pyrustor\n\ndef safe_refactor(code: str, old_name: str, new_name: str) -> tuple[str, bool]:\n    \"\"\"Safely refactor code with error handling.\"\"\"\n    try:\n        parser = pyrustor.Parser()\n        ast = parser.parse_string(code)\n        refactor = pyrustor.Refactor(ast)\n\n        # Attempt to rename function\n        refactor.rename_function(old_name, new_name)\n\n        return refactor.get_code(), True\n\n    except Exception as e:\n        print(f\"Refactoring failed: {e}\")\n        return code, False  # Return original code if refactoring fails\n\n# Example usage\ncode = \"def hello(): pass\"\nresult, success = safe_refactor(code, \"hello\", \"greet\")\n\nif success:\n    print(\"Refactoring successful:\")\n    print(result)\nelse:\n    print(\"Refactoring failed, original code preserved\")\n```\n\n### Advanced Refactoring\n\n```python\nimport pyrustor\n\nparser = pyrustor.Parser()\nast = parser.parse_string(\"\"\"\nimport ConfigParser\nfrom imp import reload\n\ndef format_string(name, age):\n    return \"Name: %s, Age: %d\" % (name, age)\n\"\"\")\n\nrefactor = pyrustor.Refactor(ast)\n\n# Modernize imports\nrefactor.replace_import(\"ConfigParser\", \"configparser\")\nrefactor.replace_import(\"imp\", \"importlib\")\n\n# Modernize syntax\nrefactor.modernize_syntax()\n\nprint(refactor.to_string())\nprint(\"Changes made:\")\nprint(refactor.change_summary())\n```\n\n### Ruff Formatter Integration\n\n```python\nimport pyrustor\n\n# Messy code that needs refactoring and formatting\nmessy_code = '''def   old_function(  x,y  ):\n    return x+y\n\nclass   OldClass:\n    def __init__(self,name):\n        self.name=name'''\n\nparser = pyrustor.Parser()\nast = parser.parse_string(messy_code)\nrefactor = pyrustor.Refactor(ast)\n\n# Refactor with automatic formatting\nrefactor.rename_function_with_format(\"old_function\", \"new_function\", apply_formatting=True)\nrefactor.rename_class_with_format(\"OldClass\", \"NewClass\", apply_formatting=True)\n\n# Or apply formatting at the end\nrefactor.modernize_syntax()\nformatted_result = refactor.refactor_and_format()\n\nprint(\"Beautifully formatted result:\")\nprint(formatted_result)\n```\n\n### Building pyupgrade-style Tools\n\n```python\nimport pyrustor\n\ndef modernize_python_code(source_code: str) -> str:\n    \"\"\"Build a pyupgrade-style modernization tool.\"\"\"\n    parser = pyrustor.Parser()\n    ast = parser.parse_string(source_code)\n    refactor = pyrustor.Refactor(ast)\n\n    # Apply common modernizations\n    refactor.replace_import(\"ConfigParser\", \"configparser\")\n    refactor.replace_import(\"urllib2\", \"urllib.request\")\n    refactor.modernize_syntax()  # % formatting -> f-strings, etc.\n\n    # Return beautifully formatted result\n    return refactor.refactor_and_format()\n\n# Example usage\nlegacy_code = '''import ConfigParser\ndef greet(name):\n    return \"Hello, %s!\" % name'''\n\nmodernized = modernize_python_code(legacy_code)\nprint(modernized)\n# Output: Clean, modern Python code with f-strings and updated imports\n```\n\n## \ud83d\udcda API Reference\n\n### Parser Class\n\n```python\nparser = pyrustor.Parser()\n\n# Parse from string\nast = parser.parse_string(source_code)\n\n# Parse from file\nast = parser.parse_file(\"path/to/file.py\")\n\n# Parse directory\nresults = parser.parse_directory(\"path/to/dir\", recursive=True)\n```\n\n### PythonAst Class\n\n```python\n# Check if AST is empty\nif ast.is_empty():\n    print(\"No code found\")\n\n# Get statistics\nprint(f\"Statements: {ast.statement_count()}\")\nprint(f\"Functions: {ast.function_names()}\")\nprint(f\"Classes: {ast.class_names()}\")\nprint(f\"Imports: {ast.imports()}\")\n\n# Convert back to string\nsource_code = ast.to_string()\n```\n\n### Refactor Class\n\n```python\nrefactor = pyrustor.Refactor(ast)\n\n# Basic refactoring\nrefactor.rename_function(\"old_name\", \"new_name\")\nrefactor.rename_class(\"OldClass\", \"NewClass\")\nrefactor.replace_import(\"old_module\", \"new_module\")\n\n# Refactoring with automatic formatting\nrefactor.rename_function_with_format(\"old_name\", \"new_name\", apply_formatting=True)\nrefactor.rename_class_with_format(\"OldClass\", \"NewClass\", apply_formatting=True)\nrefactor.modernize_syntax_with_format(apply_formatting=True)\n\n# Advanced refactoring\nrefactor.modernize_syntax()\nrefactor.modernize_imports()\n\n# Formatting options\nrefactor.format_code()  # Apply Ruff formatting\nformatted_result = refactor.refactor_and_format()  # Refactor + format in one step\nconditional_format = refactor.to_string_with_format(apply_formatting=True)\n\n# Get results\nrefactored_code = refactor.to_string()\nchanges = refactor.change_summary()\n\n# Save to file\nrefactor.save_to_file(\"output.py\")\n```\n\n## \ud83e\uddea Development\n\n### Setup Development Environment\n\n```bash\n# Install just (command runner)\ncargo install just\n\n# Setup development environment\njust dev\n\n# Run tests\njust test\n\n# Format code\njust format\n\n# Run linting\njust lint\n\n# Build release\njust release\n```\n\n### Testing\n\nPyRustor has comprehensive test coverage with 257+ tests across Rust and Python components.\n\n```bash\n# Run all tests (Rust + Python)\njust test\n\n# Run specific test categories\njust test-rust          # 91 Rust tests\njust test-python        # 166 Python tests\n\n# Run with coverage reporting\njust coverage-all       # Generate coverage reports for both languages\njust coverage-python    # Python coverage only\njust coverage-rust      # Rust coverage only\n\n# Run specific test types\npytest tests/ -m \"unit\"           # Unit tests only\npytest tests/ -m \"integration\"    # Integration tests only\npytest tests/ -m \"benchmark\"      # Performance benchmarks\npytest tests/ -m \"not slow\"       # Skip slow tests\n```\n\n#### Test Categories\n\n- **Unit Tests**: Core functionality testing\n- **Integration Tests**: End-to-end workflow testing\n- **Edge Case Tests**: Boundary conditions and error handling\n- **Performance Tests**: Benchmarking and regression detection\n- **Unicode Tests**: International character support\n- **Error Handling Tests**: Robust error recovery\n\n#### Coverage Reports\n\nAfter running coverage tests, view detailed reports:\n- **Python**: `htmlcov/index.html`\n- **Rust**: `target/tarpaulin/tarpaulin-report.html`\n\n### Quality Assurance\n\n```bash\n# Run all quality checks\njust check-all\n\n# Individual quality checks\njust quality            # Code quality analysis\njust security           # Security vulnerability scanning\njust performance        # Performance benchmarking\njust docs-check         # Documentation validation\n\n# CI-specific checks\njust ci-check-all       # All checks optimized for CI\n```\n\n### Available Commands\n\n```bash\njust --list  # Show all available commands\n```\n\n## \ud83e\udd1d Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests\n5. Submit a pull request\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## \ud83d\ude4f Acknowledgments\n\n- [**Ruff**](https://github.com/astral-sh/ruff) - PyRustor is built on Ruff's high-performance Python AST parsing engine (`ruff_python_ast`). Ruff is an extremely fast Python linter and code formatter written in Rust, developed by [Astral](https://astral.sh). We leverage Ruff's proven parsing technology to deliver blazing-fast Python code analysis and refactoring capabilities.\n- [PyO3](https://github.com/PyO3/pyo3) for excellent Python-Rust bindings\n- [maturin](https://github.com/PyO3/maturin) for seamless Python package building\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A high-performance Python code parsing and refactoring tool written in Rust",
    "version": "0.1.18",
    "project_urls": {
        "Bug Tracker": "https://github.com/loonghao/PyRustor/issues",
        "Documentation": "https://github.com/loonghao/PyRustor",
        "Homepage": "https://github.com/loonghao/PyRustor",
        "Repository": "https://github.com/loonghao/PyRustor"
    },
    "split_keywords": [
        "python",
        " parser",
        " refactoring",
        " ast",
        " code-analysis",
        " rust"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dbffb5881d84a6ec06aec8e8adeefa6c2139ba347e9065c611b4a41e3479e7f1",
                "md5": "77765f72125d3eaf546869c9709e46b2",
                "sha256": "0dcd0b3b6471d45bef60bc7229cbaa7e359711ecba9b6f1c8d633cb08c726def"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "77765f72125d3eaf546869c9709e46b2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 950814,
            "upload_time": "2025-08-04T03:52:54",
            "upload_time_iso_8601": "2025-08-04T03:52:54.912608Z",
            "url": "https://files.pythonhosted.org/packages/db/ff/b5881d84a6ec06aec8e8adeefa6c2139ba347e9065c611b4a41e3479e7f1/pyrustor-0.1.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8f1e17dd8526ee228ed48f393676f7391af6ba756de5416ec21f4c3d75dfe76d",
                "md5": "96eb62b00e3c01156d7e5de30a63ad5b",
                "sha256": "55e54a1533ae73a7879b9352cee2f313b985a5d70af79f046a51dc499da58a14"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "96eb62b00e3c01156d7e5de30a63ad5b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 967149,
            "upload_time": "2025-08-04T03:52:56",
            "upload_time_iso_8601": "2025-08-04T03:52:56.919150Z",
            "url": "https://files.pythonhosted.org/packages/8f/1e/17dd8526ee228ed48f393676f7391af6ba756de5416ec21f4c3d75dfe76d/pyrustor-0.1.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ce388b173d2304b370f36e46d8a1d884763aafa8c27fd9629c82e689e4887ca3",
                "md5": "c29d086ec8c856c99a85e64228c4437b",
                "sha256": "38033a7313efa5a134239633e3eb15c300ce9468d249c28702fdebc80b60f593"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp310-cp310-win32.whl",
            "has_sig": false,
            "md5_digest": "c29d086ec8c856c99a85e64228c4437b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 840137,
            "upload_time": "2025-08-04T03:52:58",
            "upload_time_iso_8601": "2025-08-04T03:52:58.785499Z",
            "url": "https://files.pythonhosted.org/packages/ce/38/8b173d2304b370f36e46d8a1d884763aafa8c27fd9629c82e689e4887ca3/pyrustor-0.1.18-cp310-cp310-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b1cd042c0f129869c43b9118e71f18488370da836dc14b850eba37eb132b2ea4",
                "md5": "ef5069410741f3a3cff80cb455f83d0b",
                "sha256": "455b97cc1e5d229ea5c892d41bb7c0ef15d5d1dd0893eaf8ab78c4d01a8d5eb6"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ef5069410741f3a3cff80cb455f83d0b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 846835,
            "upload_time": "2025-08-04T03:53:01",
            "upload_time_iso_8601": "2025-08-04T03:53:01.324298Z",
            "url": "https://files.pythonhosted.org/packages/b1/cd/042c0f129869c43b9118e71f18488370da836dc14b850eba37eb132b2ea4/pyrustor-0.1.18-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "833d062fdd9074012e59c995dbb40bfb5ee8a034bac98634169ff6dfd19be703",
                "md5": "f1490170d1060f6b5f9c805ba37ac4e1",
                "sha256": "8bcbe942272ac64c2242cb58a766fc1a89691533631cb416b3edc68f8cc5f9f2"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "has_sig": false,
            "md5_digest": "f1490170d1060f6b5f9c805ba37ac4e1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1816834,
            "upload_time": "2025-08-04T03:53:03",
            "upload_time_iso_8601": "2025-08-04T03:53:03.435719Z",
            "url": "https://files.pythonhosted.org/packages/83/3d/062fdd9074012e59c995dbb40bfb5ee8a034bac98634169ff6dfd19be703/pyrustor-0.1.18-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4e9206cf9bb05795262abc5af4d4a698a6b733119259abe05c0745d29c7d28e3",
                "md5": "c35ca78e30e334bef9655e184cfd0207",
                "sha256": "d36ed06887bf518d0356268037b6b97459debc8e62879abe69e43fa3ccd8cb8b"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp311-cp311-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c35ca78e30e334bef9655e184cfd0207",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 931897,
            "upload_time": "2025-08-04T03:53:05",
            "upload_time_iso_8601": "2025-08-04T03:53:05.358171Z",
            "url": "https://files.pythonhosted.org/packages/4e/92/06cf9bb05795262abc5af4d4a698a6b733119259abe05c0745d29c7d28e3/pyrustor-0.1.18-cp311-cp311-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd81b126ec79681001808765e690a6a3126bfea3c9432898802982e0706490cd",
                "md5": "251425feba090c826d9270feed386b6a",
                "sha256": "d20d25eeffc72ec15d481a1ba984a54ef58115cf7bfaf03f478e4772e4dee3c9"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "251425feba090c826d9270feed386b6a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 950572,
            "upload_time": "2025-08-04T03:53:06",
            "upload_time_iso_8601": "2025-08-04T03:53:06.971106Z",
            "url": "https://files.pythonhosted.org/packages/dd/81/b126ec79681001808765e690a6a3126bfea3c9432898802982e0706490cd/pyrustor-0.1.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d35880b55284dcbc6deae600552046fd97688c433e380e5cafee3e358342a8d3",
                "md5": "4f7d0e52ce29aeb233a454acc4545aaf",
                "sha256": "b41373141e91f9b9dbb10e7226d6fd7975a286bec03082a9598073c4859fce43"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "4f7d0e52ce29aeb233a454acc4545aaf",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 967061,
            "upload_time": "2025-08-04T03:53:09",
            "upload_time_iso_8601": "2025-08-04T03:53:09.222689Z",
            "url": "https://files.pythonhosted.org/packages/d3/58/80b55284dcbc6deae600552046fd97688c433e380e5cafee3e358342a8d3/pyrustor-0.1.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8e6702a0751de78af6281b7d3224ad3448fe61361c843568e0ca7c3574e179ba",
                "md5": "9dd21d0b741f9998e9e7ae7a2ab9dc90",
                "sha256": "0a9416d97441e63cc88700f75bfed0fa4e37420806ef72b43beed6c7177e73df"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp311-cp311-win32.whl",
            "has_sig": false,
            "md5_digest": "9dd21d0b741f9998e9e7ae7a2ab9dc90",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 840163,
            "upload_time": "2025-08-04T03:53:10",
            "upload_time_iso_8601": "2025-08-04T03:53:10.996322Z",
            "url": "https://files.pythonhosted.org/packages/8e/67/02a0751de78af6281b7d3224ad3448fe61361c843568e0ca7c3574e179ba/pyrustor-0.1.18-cp311-cp311-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b44c82303e9f4c5614302bfdf1c5dd0e3cd9365caf6a2cfb791e5a7083e32d78",
                "md5": "c00914fbdc028e702e88029d1b8480cc",
                "sha256": "2246a4110131b61f5746b5b80ad984dd78c481d8f15cd86fba4ebd8c8983878a"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c00914fbdc028e702e88029d1b8480cc",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 846728,
            "upload_time": "2025-08-04T03:53:12",
            "upload_time_iso_8601": "2025-08-04T03:53:12.648633Z",
            "url": "https://files.pythonhosted.org/packages/b4/4c/82303e9f4c5614302bfdf1c5dd0e3cd9365caf6a2cfb791e5a7083e32d78/pyrustor-0.1.18-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3550cf37bc744c47e7705da6d85258687fba0961f56f9d447a81c889bef15e48",
                "md5": "f5811871bbd4614539a9c6c2d123e946",
                "sha256": "2144adf6370cf770fd3408239ee693179de76cfb02ed9e83bbc1d5f26d6d41b2"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "has_sig": false,
            "md5_digest": "f5811871bbd4614539a9c6c2d123e946",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1807125,
            "upload_time": "2025-08-04T03:53:14",
            "upload_time_iso_8601": "2025-08-04T03:53:14.577217Z",
            "url": "https://files.pythonhosted.org/packages/35/50/cf37bc744c47e7705da6d85258687fba0961f56f9d447a81c889bef15e48/pyrustor-0.1.18-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2884cb7aeeb0f9aee3d550034f70f31e7d4609f327ce9ba4134b2e1342a62d1c",
                "md5": "2602ffabaacb248fd60f07750c056f13",
                "sha256": "fb92d7721b5e950aefa7982b6c9135d0da46b6504cdaf5a008f56e1cac7e2c60"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp312-cp312-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2602ffabaacb248fd60f07750c056f13",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 925974,
            "upload_time": "2025-08-04T03:53:16",
            "upload_time_iso_8601": "2025-08-04T03:53:16.466400Z",
            "url": "https://files.pythonhosted.org/packages/28/84/cb7aeeb0f9aee3d550034f70f31e7d4609f327ce9ba4134b2e1342a62d1c/pyrustor-0.1.18-cp312-cp312-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e932538dc6db49644573edd64b97a53941b75bf7de9186464a3e29edabc18b90",
                "md5": "357fbe7b6fe2f911b67c9cb350b4ecc2",
                "sha256": "eb13f479520cc798ef8a4dd128be577a2ab38e7eddfa61b750882aa8b9744828"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "357fbe7b6fe2f911b67c9cb350b4ecc2",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 948615,
            "upload_time": "2025-08-04T03:53:18",
            "upload_time_iso_8601": "2025-08-04T03:53:18.556520Z",
            "url": "https://files.pythonhosted.org/packages/e9/32/538dc6db49644573edd64b97a53941b75bf7de9186464a3e29edabc18b90/pyrustor-0.1.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b2cd184c430e885076a615e0b608e8740a21720303566724ab920930f28f4fb8",
                "md5": "677ddecef601ab98b19bc708c42ed4ad",
                "sha256": "2f7783d6d9a9aa2514188cfbcc51ff2ce215c4141e42841a0915c1f8eb14a737"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "677ddecef601ab98b19bc708c42ed4ad",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 969432,
            "upload_time": "2025-08-04T03:53:20",
            "upload_time_iso_8601": "2025-08-04T03:53:20.071301Z",
            "url": "https://files.pythonhosted.org/packages/b2/cd/184c430e885076a615e0b608e8740a21720303566724ab920930f28f4fb8/pyrustor-0.1.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cf032afc22a2b5c682dc5911582b8f4ee571ce0f2bcc419a2bb94141634cfe86",
                "md5": "e0fd6b4464d05125a02cab22de742af3",
                "sha256": "060748aee78f508e56c45bf383448b9a4ea2dd2e9e3d94f95d77acf9e85856cf"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp312-cp312-win32.whl",
            "has_sig": false,
            "md5_digest": "e0fd6b4464d05125a02cab22de742af3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 836726,
            "upload_time": "2025-08-04T03:53:21",
            "upload_time_iso_8601": "2025-08-04T03:53:21.926906Z",
            "url": "https://files.pythonhosted.org/packages/cf/03/2afc22a2b5c682dc5911582b8f4ee571ce0f2bcc419a2bb94141634cfe86/pyrustor-0.1.18-cp312-cp312-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c2452f0ee1c8b2aeb635dead26313a67bf180df764979dcc4e3699c6379e5081",
                "md5": "252090421e0dc10d2cef7c7bc04d5a98",
                "sha256": "db80b9c3d6bd5025c4343205caf0c6f2ab6fe4f1e2416a674e3b62e4356e58dd"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "252090421e0dc10d2cef7c7bc04d5a98",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 845816,
            "upload_time": "2025-08-04T03:53:23",
            "upload_time_iso_8601": "2025-08-04T03:53:23.559009Z",
            "url": "https://files.pythonhosted.org/packages/c2/45/2f0ee1c8b2aeb635dead26313a67bf180df764979dcc4e3699c6379e5081/pyrustor-0.1.18-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8ab9c6a05f5dadee305b9968b00a7a0cf04bd043e960223fac4f6e3ccbc3e087",
                "md5": "98fb8dd675f438e9af4108b154776ff4",
                "sha256": "7c4dfe62d98152f763088f5a5dd7d6c862429656353f59e01f64082b45886c1e"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "has_sig": false,
            "md5_digest": "98fb8dd675f438e9af4108b154776ff4",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1806928,
            "upload_time": "2025-08-04T03:53:25",
            "upload_time_iso_8601": "2025-08-04T03:53:25.782997Z",
            "url": "https://files.pythonhosted.org/packages/8a/b9/c6a05f5dadee305b9968b00a7a0cf04bd043e960223fac4f6e3ccbc3e087/pyrustor-0.1.18-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ebfaf754380e4490743e8c03536ca17d90c193933d07184dd97269336527a8f0",
                "md5": "39941988cd8371f19409ecf38d185dbc",
                "sha256": "0b61b9f85b3c8faa58434ce89b9b15c5c80e4c579be1bf0587912bd3ae408b87"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp313-cp313-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "39941988cd8371f19409ecf38d185dbc",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 925832,
            "upload_time": "2025-08-04T03:53:27",
            "upload_time_iso_8601": "2025-08-04T03:53:27.889293Z",
            "url": "https://files.pythonhosted.org/packages/eb/fa/f754380e4490743e8c03536ca17d90c193933d07184dd97269336527a8f0/pyrustor-0.1.18-cp313-cp313-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "44a508beb23b45873777e54ae81ad91a9300c2831f251796c4e60af20e87a507",
                "md5": "e3baab6dfb78cab74b90150b4e782e7f",
                "sha256": "1ebac6cce1545303e3b2a37b6f6d651d5fa5f79c25d16b88aecf55eea956f5d9"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e3baab6dfb78cab74b90150b4e782e7f",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 948273,
            "upload_time": "2025-08-04T03:53:29",
            "upload_time_iso_8601": "2025-08-04T03:53:29.804681Z",
            "url": "https://files.pythonhosted.org/packages/44/a5/08beb23b45873777e54ae81ad91a9300c2831f251796c4e60af20e87a507/pyrustor-0.1.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "385b90192f754d6bc0d5141218052b6cda8029883bba257a2ba6d00bab065d4a",
                "md5": "38b4a6cee952b1da7d10ca87152ce5b7",
                "sha256": "7a77fa6771b14d833f5f454cd0b7410a5692868e172a71dbb68270459a506157"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "38b4a6cee952b1da7d10ca87152ce5b7",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 969242,
            "upload_time": "2025-08-04T03:53:31",
            "upload_time_iso_8601": "2025-08-04T03:53:31.548288Z",
            "url": "https://files.pythonhosted.org/packages/38/5b/90192f754d6bc0d5141218052b6cda8029883bba257a2ba6d00bab065d4a/pyrustor-0.1.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9e51a2b720f3ecdcebc28f3195fe41e913fc16da1cec79e09205a589a25bbcd4",
                "md5": "1edb68f10a4750f9881121b6242655bb",
                "sha256": "ef7a40cf757ba4d6cbddc4a5a580a021714d7a14adb85d1be09e3fee97d5bb42"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp313-cp313-win32.whl",
            "has_sig": false,
            "md5_digest": "1edb68f10a4750f9881121b6242655bb",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 836556,
            "upload_time": "2025-08-04T03:53:32",
            "upload_time_iso_8601": "2025-08-04T03:53:32.968347Z",
            "url": "https://files.pythonhosted.org/packages/9e/51/a2b720f3ecdcebc28f3195fe41e913fc16da1cec79e09205a589a25bbcd4/pyrustor-0.1.18-cp313-cp313-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "66ed29ae672b9abb407378761058cb498ea62aef7a7f009ead299765d84e4731",
                "md5": "2571f6590c84921cacfee15f2c0aa99d",
                "sha256": "00e74041d1884ae497928c78ad265a196c7896201e0c4e86cbd5e8641bb69893"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2571f6590c84921cacfee15f2c0aa99d",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 845540,
            "upload_time": "2025-08-04T03:53:34",
            "upload_time_iso_8601": "2025-08-04T03:53:34.671432Z",
            "url": "https://files.pythonhosted.org/packages/66/ed/29ae672b9abb407378761058cb498ea62aef7a7f009ead299765d84e4731/pyrustor-0.1.18-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c45c2b1344f6a1c9e77a6053050b9debc83d8ecd83317495e98c466bbb2afa9e",
                "md5": "5a170ddca7b4cae767d8c8ea41f8a87e",
                "sha256": "d3d9c9c2948f579025d70b9fca7bc5fc81543bbc65dc4bf842b90793f3653b14"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5a170ddca7b4cae767d8c8ea41f8a87e",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.8",
            "size": 951095,
            "upload_time": "2025-08-04T03:53:36",
            "upload_time_iso_8601": "2025-08-04T03:53:36.284890Z",
            "url": "https://files.pythonhosted.org/packages/c4/5c/2b1344f6a1c9e77a6053050b9debc83d8ecd83317495e98c466bbb2afa9e/pyrustor-0.1.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "788fed9d79662e384ccfd6b6f0a2d2a7dbd112c3698cfd7956d09425c90a4b04",
                "md5": "6ea20506a7b6bb60d236396f8bd8a33c",
                "sha256": "51d4233f589c3e75bc5dba2c050dc8c021ffc1e093f48944f7891d011c81f4a3"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "6ea20506a7b6bb60d236396f8bd8a33c",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.8",
            "size": 972561,
            "upload_time": "2025-08-04T03:53:37",
            "upload_time_iso_8601": "2025-08-04T03:53:37.854135Z",
            "url": "https://files.pythonhosted.org/packages/78/8f/ed9d79662e384ccfd6b6f0a2d2a7dbd112c3698cfd7956d09425c90a4b04/pyrustor-0.1.18-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f8f669979e0b01bff6ebe5eda05a6b0652a77ea37d9447f47ff618ba8c0b89f4",
                "md5": "3589efc930cbff3563ccbeb12ae56572",
                "sha256": "02ed9cae3f68fa0561fb65a60abbff47e222d19233c1c241f1b12fc30e89e173"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-abi3-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3589efc930cbff3563ccbeb12ae56572",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 929796,
            "upload_time": "2025-08-04T03:53:39",
            "upload_time_iso_8601": "2025-08-04T03:53:39.410765Z",
            "url": "https://files.pythonhosted.org/packages/f8/f6/69979e0b01bff6ebe5eda05a6b0652a77ea37d9447f47ff618ba8c0b89f4/pyrustor-0.1.18-cp38-abi3-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "61e898ea688fc2e95eaecdfd5d1aecb8e2edb8fb1591cfee92084697612a7c1a",
                "md5": "39bf428e30076416806b4d9980b931f8",
                "sha256": "ef48f6e82d0d704ead892d412e7e0fdbbaaaebb4128040d3e4bdf66214bd2e69"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-abi3-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "39bf428e30076416806b4d9980b931f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 896269,
            "upload_time": "2025-08-04T03:53:41",
            "upload_time_iso_8601": "2025-08-04T03:53:41.330409Z",
            "url": "https://files.pythonhosted.org/packages/61/e8/98ea688fc2e95eaecdfd5d1aecb8e2edb8fb1591cfee92084697612a7c1a/pyrustor-0.1.18-cp38-abi3-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "db7f64ac0ca56dc81c64baf1e17a8e3db4828b1829b4d6e397b0866a78fbd6bd",
                "md5": "4ca8c098557e379d1113c54be03e9ce0",
                "sha256": "c0095424d99601fea417336a1d0003734318301de7f3f594d55876e24d4f891e"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4ca8c098557e379d1113c54be03e9ce0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 955382,
            "upload_time": "2025-08-04T03:53:42",
            "upload_time_iso_8601": "2025-08-04T03:53:42.915729Z",
            "url": "https://files.pythonhosted.org/packages/db/7f/64ac0ca56dc81c64baf1e17a8e3db4828b1829b4d6e397b0866a78fbd6bd/pyrustor-0.1.18-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bf35db0c366b70c59da2238e703ec9363beb37b4ec377d89504ecf1ea44fa531",
                "md5": "e1b868f818b0a1a4aa5b9bf1d93f7053",
                "sha256": "6715b72c18871917d7d180d15999dbbbb8ccec37ac8191a084da993c54a6c32e"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "e1b868f818b0a1a4aa5b9bf1d93f7053",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 975158,
            "upload_time": "2025-08-04T03:53:44",
            "upload_time_iso_8601": "2025-08-04T03:53:44.913657Z",
            "url": "https://files.pythonhosted.org/packages/bf/35/db0c366b70c59da2238e703ec9363beb37b4ec377d89504ecf1ea44fa531/pyrustor-0.1.18-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c9376ecc82ea196576bd315861c5327336d8961e6dcc2fecc52ad3889c6384b5",
                "md5": "7982979b8ff419cf2027a6b48f7f9409",
                "sha256": "15a682ce6ffb270c58c5f78cf9a37051db45325ee26b3b54fe099e489c38ba34"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-abi3-win32.whl",
            "has_sig": false,
            "md5_digest": "7982979b8ff419cf2027a6b48f7f9409",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 838853,
            "upload_time": "2025-08-04T03:53:46",
            "upload_time_iso_8601": "2025-08-04T03:53:46.418285Z",
            "url": "https://files.pythonhosted.org/packages/c9/37/6ecc82ea196576bd315861c5327336d8961e6dcc2fecc52ad3889c6384b5/pyrustor-0.1.18-cp38-abi3-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8071e89f40d8390c029f3df557add709fdb1c66db6ff583db3e6a4dea4c0a21c",
                "md5": "984887583f30cfb22bb039dbdc51ef04",
                "sha256": "6702dad7a1fc1c1b107f7697585b746d1445d0120acf829e96220d7e41e39977"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "984887583f30cfb22bb039dbdc51ef04",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 849932,
            "upload_time": "2025-08-04T03:53:47",
            "upload_time_iso_8601": "2025-08-04T03:53:47.919290Z",
            "url": "https://files.pythonhosted.org/packages/80/71/e89f40d8390c029f3df557add709fdb1c66db6ff583db3e6a4dea4c0a21c/pyrustor-0.1.18-cp38-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5868d0cf0ae8e9dab230da4cdbe55d8ee47521b40c6a7f5e68549cc87b57fed0",
                "md5": "9a8ff7585fbb59caea46a77d1ffc6d2a",
                "sha256": "6ce8d833a529dcdfc776ec52642ef601d83b50069cc5e45f860fb6e3c5d14661"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9a8ff7585fbb59caea46a77d1ffc6d2a",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 951145,
            "upload_time": "2025-08-04T03:53:49",
            "upload_time_iso_8601": "2025-08-04T03:53:49.422787Z",
            "url": "https://files.pythonhosted.org/packages/58/68/d0cf0ae8e9dab230da4cdbe55d8ee47521b40c6a7f5e68549cc87b57fed0/pyrustor-0.1.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ca9b3329e1f4b9e9c00ec7523db16dbad461173c81e481e653ea8502c6a7cee3",
                "md5": "b78c48a9d078513e262b03b68b89e555",
                "sha256": "6e48a954eec0928866dc639eb859456a0767003b38ae1fbcbbad83f240dbdcb4"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "b78c48a9d078513e262b03b68b89e555",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 967429,
            "upload_time": "2025-08-04T03:53:50",
            "upload_time_iso_8601": "2025-08-04T03:53:50.978289Z",
            "url": "https://files.pythonhosted.org/packages/ca/9b/3329e1f4b9e9c00ec7523db16dbad461173c81e481e653ea8502c6a7cee3/pyrustor-0.1.18-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0edfde9e129d6e01f08c0051327a6bd71d6897a8b8e9c0a4ee675e255665f298",
                "md5": "2d267c16e70ce2e2e53566b3ab15ecb2",
                "sha256": "bcb6400293d16dcc55b910c534bb96e512ee25ea3f5ef5277e09279ffd12a182"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2d267c16e70ce2e2e53566b3ab15ecb2",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 951030,
            "upload_time": "2025-08-04T03:53:52",
            "upload_time_iso_8601": "2025-08-04T03:53:52.870524Z",
            "url": "https://files.pythonhosted.org/packages/0e/df/de9e129d6e01f08c0051327a6bd71d6897a8b8e9c0a4ee675e255665f298/pyrustor-0.1.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "927df54905263ea614d46378c24688ae79dd42dbb561011a5201ac918071b565",
                "md5": "22213e92017d927b7b39d3eeefd78cb7",
                "sha256": "89d8c12919e1fbc535018f3a2dcc49eb5d9d8aa73a0f8b35f3e627d26022e1bf"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "22213e92017d927b7b39d3eeefd78cb7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 967365,
            "upload_time": "2025-08-04T03:53:54",
            "upload_time_iso_8601": "2025-08-04T03:53:54.473286Z",
            "url": "https://files.pythonhosted.org/packages/92/7d/f54905263ea614d46378c24688ae79dd42dbb561011a5201ac918071b565/pyrustor-0.1.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1ee5d45ddedfb314e91d242f4ad67321fcbb387902065d92c1874b40107b5795",
                "md5": "446be8f30c4bd858975ad52c7c4ca75e",
                "sha256": "f90148cebc29b96f060e04af7f3f343490385b98bb9320366e670c690847798a"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp39-cp39-win32.whl",
            "has_sig": false,
            "md5_digest": "446be8f30c4bd858975ad52c7c4ca75e",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 840220,
            "upload_time": "2025-08-04T03:53:55",
            "upload_time_iso_8601": "2025-08-04T03:53:55.940231Z",
            "url": "https://files.pythonhosted.org/packages/1e/e5/d45ddedfb314e91d242f4ad67321fcbb387902065d92c1874b40107b5795/pyrustor-0.1.18-cp39-cp39-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cac3bcde2bb63b1531e7f804e54e6919ba1d2b27fefbeb1592af4c49667662a8",
                "md5": "2fda54b8c596d805657e1060fdac3599",
                "sha256": "ffbc48b9d0b18c0009902e30c089cedffd13f7484d29e7e5820c2ade3e58bf89"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2fda54b8c596d805657e1060fdac3599",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 846897,
            "upload_time": "2025-08-04T03:53:57",
            "upload_time_iso_8601": "2025-08-04T03:53:57.493311Z",
            "url": "https://files.pythonhosted.org/packages/ca/c3/bcde2bb63b1531e7f804e54e6919ba1d2b27fefbeb1592af4c49667662a8/pyrustor-0.1.18-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6dd9184601ab3859c00f1925f85a0ebfbe0f048f958d1eb4d8abd269d1eea6f8",
                "md5": "6101dd7c421705ff5d69fcb062e88676",
                "sha256": "d13ee12bc3cd40696573878c16bfa8872ee38d27f1dd44064e8e517a435bbcb2"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6101dd7c421705ff5d69fcb062e88676",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 950564,
            "upload_time": "2025-08-04T03:53:59",
            "upload_time_iso_8601": "2025-08-04T03:53:59.494249Z",
            "url": "https://files.pythonhosted.org/packages/6d/d9/184601ab3859c00f1925f85a0ebfbe0f048f958d1eb4d8abd269d1eea6f8/pyrustor-0.1.18-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "052db60f352d88ab661e31b67459ddb9ba5c26623b3a825ca68eab05656fc09a",
                "md5": "b1b2ef6583ea8d930106a461c6caf663",
                "sha256": "320e1ae2237607ee26b26cec0e83d2e2eea03ac4c74d38198d1f96547125111a"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "b1b2ef6583ea8d930106a461c6caf663",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 967210,
            "upload_time": "2025-08-04T03:54:01",
            "upload_time_iso_8601": "2025-08-04T03:54:01.039661Z",
            "url": "https://files.pythonhosted.org/packages/05/2d/b60f352d88ab661e31b67459ddb9ba5c26623b3a825ca68eab05656fc09a/pyrustor-0.1.18-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c1c02faf9a58ec95d5bcdb050e50e7672f7530bbe6388fbf046672485890d06e",
                "md5": "9125d6bcea2f99d92aa78761587ea91c",
                "sha256": "a8070b0b3825fc34fb89c6b89644fc73a8bdb85aed756f267a645476cfdaf2e4"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9125d6bcea2f99d92aa78761587ea91c",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 950282,
            "upload_time": "2025-08-04T03:54:02",
            "upload_time_iso_8601": "2025-08-04T03:54:02.561051Z",
            "url": "https://files.pythonhosted.org/packages/c1/c0/2faf9a58ec95d5bcdb050e50e7672f7530bbe6388fbf046672485890d06e/pyrustor-0.1.18-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a6e11519c203fe14df4404f7e3dd76ebca3fe860eefb953f8bcb9f3fb235eff6",
                "md5": "4047a2590e96536978916675779e0b07",
                "sha256": "12ddeebc07515ff382be272162bf91cd9dfdcde3ee2d20c3dc4dc4c4ae5f27d6"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "4047a2590e96536978916675779e0b07",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 967099,
            "upload_time": "2025-08-04T03:54:04",
            "upload_time_iso_8601": "2025-08-04T03:54:04.110633Z",
            "url": "https://files.pythonhosted.org/packages/a6/e1/1519c203fe14df4404f7e3dd76ebca3fe860eefb953f8bcb9f3fb235eff6/pyrustor-0.1.18-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1c1c680f645265c6908f339a8cad2a39795eccda0e7ae540531f9495d84ecb58",
                "md5": "ecf45394838725092750caed6e88db74",
                "sha256": "10152c4a420a790f8a24f57b921c28dde655375aa8cab03900c416a09e7f712d"
            },
            "downloads": -1,
            "filename": "pyrustor-0.1.18.tar.gz",
            "has_sig": false,
            "md5_digest": "ecf45394838725092750caed6e88db74",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 54081,
            "upload_time": "2025-08-04T03:54:06",
            "upload_time_iso_8601": "2025-08-04T03:54:06.049528Z",
            "url": "https://files.pythonhosted.org/packages/1c/1c/680f645265c6908f339a8cad2a39795eccda0e7ae540531f9495d84ecb58/pyrustor-0.1.18.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-04 03:54:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "loonghao",
    "github_project": "PyRustor",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "lcname": "pyrustor"
}
        
Elapsed time: 1.47676s