No project description provided
Project description
sailpy - Python bindings for SAIL
The missing small and fast image decoding library for humans (not for machines).
Features
- Fast - Written in C/C++ for maximum performance
- 20+ image formats - JPEG, PNG, WebP, AVIF, TIFF, GIF, BMP, and more
- Format conversion - Easy pixel format conversion
- Metadata support - Access EXIF, ICC profiles, and more
- NumPy integration - Zero-copy access to pixel data
- Clean API - Simple and intuitive interface
Installation
From PyPI (Recommended)
Pre-built wheels with all dependencies included:
pip install sailpy
From Source
If building from source, you'll need system libraries installed first.
Linux (Debian/Ubuntu)
Minimal installation (JPEG, PNG, basic formats):
sudo apt-get update
sudo apt-get install -y \
build-essential \
cmake \
libjpeg-dev \
libpng-dev \
libgif-dev \
zlib1g-dev
pip install sailpy
Full installation (all codecs):
sudo apt-get update
sudo apt-get install -y \
build-essential \
cmake \
libjpeg-dev \
libpng-dev \
libtiff-dev \
libwebp-dev \
libavif-dev \
libheif-dev \
libgif-dev \
libjxl-dev \
libopenjp2-7-dev \
libopenexr-dev \
zlib1g-dev
pip install sailpy
macOS (Homebrew)
brew install \
cmake \
jpeg \
libpng \
libtiff \
webp \
libavif \
libheif \
giflib \
jpeg-xl \
openjpeg \
openexr \
zlib
pip install sailpy
Quick Start
import sailpy
import numpy as np
# Load an image
image = sailpy.Image.from_file("photo.jpg")
print(f"Size: {image.width}x{image.height}")
# Convert to NumPy array (zero-copy!)
pixels = image.to_numpy()
# Process with NumPy
inverted = 255 - pixels
# Save result
new_image = sailpy.Image.from_numpy(inverted, image.pixel_format)
new_image.save("output.png")
Supported Formats
| Format | Load | Save | Features |
|---|---|---|---|
| AVIF | ✅ | ✅ | Modern efficient format |
| BMP | ✅ | ✅ | Windows Bitmap |
| GIF | ✅ | ✅ | Animations |
| JPEG | ✅ | ✅ | Lossy compression |
| JPEG 2000 | ✅ | ✅ | Advanced JPEG |
| JPEG XL | ✅ | ✅ | Next-gen format |
| PNG | ✅ | ✅ | Lossless with alpha |
| PSD | ✅ | ❌ | Photoshop files |
| QOI | ✅ | ✅ | Quite OK Image |
| SVG | ✅ | ❌ | Vector graphics |
| TGA | ✅ | ✅ | Targa |
| TIFF | ✅ | ✅ | Multi-page support |
| WebP | ✅ | ✅ | Google's format |
...and more! See full list.
Examples
The package includes comprehensive examples demonstrating various features:
# View all available examples
import sailpy.examples
print(sailpy.examples.__doc__)
Run examples from command line:
python -m sailpy.examples.01_quickstart
python -m sailpy.examples.12_image_viewer # Qt-based image viewer
Available examples:
01_quickstart.py- Basic image loading and saving02_memory_io.py- Working with memory buffers03_features_and_options.py- Codec features and save options04_numpy_integration.py- NumPy array integration05_multiframe.py- Multi-frame image handling06_probe.py- Image probing without full loading07_codec_info.py- Querying codec information08_logging.py- Logging configuration09_image_transformations.py- Image transformations10_enum_usage.py- Working with enums11_advanced_saving.py- Advanced saving options12_image_viewer.py- Simple Qt-based image viewer
Basic Loading and Saving
import sailpy
# Load
image = sailpy.Image.from_file("input.jpg")
print(f"Format: {image.pixel_format}")
print(f"Size: {image.width}x{image.height}")
# Save in different format
image.save("output.png")
Format Conversion
import sailpy
image = sailpy.Image.from_file("input.jpg")
# Convert to RGBA
image.convert(sailpy.PixelFormat.BPP32_RGBA)
image.save("output.png")
NumPy Integration
import sailpy
import numpy as np
# Load image
image = sailpy.Image.from_file("photo.jpg")
# Get NumPy array (zero-copy when possible!)
pixels = image.to_numpy()
print(f"Array shape: {pixels.shape}")
# Apply filters
brightened = np.clip(pixels * 1.2, 0, 255).astype(np.uint8)
# Create new image from array
result = sailpy.Image.from_numpy(brightened, image.pixel_format)
result.save("brightened.png")
Batch Conversion
import sailpy
from pathlib import Path
input_dir = Path("images")
output_dir = Path("converted")
output_dir.mkdir(exist_ok=True)
for img_path in input_dir.glob("*.jpg"):
image = sailpy.Image.from_file(str(img_path))
image.convert(sailpy.PixelFormat.BPP24_RGB)
image.save(str(output_dir / f"{img_path.stem}.png"))
Image Information
import sailpy
image = sailpy.Image.from_file("photo.jpg")
print(f"Dimensions: {image.width}x{image.height}")
print(f"Pixel format: {image.pixel_format}")
print(f"Bits per pixel: {image.bits_per_pixel}")
print(f"Is RGB: {image.is_rgb_family}")
print(f"Is grayscale: {image.is_grayscale}")
Creating Images from Scratch
import sailpy
import numpy as np
# Create a new image
image = sailpy.Image(sailpy.PixelFormat.BPP24_RGB, 640, 480)
# Fill with color using NumPy
pixels = image.to_numpy()
pixels[:] = [0, 128, 255] # Blue color
# Or create gradient
pixels[:, :, 0] = np.linspace(0, 255, 640) # Red gradient
image.save("created.png")
Error Handling
import sailpy
# Error handling with specific exceptions
try:
image = sailpy.Image.from_file("image.xyz")
except FileNotFoundError:
print("File not found")
except ValueError as e:
print(f"Unsupported format or invalid parameters: {e}")
except Exception as e:
print(f"Error loading image: {e}")
# Check if format is supported before loading
try:
codec = sailpy.CodecInfo.from_path("image.xyz")
if not codec.can_load:
print(f"Format {codec.name} cannot load images")
else:
image = sailpy.Image.from_file("image.xyz")
except ValueError:
print("Format not supported")
except FileNotFoundError:
print("File not found")
Multi-Frame Images (Animations)
import sailpy
# Load animated GIF or multi-page TIFF
input = sailpy.ImageInput("animation.gif")
frames = input.load_all()
print(f"Total frames: {len(frames)}")
# Process each frame
for i, frame in enumerate(frames):
print(f"Frame {i}: {frame.width}x{frame.height}, delay={frame.delay}ms")
# Extract individual frames
frame.save(f"frame_{i:03d}.png")
# Or iterate frame by frame (memory efficient)
input = sailpy.ImageInput("animation.gif")
for i, frame in enumerate(input):
print(f"Processing frame {i}")
# Process frame...
# Load with custom options
options = sailpy.LoadOptions()
input = sailpy.ImageInput("image.tiff").with_options(options)
frames = input.load_all()
Working with Memory (Bytes)
import sailpy
import requests
# Load from HTTP
response = requests.get("https://example.com/image.jpg")
image = sailpy.Image.from_bytes(response.content)
# Save to memory
image_bytes = image.to_bytes("png")
print(f"PNG size in memory: {len(image_bytes)} bytes")
# Send over network, save to database, etc.
Image Transformations
import sailpy
image = sailpy.Image.from_file("photo.jpg")
# Rotate (creates new image)
rotated = image.rotate_to(sailpy.Orientation.ROTATED_90)
rotated.save("rotated_90.jpg")
# Mirror (in-place)
image.mirror(sailpy.Orientation.MIRRORED_HORIZONTALLY)
image.save("mirrored.jpg")
# Rotate in-place
image.rotate(sailpy.Orientation.ROTATED_180)
image.save("rotated_180.jpg")
# Apply EXIF orientation
if image.source_image and image.source_image.orientation:
corrected = image.rotate_to(image.source_image.orientation)
corrected.save("corrected.jpg")
Advanced: Frame-by-Frame Writing
import sailpy
# Save multi-page TIFF (memory efficient for large datasets)
output = sailpy.ImageOutput("document.tiff")
# Optional: Set save options
options = sailpy.SaveOptions()
options.compression = sailpy.Compression.DEFLATE
options.compression_level = 6
output = output.with_options(options)
# Save pages one by one
for page_num in range(10):
# Create or load page
page = sailpy.Image(sailpy.PixelFormat.BPP24_RGB, 1024, 768)
# ... fill page data ...
output.save(page)
output.finish()
print("Multi-page document created")
API Reference
Core Classes
Image
Main class representing an image with pixel data.
Constructors:
Image() # Create invalid image
Image(path: str) # Load from file
Image(pixel_format: PixelFormat, width: int, height: int) # Create empty
Properties:
width: int- Image width in pixelsheight: int- Image height in pixelspixel_format: PixelFormat- Pixel formatbits_per_pixel: int- Bits per pixelbytes_per_line: int- Bytes per scan linepixels_size: int- Total pixel data sizegamma: float- Gamma valuedelay: int- Animation frame delay (milliseconds)resolution: Resolution- Image resolutionsource_image: SourceImage- Source image informationmeta_data: MetaData- Image metadata (EXIF, etc.)iccp: Iccp- ICC profilepalette: Palette- Color palette (for indexed images)
Properties:
is_valid: bool- Check if image is validis_rgb_family: bool- Check if RGB-like formatis_grayscale: bool- Check if grayscaleis_indexed: bool- Check if indexed (palette-based)
Methods:
from_file(path: str) -> Image- Load from file (static)load(path: str)- Load from file (instance method)save(path: str, options: SaveOptions = None)- Save to fileconvert(pixel_format: PixelFormat)- Convert pixel format (in-place)convert_to(pixel_format: PixelFormat, options: ConversionOptions = None) -> Image- Convert to new imagerotate(orientation: Orientation)- Rotate image (in-place)rotate_to(orientation: Orientation) -> Image- Rotate to new imagemirror(orientation: Orientation)- Mirror image (in-place)to_numpy() -> np.ndarray- Get NumPy array view (zero-copy when possible)from_numpy(array: np.ndarray, pixel_format: PixelFormat) -> Image- Create from NumPy array (static)
ImageInput
Low-level interface for loading images with more control.
# Basic usage
input = ImageInput(path: str)
frames = input.load_all() # Load all frames
frame = input.next_frame() # Load next frame
input.stop() # Stop loading
# With custom options (builder pattern)
options = LoadOptions()
input = ImageInput("image.tiff").with_options(options)
frames = input.load_all()
# Force specific codec (for files with wrong/missing extension)
codec = CodecInfo.from_name("png")
input = ImageInput("image.dat").with_codec(codec)
ImageOutput
Low-level interface for saving images with more control.
# Basic usage
output = ImageOutput(path: str)
output.save(image: Image)
output.finish()
# With save options (builder pattern)
options = SaveOptions()
options.compression = Compression.JPEG
output = ImageOutput("output.tiff").with_options(options)
output.save(image)
output.finish()
# Force specific codec (for files with custom extension)
codec = CodecInfo.from_name("tiff")
output = ImageOutput("output.dat").with_codec(codec)
CodecInfo
Information about image format codecs.
Methods:
from_extension(ext: str) -> CodecInfo- Get codec by extensionfrom_path(path: str) -> CodecInfo- Get codec from file pathfrom_mime_type(mime: str) -> CodecInfo- Get codec by MIME typelist() -> List[CodecInfo]- Get all available codecs
Properties:
name: str- Codec namedescription: str- Codec descriptionversion: str- Codec versionextensions: List[str]- Supported file extensionsmime_types: List[str]- Supported MIME typesmagic_numbers: List[bytes]- Magic number patternscan_load: bool- Can load imagescan_save: bool- Can save imagesis_valid: bool- Check if codec info is validload_features: LoadFeatures- Supported load featuressave_features: SaveFeatures- Supported save features
Enums
PixelFormat
Pixel format enumeration.
RGB formats:
BPP24_RGB,BPP24_BGR- 24-bit RGB/BGRBPP32_RGBA,BPP32_BGRA- 32-bit RGB/BGR with alphaBPP48_RGB,BPP48_BGR- 48-bit RGB/BGRBPP64_RGBA,BPP64_BGRA- 64-bit RGB/BGR with alpha
Grayscale:
BPP8_GRAYSCALE,BPP16_GRAYSCALE- 8/16-bit grayscaleBPP8_GRAYSCALE_ALPHA,BPP16_GRAYSCALE_ALPHA- With alpha
Indexed:
BPP1_INDEXED,BPP2_INDEXED,BPP4_INDEXED,BPP8_INDEXED
Compression
Compression types for saving images.
Values: NONE, RLE, JPEG, DEFLATE, LZW, ZIP, ZSTD, etc.
LogLevel
Logging levels.
Values: SILENCE, ERROR, WARNING, INFO, DEBUG, TRACE
Support Classes
SaveOptions
Options for saving images.
options = SaveOptions()
options.compression = Compression.DEFLATE
options.compression_level = 6
# Codec-specific tuning (dict[str, Variant])
# IMPORTANT: Set the whole dict, not individual keys
options.tuning = {"png-filter": Variant("paeth")} # PNG: none, sub, up, avg, paeth
# Use with ImageOutput
output = ImageOutput("output.png").with_options(options)
output.save(image)
output.finish()
LoadOptions
Options for loading images.
options = LoadOptions()
# Most codecs don't require load options
# LoadOptions.tuning is available for codec-specific settings if needed
# Use with ImageInput
input = ImageInput("image.tiff").with_options(options)
frames = input.load_all()
Resolution
Image resolution information.
# Create and set resolution for an image
resolution = Resolution()
resolution.x = 300
resolution.y = 300
resolution.unit = ResolutionUnit.INCH
# Assign via property
image.resolution = resolution
# Access existing resolution
print(f"DPI: {image.resolution.x}x{image.resolution.y} {image.resolution.unit}")
MetaData
Image metadata container.
# Load metadata from loaded image
image = Image.from_file("photo.jpg")
meta = image.meta_data
if meta:
print(f"Key: {meta.key()}")
value = meta.value # Property, not method
if value.has_string():
print(f"Value: {value.to_string()}")
# Create and set metadata
new_meta = MetaData()
new_meta.set_key(MetaDataType.ARTIST)
variant = Variant()
variant.set_string("John Doe")
new_meta.set_value(variant)
# Add to image
image.set_meta_data([new_meta])
Functions
set_log_barrier(level: LogLevel)
Set minimum logging level.
sailpy.set_log_barrier(sailpy.LogLevel.DEBUG)
set_logger(callback: Callable)
Set custom logging callback.
def my_logger(level, message):
print(f"[SAIL {level}] {message}")
sailpy.set_logger(my_logger)
Version Information
import sailpy
# Get version string
print(sailpy.__version__) # e.g., "0.9.10"
Example Modules
The sailpy.examples package contains working examples:
# Find examples location
import sailpy.examples
print(sailpy.examples.__path__)
# Run programmatically
from sailpy.examples import example_01_quickstart
# example_01_quickstart.main() # If example has main()
Performance
SAIL is designed for performance:
- Zero-copy NumPy integration when possible
- Efficient C/C++ implementation
- Optimized codecs
- Minimal memory allocations
See benchmarks comparing SAIL to other libraries.
Requirements
- Python 3.9+
- NumPy 1.20+
Building from Source
git clone https://github.com/HappySeaFox/sail.git
cd sail/src/bindings/python
pip install -e .
License
MIT License - see LICENSE for details.
Links
- Homepage: https://sail.software
- GitHub: https://github.com/HappySeaFox/sail
- PyPI: https://pypi.org/project/sailpy/
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sailpy-0.9.10.tar.gz.
File metadata
- Download URL: sailpy-0.9.10.tar.gz
- Upload date:
- Size: 69.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
023c84d5a89f2638fbcd219dff63de97c08d95eac8d952d3b5d0022fa3fdf215
|
|
| MD5 |
5f973b5dd3ea27157d6be97af2c99ca3
|
|
| BLAKE2b-256 |
908f75c230e11e43a15805848b0ceb7fd34c3e4330b50622a6406c79475af145
|
Provenance
The following attestation bundles were made for sailpy-0.9.10.tar.gz:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10.tar.gz -
Subject digest:
023c84d5a89f2638fbcd219dff63de97c08d95eac8d952d3b5d0022fa3fdf215 - Sigstore transparency entry: 641968151
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 12.5 MB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3abde101fdbbe7e0b74a31475bb6292e2e5c7973b6b9b8e50154fed6d1231e58
|
|
| MD5 |
ed9eee00cb15523ec03d3ead08a82573
|
|
| BLAKE2b-256 |
108c95ca115dbea2893887368c1744ac29f6fc8ddf5a73557c1664adc33f6e25
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp314-cp314-win_amd64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp314-cp314-win_amd64.whl -
Subject digest:
3abde101fdbbe7e0b74a31475bb6292e2e5c7973b6b9b8e50154fed6d1231e58 - Sigstore transparency entry: 641968159
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp314-cp314-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp314-cp314-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 14.6 MB
- Tags: CPython 3.14, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64c2d42b3700b2b275341b625ef68b9f524487133b6625bce0ab490dbe03e06b
|
|
| MD5 |
e43d582d5fa19e0584ee5ce2a65831a1
|
|
| BLAKE2b-256 |
096e932c63986d96dac9e9b6b4951b037f26a9dc188b1b16c007aeb9a18760ab
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp314-cp314-manylinux_2_39_x86_64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp314-cp314-manylinux_2_39_x86_64.whl -
Subject digest:
64c2d42b3700b2b275341b625ef68b9f524487133b6625bce0ab490dbe03e06b - Sigstore transparency entry: 641968153
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 12.1 MB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b259ab06918dc96c9bd0ffd8e48116c42c1867241a0dbebe1b7507994292538e
|
|
| MD5 |
006048b3a5b120abe18413b5e405c7ae
|
|
| BLAKE2b-256 |
28758e1c90d8da63239338433dd990151c79721518d8c1230181246ac1c307ed
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp313-cp313-win_amd64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp313-cp313-win_amd64.whl -
Subject digest:
b259ab06918dc96c9bd0ffd8e48116c42c1867241a0dbebe1b7507994292538e - Sigstore transparency entry: 641968160
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp313-cp313-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp313-cp313-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 14.6 MB
- Tags: CPython 3.13, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37d469db4e3c60368c3780fcfb03a4c917a39b788fbd3ee42b50c38246448023
|
|
| MD5 |
e1d5eeb23f97769388ccb2ca9316cb1b
|
|
| BLAKE2b-256 |
f2da284bf1867ffee649c06ce58da9b3001adab71c77208198039ecf18f1e3ab
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp313-cp313-manylinux_2_39_x86_64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp313-cp313-manylinux_2_39_x86_64.whl -
Subject digest:
37d469db4e3c60368c3780fcfb03a4c917a39b788fbd3ee42b50c38246448023 - Sigstore transparency entry: 641968162
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 12.1 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
133a183843aaf0556dd1f9a4892824b516e0ace79699417bc6ec3419b7423a67
|
|
| MD5 |
b23651c28f1f7da0b00fca0e65488095
|
|
| BLAKE2b-256 |
868c7c993a4c6906a767e66773cf6ca7beb59b144e5bc69545e909a3992a6936
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp312-cp312-win_amd64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp312-cp312-win_amd64.whl -
Subject digest:
133a183843aaf0556dd1f9a4892824b516e0ace79699417bc6ec3419b7423a67 - Sigstore transparency entry: 641968154
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp312-cp312-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp312-cp312-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 14.6 MB
- Tags: CPython 3.12, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
647bb77e2d303743297d728b7a017805a5d853da630f19c64203fd9fd859dd83
|
|
| MD5 |
96cf797a063622cd0711f51e6476cc2d
|
|
| BLAKE2b-256 |
a9aa1126d53023f2e13bbe054620b12a6b5e9f189139e3ae15742adf1489d343
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp312-cp312-manylinux_2_39_x86_64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp312-cp312-manylinux_2_39_x86_64.whl -
Subject digest:
647bb77e2d303743297d728b7a017805a5d853da630f19c64203fd9fd859dd83 - Sigstore transparency entry: 641968163
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 12.1 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ac2d2139726507a63b58b275d622133d45c81e1065254a3054bd11ca8aa5012
|
|
| MD5 |
2f9df658cbad971e3845a6641bf7df79
|
|
| BLAKE2b-256 |
2871e2840edea812f4200881df215638a90f170f0a5904930d287548bf2c0e4b
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp311-cp311-win_amd64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp311-cp311-win_amd64.whl -
Subject digest:
5ac2d2139726507a63b58b275d622133d45c81e1065254a3054bd11ca8aa5012 - Sigstore transparency entry: 641968155
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp311-cp311-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp311-cp311-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 14.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67201bd4be1d9af0dc703de6533731fc4d652716410526d9653d811011fd1c57
|
|
| MD5 |
6a2bf2bb76a34802a1b14d0060dbfcaa
|
|
| BLAKE2b-256 |
441ad441b775b2923a25f89e279a41187c0a1872db92bf9e91f687612b9e462d
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp311-cp311-manylinux_2_39_x86_64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp311-cp311-manylinux_2_39_x86_64.whl -
Subject digest:
67201bd4be1d9af0dc703de6533731fc4d652716410526d9653d811011fd1c57 - Sigstore transparency entry: 641968156
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 12.1 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e89d8577da761961d351780f32ed9050db3cdca40b39d29f85751a84ffd0ec3
|
|
| MD5 |
610571be9c6f94d488125e78b1048a2d
|
|
| BLAKE2b-256 |
0b7ef9d921c1967f7b856c9093966d85f19455166b3f288d47d990bbed466987
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp310-cp310-win_amd64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp310-cp310-win_amd64.whl -
Subject digest:
7e89d8577da761961d351780f32ed9050db3cdca40b39d29f85751a84ffd0ec3 - Sigstore transparency entry: 641968157
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sailpy-0.9.10-cp310-cp310-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sailpy-0.9.10-cp310-cp310-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 14.6 MB
- Tags: CPython 3.10, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77f0a95da50dbf0f8dcabdda6c7d19620c9f9031a08cb2f9a70a0057f3c33df0
|
|
| MD5 |
b80d06f2158a727563d73b468921a005
|
|
| BLAKE2b-256 |
0754ecc60788d56126205b18e367a3fcbc7d7a1404c44c2af53ff0007261e13c
|
Provenance
The following attestation bundles were made for sailpy-0.9.10-cp310-cp310-manylinux_2_39_x86_64.whl:
Publisher:
build-python-wheels.yml on HappySeaFox/sail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sailpy-0.9.10-cp310-cp310-manylinux_2_39_x86_64.whl -
Subject digest:
77f0a95da50dbf0f8dcabdda6c7d19620c9f9031a08cb2f9a70a0057f3c33df0 - Sigstore transparency entry: 641968161
- Sigstore integration time:
-
Permalink:
HappySeaFox/sail@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Branch / Tag:
refs/tags/v0.9.10 - Owner: https://github.com/HappySeaFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-python-wheels.yml@cdd9d5f20bd0bf83683637afee61dd7e954162b2 -
Trigger Event:
push
-
Statement type: