Skip to content
/ tzst Public

The next-generation Python library engineered for modern archive management, leveraging cutting-edge Zstandard compression to deliver superior performance, security, and reliability

License

Notifications You must be signed in to change notification settings

xixu-me/tzst


codecov CodeQL CI/CD PyPI - Version PyPI - Downloads GitHub License Sponsor Documentation

πŸ‡ΊπŸ‡Έ English | πŸ‡¨πŸ‡³ 汉语 | πŸ‡ͺπŸ‡Έ espaΓ±ol | πŸ‡―πŸ‡΅ ζ—₯本θͺž | πŸ‡¦πŸ‡ͺ Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ© | πŸ‡·πŸ‡Ί русский | πŸ‡©πŸ‡ͺ Deutsch | πŸ‡«πŸ‡· franΓ§ais | πŸ‡°πŸ‡· ν•œκ΅­μ–΄ | πŸ‡§πŸ‡· portuguΓͺs

tzst is a next-generation Python library engineered for modern archive management, leveraging cutting-edge Zstandard compression to deliver superior performance, security, and reliability. Built exclusively for Python 3.12+, this enterprise-grade solution combines atomic operations, streaming efficiency, and a meticulously crafted API to redefine how developers handle .tzst/.tar.zst archives in production environments. πŸš€

✨ Features

  • πŸ—œοΈ High Compression: Zstandard compression for excellent compression ratios and speed
  • πŸ“ Tar Compatibility: Creates standard tar archives compressed with Zstandard
  • πŸ’» Command Line Interface: Intuitive CLI with streaming support and comprehensive options
  • 🐍 Python API: Clean, Pythonic API for programmatic use
  • 🌍 Cross-Platform: Works on Windows, macOS, and Linux
  • πŸ“‚ Multiple Extensions: Supports both .tzst and .tar.zst extensions
  • πŸ’Ύ Memory Efficient: Streaming mode for handling large archives with minimal memory usage
  • ⚑ Atomic Operations: Safe file operations with automatic cleanup on interruption
  • πŸ”’ Secure by Default: Uses the 'data' filter for maximum security during extraction
  • 🚨 Enhanced Error Handling: Clear error messages with helpful alternatives

πŸ“₯ Installation

From GitHub Releases

Download standalone executables that don't require Python installation:

Supported Platforms

Platform Architecture File
🐧 Linux x86_64 tzst-{version}-linux-amd64.zip
🐧 Linux ARM64 tzst-{version}-linux-arm64.zip
πŸͺŸ Windows x64 tzst-{version}-windows-amd64.zip
πŸͺŸ Windows ARM64 tzst-{version}-windows-arm64.zip
🍎 macOS Intel tzst-{version}-darwin-amd64.zip
🍎 macOS Apple Silicon tzst-{version}-darwin-arm64.zip

πŸ› οΈ Installation Steps

  1. πŸ“₯ Download the appropriate archive for your platform from the latest releases page
  2. πŸ“¦ Extract the archive to get the tzst executable (or tzst.exe on Windows)
  3. πŸ“‚ Move the executable to a directory in your PATH:
    • 🐧 Linux/macOS: sudo mv tzst /usr/local/bin/
    • πŸͺŸ Windows: Add the directory containing tzst.exe to your PATH environment variable
  4. βœ… Verify installation: tzst --help

🎯 Benefits of Binary Installation

  • βœ… No Python required - Standalone executable
  • βœ… Faster startup - No Python interpreter overhead
  • βœ… Easy deployment - Single file distribution
  • βœ… Consistent behavior - Bundled dependencies

πŸ“¦ From PyPI

pip install tzst

πŸ”§ From Source

git clone https://github.com/xixu-me/tzst.git
cd tzst
pip install .

πŸš€ Development Installation

This project uses modern Python packaging standards:

git clone https://github.com/xixu-me/tzst.git
cd tzst
pip install -e .[dev]

πŸš€ Quick Start

πŸ’» Command Line Usage

Note: Download the standalone binary for the best performance and no Python dependency. Alternatively, use uvx tzst for running without installation. See uv documentation for details.

# πŸ“ Create an archive
tzst a archive.tzst file1.txt file2.txt directory/

# πŸ“€ Extract an archive
tzst x archive.tzst

# πŸ“‹ List archive contents
tzst l archive.tzst

# πŸ§ͺ Test archive integrity
tzst t archive.tzst

🐍 Python API Usage

from tzst import create_archive, extract_archive, list_archive

# Create an archive
create_archive("archive.tzst", ["file1.txt", "file2.txt", "directory/"])

# Extract an archive
extract_archive("archive.tzst", "output_directory/")

# List archive contents
contents = list_archive("archive.tzst", verbose=True)
for item in contents:
    print(f"{item['name']}: {item['size']} bytes")

πŸ’» Command Line Interface

πŸ“ Archive Operations

βž• Create Archive

# Basic usage
tzst a archive.tzst file1.txt file2.txt

# With compression level (1-22, default: 3)
tzst a archive.tzst files/ -l 15

# Alternative commands
tzst add archive.tzst files/
tzst create archive.tzst files/

πŸ“€ Extract Archive

# Extract with full directory structure
tzst x archive.tzst

# Extract to specific directory
tzst x archive.tzst -o output/

# Extract specific files
tzst x archive.tzst file1.txt dir/file2.txt

# Extract without directory structure (flat)
tzst e archive.tzst -o output/

# Use streaming mode for large archives
tzst x archive.tzst --streaming -o output/

πŸ“‹ List Contents

# Simple listing
tzst l archive.tzst

# Verbose listing with details
tzst l archive.tzst -v

# Use streaming mode for large archives
tzst l archive.tzst --streaming -v

πŸ§ͺ Test Integrity

# Test archive integrity
tzst t archive.tzst

# Test with streaming mode
tzst t archive.tzst --streaming

πŸ“Š Command Reference

Command Aliases Description Streaming Support
a add, create Create or add to archive N/A
x extract Extract with full paths βœ“ --streaming
e extract-flat Extract without directory structure βœ“ --streaming
l list List archive contents βœ“ --streaming
t test Test archive integrity βœ“ --streaming

βš™οΈ CLI Options

  • -v, --verbose: Enable verbose output
  • -o, --output DIR: Specify output directory (extract commands)
  • -l, --level LEVEL: Set compression level 1-22 (create command)
  • --streaming: Enable streaming mode for memory-efficient processing
  • --filter FILTER: Security filter for extraction (data/tar/fully_trusted)
  • --no-atomic: Disable atomic file operations (not recommended)

πŸ”’ Security Filters

# Extract with maximum security (default)
tzst x archive.tzst --filter data

# Extract with standard tar compatibility
tzst x archive.tzst --filter tar

# Extract with full trust (dangerous - only for trusted archives)
tzst x archive.tzst --filter fully_trusted

πŸ” Security Filter Options:

  • data (default): Most secure. Blocks dangerous files, absolute paths, and paths outside extraction directory
  • tar: Standard tar compatibility. Blocks absolute paths and directory traversal
  • fully_trusted: No security restrictions. Only use with completely trusted archives

🐍 Python API

πŸ“¦ TzstArchive Class

from tzst import TzstArchive

# Create a new archive
with TzstArchive("archive.tzst", "w", compression_level=5) as archive:
    archive.add("file.txt")
    archive.add("directory/", recursive=True)

# Read an existing archive
with TzstArchive("archive.tzst", "r") as archive:
    # List contents
    contents = archive.list(verbose=True)
    
    # Extract with security filter
    archive.extract("file.txt", "output/", filter="data")
    
    # Test integrity
    is_valid = archive.test()

# For large archives, use streaming mode
with TzstArchive("large_archive.tzst", "r", streaming=True) as archive:
    archive.extract(path="output/")

⚠️ Important Limitations:

  • ❌ Append Mode Not Supported: Create multiple archives or recreate the entire archive instead

🎯 Convenience Functions

πŸ“ create_archive()

from tzst import create_archive

# Create with atomic operations (default)
create_archive(
    archive_path="backup.tzst",
    files=["documents/", "photos/", "config.txt"],
    compression_level=10
)

πŸ“€ extract_archive()

from tzst import extract_archive

# Extract with security (default: 'data' filter)
extract_archive("backup.tzst", "restore/")

# Extract specific files
extract_archive("backup.tzst", "restore/", members=["config.txt"])

# Flatten directory structure
extract_archive("backup.tzst", "restore/", flatten=True)

# Use streaming for large archives
extract_archive("large_backup.tzst", "restore/", streaming=True)

πŸ“‹ list_archive()

from tzst import list_archive

# Simple listing
files = list_archive("backup.tzst")

# Detailed listing
files = list_archive("backup.tzst", verbose=True)

# Streaming for large archives
files = list_archive("large_backup.tzst", streaming=True)

πŸ§ͺ test_archive()

from tzst import test_archive

# Basic integrity test
if test_archive("backup.tzst"):
    print("Archive is valid")

# Test with streaming
if test_archive("large_backup.tzst", streaming=True):
    print("Large archive is valid")

πŸ”§ Advanced Features

πŸ“‚ File Extensions

The library automatically handles file extensions with intelligent normalization:

  • .tzst - Primary extension for tar+zstandard archives
  • .tar.zst - Alternative standard extension
  • Auto-detection when opening existing archives
  • Automatic extension addition when creating archives
