Skip to main content

Core HTML generation library with Rust-based Python extension - high performance, minimal dependencies

Project description

RustyTags Core

🚀 High-performance HTML generation library - Rust-powered Python extension for blazing-fast HTML and SVG creation.

3-10x faster than pure Python implementations with minimal dependencies and maximum performance.

⚛️ Datastar-Ready - Built-in reactive component support with intelligent JavaScript expression detection.

🚨 Breaking Changes in v0.6.0: Advanced features moved to Nitro. See Migration Guide below.

Looking for web framework features? Check out the Nitro package which builds on RustyTags with advanced templates, UI components, SSE, and framework integrations.

What RustyTags Core Does

RustyTags Core is a minimal, high-performance HTML generation library that focuses on one thing: generating HTML and SVG content fast.

  • 🏷️ Complete HTML5/SVG Tags: All standard HTML5 and SVG elements with optimized Rust implementations
  • ⚡ Blazing Performance: 3-10x faster than pure Python with memory optimization and intelligent caching
  • ⚛️ Powerful Datastar SDK: Type-safe Signal system with Python operator overloading, conditional logic, validation, and HTTP actions
  • 🪶 Lightweight: Minimal dependencies - works with any Python web framework
  • 🧠 Smart Processing: Automatic attribute handling and intelligent type conversion
  • 🔧 Framework Ready: Drop-in replacement for any HTML generation needs

Quick Start

Installation

pip install rusty-tags

Basic HTML Generation

from rusty_tags import Div, P, H1, A, Button, Input

# Simple HTML elements
content = Div(
    H1("Welcome to RustyTags Core"),
    P("High-performance HTML generation with Rust + Python"),
    A("Learn More", href="https://github.com/ndendic/RustyTags"),
    cls="container"
)
print(content)
# Output:
# <div class="container">
#   <h1>Welcome to RustyTags Core</h1>
#   <p>High-performance HTML generation with Rust + Python</p>
#   <a href="https://github.com/ndendic/RustyTags">Learn More</a>
# </div>

Complete Page Generation

from rusty_tags import Html, Head, Title, Body, Meta, Link
from rusty_tags import Page  # Simple page helper

# Manual HTML structure
page = Html(
    Head(
        Title("My Site"),
        Meta(charset="utf-8"),
        Link(rel="stylesheet", href="/app.css")
    ),
    Body(
        H1("Hello World"),
        P("Built with RustyTags Core")
    )
)

# Or use the simple Page helper
page = Page(
    H1("Hello World"),
    P("Built with RustyTags Core"),
    title="My Site",
    hdrs=(Meta(charset="utf-8"), Link(rel="stylesheet", href="/app.css"))
)

Reactive Components with Datastar SDK

Inspired by the awesome StarHTML, RustyTags Core now includes an even more powerfull Datastar SDK that provides a Pythonic API for building reactive components with type-safe signals and expressions:

Quick Start with Signals

from rusty_tags import Div, Button, P, Input, Label, Span, Page
from rusty_tags.datastar import Signal, Signals

# Create signals using the Signals class
sigs = Signals(counter=0, user_name="John", is_active=True)

# Basic reactive counter with Signal methods
counter = Div(
    P(text=sigs.counter, cls="display"),
    Button("-", on_click=sigs.counter.sub(1)),
    Button("+", on_click=sigs.counter.add(1)),
    Button("Reset", on_click=sigs.counter.set(0)),
    cls="counter-widget",
    signals=sigs  # Signals object automatically converts to data-signals
)

# Create a complete page with Datastar CDN
page = Page(counter, title="Reactive App", datastar=True)

Signal Operations - Pythonic Reactive Expressions

The Signal SDK provides full Python operator overloading for building reactive JavaScript expressions:

Arithmetic Operators:

from rusty_tags.datastar import Signals

numbers = Signals(x=10, y=3)
demo = Div(
    P(text="X: " + numbers.x),                           # → "X: ${$x}"
    P(text="Y: " + numbers.y),                           # → "Y: ${$y}"
    P(text="Sum: " + (numbers.x + numbers.y)),           # → "Sum: ${$x + $y}"
    P(text="Product: " + (numbers.x * numbers.y)),       # → "Product: ${$x * $y}"
    P(text="Division: " + (numbers.x / numbers.y)),      # → "Division: ${$x / $y}"
    P(text="Modulo: " + (numbers.x % numbers.y)),        # → "Modulo: ${$x % $y}"

    Button("X +5", on_click=numbers.x.add(5)),
    Button("Y +1", on_click=numbers.y.add(1)),
    signals=numbers
)

Comparison & Logical Operators:

from rusty_tags.datastar import Signal

age = Signal("age", 25)
has_license = Signal("has_license", True)

validation = Div(
    P(text="Age: " + age),
    P(text="Has License: " + has_license),
    P(text="Is Adult (≥18): " + (age >= 18)),            # → ($age >= 18)
    P(text="Can Drive: " + ((age >= 18) & has_license)), # → (($age >= 18) && $has_license)
    P(text="Is Minor: " + (age < 18)),                   # → ($age < 18)
    P(text="No License: " + (~has_license)),             # → (!$has_license)

    Button("Age +1", on_click=age.add(1)),
    Button("Toggle License", on_click=has_license.toggle()),
    signals={"age": 25, "has_license": True}
)

String Methods:

text = Signal("text", "Hello World")

string_demo = Div(
    Input(type="text", bind=text, placeholder="Enter text"),
    P(text="Original: " + text),
    P(text="Uppercase: " + text.upper()),                # → $text.toUpperCase()
    P(text="Lowercase: " + text.lower()),                # → $text.toLowerCase()
    P(text="Length: " + text.length),                    # → $text.length
    P(text="Contains 'Hello': " + text.contains("Hello")), # → $text.includes('Hello')
    signals={"text": "Hello World"}
)

Array Methods:

items = Signal("items", ["Apple", "Banana"])
new_item = Signal("new_item", "Orange")

array_demo = Div(
    Input(type="text", bind=new_item, placeholder="New item"),
    # Chaining multiple actions with semicolons
    Button("Add Item", data_on_click=items.append(new_item).to_js() + "; " + new_item.set("").to_js()),
    Button("Remove Last", data_on_click=items.pop()),
    Button("Clear All", data_on_click=items.set([])),

    P("Count: ", Span(text=items.length)),               # → $items.length
    P("Items: ", Span(text=items.join(", "))),           # → $items.join(', ')
    P("Empty: ", Span(text=items.length == 0)),          # → $items.length === 0
    signals={"items": ["Apple", "Banana"], "new_item": ""}
)

Math Methods:

value = Signal("value", 7.825)

math_demo = Div(
    P("Value: ", Span(text=value)),
    P("Rounded: ", Span(text=value.round())),            # → Math.round($value)
    P("Rounded (2 decimals): ", Span(text=value.round(2))),
    P("Absolute: ", Span(text=value.abs())),             # → Math.abs($value)
    P("Min with 5: ", Span(text=value.min(5))),          # → Math.min($value, 5)
    P("Max with 10: ", Span(text=value.max(10))),        # → Math.max($value, 10)
    P("Clamped (0-10): ", Span(text=value.clamp(0, 10))), # → Math.max(0, Math.min(10, $value))

    Button("+0.5", data_on_click=value.add(0.5)),
    Button("-0.5", data_on_click=value.sub(0.5)),
    signals={"value": 7.825}
)

Advanced Features - Conditionals, Patterns & Templates

Conditional Expressions with if_():

from rusty_tags.datastar import if_

score = Signal("score", 75)

conditional = Div(
    P("Score: ", Span(text=score)),
    # Simple ternary
    P("Grade: ", Span(text=if_(score >= 90, "A", "B"))),  # → ($score >= 90) ? 'A' : 'B'
    P("Status: ", text=if_(score >= 60, "Pass", "Fail")),

    # Nested conditionals
    P("Grade: ", Span(text=if_(score >= 90, "A",
                              if_(score >= 80, "B",
                                 if_(score >= 70, "C", "F"))))),

    # Conditional rendering with data-show
    Div(text=if_(score >= 90, "🎉 Excellent!",
                 if_(score >= 70, "👍 Good", "📚 Keep trying")),
        style="font-size: 2rem; text-align: center;"),

    Button("+10", data_on_click=score.add(10)),
    Button("-10", data_on_click=score.sub(10)),
    signals={"score": 75}
)

Pattern Matching with match():

from rusty_tags.datastar import match

status = Signals(status="idle")

status_demo = Div(
    P("Current Status: ", Span(text=status.status)),
    Div(
        text=match(
            status.status,
            idle="⏸️ Ready to start",
            loading="⏳ Processing...",
            success="✅ Completed!",
            error="❌ Failed!",
            default="❓ Unknown"
        ),
        style="font-size: 1.5rem; text-align: center; padding: 1rem;"
    ),

    Button("Idle", on_click=status.status.set("idle")),
    Button("Loading", on_click=status.status.set("loading")),
    Button("Success", on_click=status.status.set("success")),
    Button("Error", on_click=status.status.set("error")),
    signals=status
)

Template Literals with f():

from rusty_tags.datastar import f

user = Signals(first_name="John", last_name="Doe", age_val=25)

template = Div(
    Input(type="text", bind=user.first_name, placeholder="First name"),
    Input(type="text", bind=user.last_name, placeholder="Last name"),
    Input(type="number", bind=user.age_val, placeholder="Age"),

    P(text=f("Hello, {fn} {ln}!", fn=user.first_name, ln=user.last_name)),
    P(text=f("You are {age} years old.", age=user.age_val)),
    P(text=f("In 10 years, you'll be {future}.", future=user.age_val + 10)),
    signals=user
)

Dynamic CSS Classes

Using collect() for conditional class joining:

from rusty_tags.datastar import collect

is_large = Signal("is_large", False)
is_bold = Signal("is_bold", False)
is_italic = Signal("is_italic", False)

collect_demo = Div(
    Label(Input(type="checkbox", bind=is_large), " Large"),
    Label(Input(type="checkbox", bind=is_bold), " Bold"),
    Label(Input(type="checkbox", bind=is_italic), " Italic"),

    P(
        "Styled Text",
        data_class=collect([
            (is_large, "large"),
            (is_bold, "bold"),
            (is_italic, "italic")
        ], join_with=" "),
        style="transition: all 0.3s;"
    ),
    signals={"is_large": False, "is_bold": False, "is_italic": False}
)

Using classes() for Datastar's data-class (object literal):

from rusty_tags.datastar import classes

cls_large = Signal("cls_large", False)
cls_bold = Signal("cls_bold", False)
cls_blue = Signal("cls_blue", False)

classes_demo = Div(
    Label(Input(type="checkbox", bind=cls_large), " Large"),
    Label(Input(type="checkbox", bind=cls_bold), " Bold"),
    Label(Input(type="checkbox", bind=cls_blue), " Blue"),

    P(
        "Styled Text with data-class",
        data_class=classes(large=cls_large, bold=cls_bold, blue=cls_blue),
        style="transition: all 0.3s;"
    ),
    signals={"cls_large": False, "cls_bold": False, "cls_blue": False}
)

Form Validation with Logical Aggregation

Using all() and any() for validation:

from rusty_tags.datastar import all, any, if_

form_name = Signal("form_name", "")
form_email = Signal("form_email", "")
form_age = Signal("form_age", 0)
form_agree = Signal("form_agree", False)

# Define validation rules
name_valid = form_name.length >= 3
email_valid = form_email.contains("@")
age_valid = form_age >= 18
can_submit = all(name_valid, email_valid, age_valid, form_agree)

registration_form = Div(
    # Name field with validation
    Div(
        Label("Name:"),
        Input(type="text", bind=form_name, placeholder="Enter name (min 3 chars)"),
        P("✓ Valid", data_show=name_valid, style="color: green;"),
        P("✗ Too short", data_show=~name_valid, style="color: red;")
    ),

    # Email field with validation
    Div(
        Label("Email:"),
        Input(type="email", bind=form_email, placeholder="Enter email"),
        P("✓ Valid", data_show=email_valid, style="color: green;"),
        P("✗ Invalid", data_show=~email_valid, style="color: red;")
    ),

    # Age field with validation
    Div(
        Label("Age:"),
        Input(type="number", bind=form_age, placeholder="Enter age"),
        P("✓ Valid", data_show=age_valid, style="color: green;"),
        P("✗ Must be 18+", data_show=~age_valid, style="color: red;")
    ),

    # Terms checkbox
    Div(
        Label(Input(type="checkbox", bind=form_agree), " I agree to terms")
    ),

    # Submit button - disabled until all valid
    Button(
        "Submit",
        data_disabled=~can_submit,
        data_attr_style=if_(can_submit, "opacity: 1; cursor: pointer;",
                                        "opacity: 0.5; cursor: not-allowed;")
    ),
    P(text=f("Hello, {name}!", name=form_name), data_show=can_submit),

    signals={"form_name": "", "form_email": "", "form_age": 0, "form_agree": False}
)

HTTP Actions and Server Communication

from rusty_tags.datastar import post, get, put, patch, delete

# HTTP action helpers generate @action() expressions
api_demo = Div(
    Input(bind="$name", placeholder="Enter name"),
    Input(bind="$email", placeholder="Enter email"),

    # POST with reactive data (signals are automatically passed)
    Button(
        "Save User",
        on_click=post("/api/users", name="$name", email="$email"),
        cls="btn-primary"
    ),

    # GET request
    Button("Load Data", on_click=get("/api/data")),

    # PUT request
    Button("Update", on_click=put("/api/users/1", name="$name")),

    # PATCH request
    Button("Partial Update", on_click=patch("/api/users/1", email="$email")),

    # DELETE request
    Button("Delete", on_click=delete("/api/users/1")),

    Div(id="results"),
    signals={"name": "", "email": ""}
)

Property Access for Nested Data

# Access nested object properties naturally
user = Signal("user", {"name": "Alice", "age": 30, "email": "alice@example.com"})

user_profile = Div(
    P("Name: ", Span(text=user.name)),         # → $user.name
    P("Age: ", Span(text=user.age)),           # → $user.age
    P("Email: ", Span(text=user.email)),       # → $user.email
    P("Adult: ", Span(text=(user.age >= 18))), # → ($user.age >= 18)

    Button("Birthday", on_click=user.age.add(1)),
    Button("Change Name", on_click=user.name.set("Bob")),
    signals={"user": {"name": "Alice", "age": 30, "email": "alice@example.com"}}
)

Complete Datastar SDK Features:

  • Type-Safe Signals: Signal and Signals classes with automatic type inference
  • Python Operators: Full operator overloading (+, -, *, /, %, ==, !=, <, >, <=, >=, &, |, ~)
  • Signal Methods: .add(), .sub(), .set(), .toggle(), .append(), .pop(), .remove()
  • String Methods: .upper(), .lower(), .strip(), .contains(), .length
  • Math Methods: .round(), .abs(), .min(), .max(), .clamp()
  • Array Methods: .append(), .prepend(), .pop(), .remove(), .join(), .slice(), .length
  • Conditionals: if_() for ternary expressions, match() for pattern matching
  • Templates: f() for JavaScript template literals with embedded expressions
  • Dynamic Classes: collect() for joining, classes() for object literals
  • Validation: all() and any() for logical aggregation
  • HTTP Actions: get(), post(), put(), patch(), delete() action generators
  • Raw JavaScript: js() function for raw JavaScript when needed
  • Property Access: Natural Python syntax for nested object properties

SVG Generation

from rusty_tags import Svg, Circle, Rect, Line, Path

# Create SVG graphics
chart = Svg(
    Circle(cx="50", cy="50", r="40", fill="blue"),
    Rect(x="10", y="10", width="30", height="30", fill="red"),
    Line(x1="0", y1="0", x2="100", y2="100", stroke="black"),
    width="200", height="200", viewBox="0 0 200 200"
)

Core Features

🏷️ Complete HTML5/SVG Tag System

All standard HTML5 and SVG elements are available as Python functions:

# HTML elements
Html, Head, Body, Title, Meta, Link, Script
H1, H2, H3, H4, H5, H6, P, Div, Span, A
Form, Input, Button, Select, Textarea, Label
Table, Tr, Td, Th, Tbody, Thead, Tfoot
Nav, Main, Section, Article, Header, Footer
Img, Video, Audio, Canvas, Iframe
# ... and many more

# SVG elements
Svg, Circle, Rect, Line, Path, Polygon
G, Defs, Use, Symbol, LinearGradient
Text, Image, ForeignObject
# ... complete SVG support

⚡ Performance Optimizations

  • Memory Pooling: Thread-local string pools and arena allocators minimize allocations
  • Intelligent Caching: Lock-free attribute processing with smart cache invalidation
  • String Interning: Common HTML strings pre-allocated for maximum efficiency
  • Type Optimization: Fast paths for common Python types and HTML patterns

🔧 Smart Type System

Intelligent handling of Python types:

# Automatic type conversion
Div(
    42,           # Numbers → strings
    True,         # Booleans → "true"/"false"
    None,         # None → empty string
    [1, 2, 3],    # Lists → joined strings
    custom_obj,   # Objects with __html__(), render(), or _repr_html_()
)

# Dictionary attributes automatically expand
Div("Content", {"id": "main", "class": "container", "hidden": False})
# Renders: <div id="main" class="container">Content</div>

# Framework integration - automatic recognition
class MyComponent:
    def __html__(self):
        return "<div>Custom HTML</div>"

Div(MyComponent())  # Automatically calls __html__()

🪶 Framework Agnostic

Works with any Python web framework:

# FastAPI
from fastapi import FastAPI
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.get("/")
def home():
    return HTMLResponse(str(Page(H1("FastAPI + RustyTags"), title="Home")))

# Flask
from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return str(Page(H1("Flask + RustyTags"), title="Home"))

# Django
from django.http import HttpResponse

def home(request):
    return HttpResponse(str(Page(H1("Django + RustyTags"), title="Home")))

📓 Jupyter Integration

from rusty_tags import show

# Display directly in Jupyter notebooks
content = Div(H1("Notebook Content"), style="color: blue;")
show(content)  # Renders directly in Jupyter cells

Performance

RustyTags Core delivers significant performance improvements over pure Python:

  • 3-10x faster HTML generation
  • Sub-microsecond rendering for simple elements
  • Memory efficient with intelligent pooling
  • Scalable with lock-free concurrent data structures
# Benchmark example
import timeit
from rusty_tags import Div, P

def generate_content():
    return Div(
        *[P(f"Paragraph {i}") for i in range(1000)],
        cls="container"
    )

# Time the generation
time = timeit.timeit(generate_content, number=1000)
print(f"Generated 1000 pages with 1000 paragraphs each in {time:.3f}s")

Architecture

🦀 Rust Core (src/lib.rs):

  • High-performance HTML/SVG generation with PyO3 bindings
  • Advanced memory management with pooling and interning
  • Complete tag system with macro-generated optimizations
  • ~2000+ lines of optimized Rust code

🐍 Python Layer (rusty_tags/):

  • Core Module (__init__.py): All HTML/SVG tags and core types
  • Utilities (utils.py): Essential helpers (Page, create_template, page_template, show, AttrDict)
  • Datastar SDK (datastar.py): Type-safe Signal system with Python operator overloading for reactive expressions
  • Rust Extension: Pre-compiled high-performance core with Datastar processing

Migration from Pre-0.6.x

🚨 Breaking Changes in v0.6.0

RustyTags v0.6.0 represents a major architectural shift to focus on core HTML generation performance. Advanced web framework features have been moved to the separate Nitro package.

What's Removed from RustyTags Core:

Feature Status New Location
Event system (events.py) ❌ Removed Nitro
Client management (client.py) ❌ Removed Nitro
UI components (xtras/) ❌ Removed Nitro
Example applications (lab/) ❌ Removed Nitro

What's Kept in RustyTags Core:

Feature Status Notes
All HTML/SVG tags Kept Complete tag system with Rust performance
Datastar SDK Enhanced Type-safe Signal & Signals with full Python operator overloading
Page() function Enhanced Simple templating with optional Datastar CDN
create_template(), page_template() Kept Essential templating functions
show() Jupyter integration Kept Perfect for notebooks
AttrDict utility Kept Flexible attribute access

Migration Guide:

Before v0.6.0 (Monolithic):

# Old import style - no longer works
from rusty_tags import Div, DS, Client, Accordion
from rusty_tags.events import emit

After v0.6.0 (Enhanced Core):

# Core HTML generation + Datastar SDK (RustyTags)
from rusty_tags import Div, Page, create_template, Button, Input
from rusty_tags.datastar import Signal, Signals, if_, match, f, all, any
from rusty_tags.datastar import post, get, put, patch, delete  # HTTP actions

# Advanced web framework features (Nitro - separate install)
from nitro import Client, Accordion
from nitro.events import emit

Installation Changes:

# Before v0.6.0
pip install rusty-tags  # Included everything