# These all create valid archives
create_archive("backup.tzst", files)      # Creates backup.tzst
create_archive("backup.tar.zst", files)  # Creates backup.tar.zst  
create_archive("backup", files)          # Creates backup.tzst
create_archive("backup.txt", files)      # Creates backup.tzst (normalized)

πŸ—œοΈ Compression Levels

Zstandard compression levels range from 1 (fastest) to 22 (best compression):

  • Level 1-3: Fast compression, larger files
  • Level 3 (default): Good balance of speed and compression
  • Level 10-15: Better compression, slower
  • Level 20-22: Maximum compression, much slower

🌊 Streaming Mode

Use streaming mode for memory-efficient processing of large archives:

βœ… Benefits:

  • Significantly reduced memory usage
  • Better performance for archives that don't fit in memory
  • Automatic cleanup of resources

🎯 When to Use:

  • Archives larger than 100MB
  • Limited memory environments
  • Processing archives with many large files
# Example: Processing a large backup archive
from tzst import extract_archive, list_archive, test_archive

large_archive = "backup_500gb.tzst"

# Memory-efficient operations
is_valid = test_archive(large_archive, streaming=True)
contents = list_archive(large_archive, streaming=True, verbose=True)
extract_archive(large_archive, "restore/", streaming=True)

⚑ Atomic Operations

All file creation operations use atomic file operations by default:

  • Archives created in temporary files first, then atomically moved
  • Automatic cleanup if process is interrupted
  • No risk of corrupted or incomplete archives
  • Cross-platform compatibility
# Atomic operations enabled by default
create_archive("important.tzst", files)  # Safe from interruption

# Can be disabled if needed (not recommended)
create_archive("test.tzst", files, use_temp_file=False)

🚨 Error Handling

from tzst import TzstArchive
from tzst.exceptions import (
    TzstError,
    TzstArchiveError,
    TzstCompressionError,
    TzstDecompressionError,
    TzstFileNotFoundError
)

try:
    with TzstArchive("archive.tzst", "r") as archive:
        archive.extract()
except TzstDecompressionError:
    print("Failed to decompress archive")
except TzstFileNotFoundError:
    print("Archive file not found")
except KeyboardInterrupt:
    print("Operation interrupted by user")
    # Cleanup handled automatically

πŸš€ Performance and Comparison

πŸ’‘ Performance Tips

  1. πŸ—œοΈ Compression levels: Level 3 is optimal for most use cases
  2. 🌊 Streaming: Use for archives larger than 100MB
  3. πŸ“¦ Batch operations: Add multiple files in single session
  4. πŸ“„ File types: Already compressed files won't compress much further

πŸ†š vs Other Tools

vs tar + gzip:

  • βœ… Better compression ratios
  • ⚑ Faster decompression
  • πŸ”„ Modern algorithm

vs tar + xz:

  • πŸš€ Significantly faster compression
  • πŸ“Š Similar compression ratios
  • βš–οΈ Better speed/compression trade-off

vs zip:

  • πŸ—œοΈ Better compression
  • πŸ” Preserves Unix permissions and metadata
  • 🌊 Better streaming support

πŸ“‹ Requirements

  • 🐍 Python 3.12 or higher
  • πŸ“¦ zstandard >= 0.19.0

πŸ› οΈ Development

πŸš€ Setting up Development Environment

This project uses modern Python packaging standards:

git clone https://github.com/xixu-me/tzst.git
cd tzst
pip install -e .[dev]

πŸ§ͺ Running Tests

# Run tests with coverage
pytest --cov=tzst --cov-report=html

# Or use the simpler command (coverage settings are in pyproject.toml)
pytest

✨ Code Quality

# Check code quality
ruff check src tests

# Format code
ruff format src tests

🀝 Contributing

We welcome contributions! Please read our Contributing Guide for:

  • Development setup and project structure
  • Code style guidelines and best practices
  • Testing requirements and writing tests
  • Pull request process and review workflow

πŸš€ Quick Start for Contributors

git clone https://github.com/xixu-me/tzst.git
cd tzst
pip install -e .[dev]
python -m pytest tests/

🎯 Types of Contributions Welcome

  • πŸ› Bug fixes - Fix issues in existing functionality
  • ✨ Features - Add new capabilities to the library
  • πŸ“š Documentation - Improve or add documentation
  • πŸ§ͺ Tests - Add or improve test coverage
  • ⚑ Performance - Optimize existing code
  • πŸ”’ Security - Address security vulnerabilities

πŸ™ Acknowledgments

πŸ“„ License

Copyright Β© 2025 Xi Xu. All rights reserved.

Licensed under the BSD 3-Clause license.

About

The next-generation Python library engineered for modern archive management, leveraging cutting-edge Zstandard compression to deliver superior performance, security, and reliability

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Sponsor this project

Contributors 4

  •  
  •  
  •  
  •  

Languages