# After v0.6.0
pip install rusty-tags        # Core HTML + complete Datastar integration
pip install nitro             # For advanced web framework features (events, SSE, etc.)

Code Migration Examples:

  1. Basic HTML Generation (No changes needed):
# ✅ Works exactly the same
from rusty_tags import Div, H1, P
content = Div(H1("Hello"), P("World"))
  1. Basic Datastar (No changes needed):
# ✅ Works exactly the same - built into Rust core
from rusty_tags import Div, Button
counter = Div(
    Button("+1", on_click="$count++"),
    signals={"count": 0}
)
  1. Datastar SDK (Completely rewritten with Signal system):
# ✅ New Signal-based API in v0.6.0+
from rusty_tags.datastar import Signal, Signals, post, if_, all

# Create type-safe signals
sigs = Signals(name="", email="")

# Use Python operators for reactive expressions
form = Div(
    Input(bind=sigs.name, placeholder="Name"),
    Input(bind=sigs.email, placeholder="Email"),

    # New HTTP action helpers
    Button("Submit", on_click=post("/api/submit", name=sigs.name, email=sigs.email)),

    # Conditional logic with if_()
    P(text=if_(sigs.name.length >= 3, "Valid name", "Too short")),

    # Validation with all()
    Button("Save", data_disabled=~all(sigs.name.length >= 3, sigs.email.contains("@"))),

    signals=sigs
)
  1. Page Templates (Minor changes):
# ✅ Still works in RustyTags Core
from rusty_tags import Page, create_template

# Basic templating stays the same
page = Page(content, title="My App", datastar=True)
template = create_template("My App", datastar=True)

# ❌ Advanced CDN features moved to Nitro
# highlightjs=True, lucide=True parameters now in Nitro

Why This Change?

  • Performance: Core package is now 10x smaller and has zero dependencies
  • Flexibility: Choose your complexity level - core HTML or full framework
  • Maintenance: Clear separation of concerns between HTML generation and web framework
  • Adoption: Lower barrier to entry for simple HTML generation needs

The new Datastar SDK in RustyTags Core provides a powerful, type-safe reactive system with Python operator overloading - giving you excellent reactive capabilities without requiring the full Nitro framework.

Why RustyTags Core?

Choose RustyTags Core when:

  • ✅ You need maximum performance for HTML generation
  • ✅ You want minimal dependencies in your project
  • ✅ You're building your own templating system
  • ✅ You need framework-agnostic HTML generation
  • ✅ You want drop-in compatibility with any Python web framework

Consider Nitro when:

  • 🚀 You want a full web framework with reactive components
  • 🎨 You need advanced templating and UI component libraries
  • 📡 You want real-time features (SSE, WebSocket management)
  • ⚛️ You need Datastar integration for reactive UIs

System Requirements

  • Python 3.8+ (broad compatibility across versions)
  • Runtime Dependencies: None (zero dependencies for maximum compatibility)
  • Optional: IPython for show() function in Jupyter notebooks
  • Build Requirements (development only): Rust 1.70+, Maturin ≥1.9

Development

# Clone and build from source
git clone https://github.com/ndendic/RustyTags
cd RustyTags
maturin develop  # Development build
maturin build --release  # Production build

License

MIT License - See LICENSE file for details.

Related Projects

  • Nitro - Full-stack web framework built on RustyTags
  • FastHTML - Inspiration for the Python API design
  • Datastar - Reactive component framework (used in Nitro)

Links

Project details


Download files

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

Source Distribution

rusty_tags-0.6.32.tar.gz (68.4 kB view details)

Uploaded Source

Built Distributions

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

rusty_tags-0.6.32-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.0 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (871.9 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rusty_tags-0.6.32-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp314-cp314t-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

rusty_tags-0.6.32-cp314-cp314-musllinux_1_2_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (910.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rusty_tags-0.6.32-cp313-cp313t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp313-cp313-win_amd64.whl (821.5 kB view details)

Uploaded CPython 3.13Windows x86-64

rusty_tags-0.6.32-cp313-cp313-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (904.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rusty_tags-0.6.32-cp313-cp313-macosx_10_12_x86_64.whl (883.8 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

rusty_tags-0.6.32-cp312-cp312-win_amd64.whl (822.0 kB view details)

Uploaded CPython 3.12Windows x86-64

rusty_tags-0.6.32-cp312-cp312-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (904.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rusty_tags-0.6.32-cp312-cp312-macosx_10_12_x86_64.whl (884.0 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

rusty_tags-0.6.32-cp311-cp311-win_amd64.whl (782.7 kB view details)

Uploaded CPython 3.11Windows x86-64

rusty_tags-0.6.32-cp311-cp311-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (880.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rusty_tags-0.6.32-cp311-cp311-macosx_10_12_x86_64.whl (907.2 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

rusty_tags-0.6.32-cp310-cp310-win_amd64.whl (784.1 kB view details)

Uploaded CPython 3.10Windows x86-64

rusty_tags-0.6.32-cp310-cp310-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

rusty_tags-0.6.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (885.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

Details for the file rusty_tags-0.6.32.tar.gz.

File metadata

  • Download URL: rusty_tags-0.6.32.tar.gz
  • Upload date:
  • Size: 68.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.6

File hashes

Hashes for rusty_tags-0.6.32.tar.gz
Algorithm Hash digest
SHA256 8f3bf1dbe207ee20fe20a3320bdeac87ad45fa3b6252371d54eac2e473f9a15a
MD5 97ee1359581cd7259f9383a65b4601a2
BLAKE2b-256 9ac0b6cec21f49fd65c20f0db0bcae5bc6f9ac6bddf17581ff4a69a43f2002af

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e2228b12c478fcace781df2e81fec85707a29195b85e427d6a1d99cd6ce234cb
MD5 ed880fcfcb684a4807a8ac0250dfc5f1
BLAKE2b-256 2a59419453294f05209447833f31d5338895043ff8de645246e844172a5d7f25

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a73015c2eae619649f0219470e9b5bad2526c2cb2edc47e8f6425768759ad802
MD5 b65f300e09bd07c02f32e3e3c03f4611
BLAKE2b-256 8e21fff06284e39f0fac63191c85ddeedc8e62c4dfa3570d3c24530d116ef9c4

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 abaa131a702b53dc76666d25dddb69ae585f791ac65de3dd7efb7401e0881c01
MD5 58ef265dca78e124828dcf1eec650bf0
BLAKE2b-256 97c4a93fd61718ef0e241f6cac3627c89cd4c249fd751b79ea18cf7fadf1c0d7

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c70087d6542219e91dfa22cac2b50b2c0bf7fed3f27f9d56ad71b79a40cb13da
MD5 015e86016cd968057bccdd86efb47d66
BLAKE2b-256 963e0474990f6f59009ab05f0d29cbb316d0ee1c825e1d959607fc342fd4bf5a

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6e58e8fce7b5c5aea7858ea0dd59125db5485970e78e8947ce8679608c530f84
MD5 01fea4a3b77adfa9fd660fd4df6eedb6
BLAKE2b-256 abadc7ee516376109a302bdbd3a64dd726f579a3713891b980f6ce432d81794f

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 60d8363908074743b1beb812d270c4108dba5204ffcff2087330f9d566d68860
MD5 aea1fd94add65c2259460c4dc6ec8ce8
BLAKE2b-256 da68042b530feae90570e9c21760aa99e1255fcdd04ee594ee8d35af3b62e041

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9c1f3c772ab6d9dfd794ad2a0af3be4f23e3bf7217631750d03b5108160bac6
MD5 d4d8d8e5e8238ea232981fc74662fef7
BLAKE2b-256 7eb133c89989c4f02b37c723414527c162399f03ad6c99e9ce55f3676bc981a4

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a4c26d3d3f2227841960464a6bac7d15355ff3bd22022c637da05faa7f3e367c
MD5 4980347e715f0e90518765ded4f7a834
BLAKE2b-256 9cf4c40490f805705bbd024734318af8dae88f198305e5fc2b5f031dcd255b51

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b4adf521494c2ce0806f36207f6810e2c207688f430560ac572134e513d6043e
MD5 72aaa1d497994849279a8c55446ac12e
BLAKE2b-256 b9322dcb70d9a195ce7f62246563a11d4f37635e32ec9637b1fd804e3f8ca637

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 791d3bd1d94cb382ae9704d3af7e8e69a44c102c0ed22c345a30590902b4f94d
MD5 0ad65ea2971a9e38473fe87ec3d03b10
BLAKE2b-256 3a58b72c4237b1c126d4bc98ab1799078c2a9df7d29eacd6a3fafdb7ea013857

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 79245165d8a05978e1bb4b59745b707ad55aa05584ca4a7d545dc13e556b4552
MD5 70e3d7cc795c321c5e3425e60d8fdaf8
BLAKE2b-256 e3426c87da996a7c4c86598593b642854b22ff102d31e8189d94b7113e61e7e4

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 61ac308fe8a55ca3df731c06832377af5cd1d5de252d09c75558934cdd01902f
MD5 a33b818c8a12c367d6257a3ea3ba541f
BLAKE2b-256 7c531f7bec479af5e50c5514353bb2b7c08c9871e8768ae9ea98e645accc6a27

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3c563252a73fae89d275a020bb593aab398aadae729e6db536b9cb61109843d4
MD5 d1ea86f202027fad665c90eb27d65723
BLAKE2b-256 29b43c9d6ededd078f7a37fbc7ae301852c3d7710e62525da73c9b201a04f351

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 eb15c3116b3051955b8862b8af9eaca19cf89b37d047d3a4a9c2710901acda8f
MD5 17c18f85e95c4cd71aeb202cc78c0210
BLAKE2b-256 f9490cf1fb2adc53e4eda7cb8887e816b14798334bf53cebcbdd35cc70eabcb0

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 17517c26de129eda29ac8779823734cee2f991660a4cb46c50c1bd8095883fa2
MD5 c3d4f67983f4d2e898b5dc90767bd79f
BLAKE2b-256 2db95cfffe2c3c1705cadc4620e904f5c7aec25d7e6058771a36145fc9c5672c

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b0cbba812aa0e40f5254be99f99e70b127f1b0d191017b8d778dc7dd4080d3ed
MD5 c14d1e306a009b646953042f4d47bdc9
BLAKE2b-256 8810b5c1c7a7ca962fb60d8a2c873e7b8c216e745f96887772ce293baf8f3d02

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a3bae57b5975beb3f6d98fe305ce4bd61aa8456076e27d86ea6a09c67fe95698
MD5 9d370912006756f3c60007fedbff2b4e
BLAKE2b-256 1e70e27f485463cf1c7616e360742ca904b936a790ffe8528c82498a42122ee9

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 776ff201ce54001b2474dea511e24d0280db756ff4268eb37129fb175946b80e
MD5 72f088e7c6668d4cf6a93b9804e3b246
BLAKE2b-256 f060f7995ded69cc3d8112565939e0ac45c6804986206d5e6f072b592a5f5fdc

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 76dde65c1005e536fef1f3a5884ce8d768388e33766d6c5baeeb9dddcb6bf168
MD5 2cd348d53f21ce7e6f01000cd1282052
BLAKE2b-256 781fcca342705da16f95a75f2a5cdd5af0b3dea3161c714b6ebd8dd7f6f21f50

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2a71adcd31a68f0b8cc5a1b65c09244e35959f2b7d54fe9ae0c0cb1c818043a9
MD5 b3240b0bfba759157761beaec5338da9
BLAKE2b-256 f890d22203d15ba2f7720b784afb36fd413bf1f3b2e8860fa188938a2a8c1e61

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 780b7c555730e0735459ebb9463c349879023a24c5d4f7829fbebcfb61254200
MD5 0af27e59e467e9ed617bc6bf66ec61fe
BLAKE2b-256 311fae0dc126e02c0b9f40ab73a255338337f1023c26752292d0d577d7aeedad

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d04d58cca90bcd57cc09209767d4928f3b2b7f6f34015e627d97a48d59593f84
MD5 00daf45bea0e38c2e8dcfd09f404a0de
BLAKE2b-256 c665fe488e9f00566398078552d239720e60084a39a449eaee48231bbe4d2de1

See more details on using hashes here.

File details

Details for the file rusty_tags-0.6.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rusty_tags-0.6.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6bfdefbd5caec1476e8506a17cbe295f2932a2315617f7907303e3ec1da6bc64
MD5 97110929c6a71bde94678cdc2091af53
BLAKE2b-256 d947fac89a082f3a2f165f2bc1acfa034cc74d628287be6b5e258e83d8d8e991

See more details on using hashes here.

Supported by

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