Skip to main content

No project description provided

Project description

serpyco-rs: a serializer for python dataclasses

PyPI version Python versions CI status

What is serpyco-rs ?

Serpyco is a serialization library for Python 3.9+ dataclasses that works just by defining your dataclasses:

import dataclasses
import serpyco_rs

@dataclasses.dataclass
class Example:
    name: str
    num: int
    tags: list[str]


serializer = serpyco_rs.Serializer(Example)

result = serializer.dump(Example(name="foo", num=2, tags=["hello", "world"]))
print(result)

>> {'name': 'foo', 'num': 2, 'tags': ['hello', 'world']}

Inspired by serpyco.

serpyco-rs works by analysing the dataclass fields and can recognize many types : list, tuple, Optional... You can also embed other dataclasses in a definition.

The main use-case for serpyco-rs is to serialize objects for an API, but it can be helpful whenever you need to transform objects to/from builtin Python types.

Installation

Use pip to install:

$ pip install serpyco-rs

Features

  • Serialization and deserialization of dataclasses
  • Validation of input data
  • Very fast
  • Support recursive schemas
  • Generate JSON Schema Specification (Draft 2020-12)
  • Support custom encoders/decoders for fields
  • Support deserialization from query string parameters (MultiDict like structures) with from string coercion

Supported field types

There is support for generic types from the standard typing module:

  • Decimal
  • UUID
  • Time
  • Date
  • DateTime
  • Enum
  • List
  • Dict
  • Bytes (pass through)
  • TypedDict
  • Mapping
  • Sequence
  • Tuple (fixed size)
  • Literal[str, int, Enum.variant, ...]
  • Unions / Tagged unions
  • typing.NewType

Benchmarks

Linux

Load

Library Median latency (milliseconds) Operations per second Relative (latency)
serpyco_rs 0.16 6318.1 1
mashumaro 0.45 2244.4 2.81
pydantic 0.57 1753.9 3.56
serpyco 0.82 1228.3 5.17
marshmallow 8.49 117.4 53.35

Dump

Library Median latency (milliseconds) Operations per second Relative (latency)
serpyco_rs 0.07 13798 1
serpyco 0.07 13622 1.02
mashumaro 0.1 10219.5 1.36
pydantic 0.22 4615.5 2.99
marshmallow 2 497 27.69
MacOS macOS Monterey / Apple M1 Pro / 16GB RAM / Python 3.11.0

Load

Library Median latency (milliseconds) Operations per second Relative (latency)
serpyco_rs 0.1 9865.1 1
mashumaro 0.2 4968 2
pydantic 0.34 2866.7 3.42
serpyco 0.69 1444.1 6.87
marshmallow 4.14 241.8 41.05

Dump

Library Median latency (milliseconds) Operations per second Relative (latency)
serpyco_rs 0.04 22602.6 1
serpyco 0.05 21232.9 1.06
mashumaro 0.06 15903.4 1.42
pydantic 0.16 6262.6 3.61
marshmallow 1.04 962 23.5

Supported annotations

serpyco-rs supports changing load/dump behavior with typing.Annotated.

Currently available:

  • Alias
  • FieldFormat (CamelCase / NoFormat)
  • NoneFormat (OmitNone / KeepNone)
  • Discriminator
  • Min / Max
  • MinLength / MaxLength
  • CustomEncoder
  • NoneAsDefaultForOptional (ForceDefaultForOptional)

Alias

Alias is needed to override the field name in the structure used for load / dump.

from dataclasses import dataclass
from typing import Annotated
from serpyco_rs import Serializer
from serpyco_rs.metadata import Alias

@dataclass
class A:
    foo: Annotated[int, Alias('bar')]

ser = Serializer(A)

print(ser.load({'bar': 1}))
>> A(foo=1)

print(ser.dump(A(foo=1)))
>> {'bar': 1}

FieldFormat

Used to have response bodies in camelCase while keeping your python code in snake_case.

from dataclasses import dataclass
from typing import Annotated
from serpyco_rs import Serializer
from serpyco_rs.metadata import CamelCase, NoFormat

@dataclass
class B:
    buz_filed: str

@dataclass
class A:
    foo_filed: int
    bar_filed: Annotated[B, NoFormat]

ser = Serializer(Annotated[A, CamelCase])  # or ser = Serializer(A, camelcase_fields=True)

print(ser.dump(A(foo_filed=1, bar_filed=B(buz_filed='123'))))
>> {'fooFiled': 1, 'barFiled': {'buz_filed': '123'}}

print(ser.load({'fooFiled': 1, 'barFiled': {'buz_filed': '123'}}))
>> A(foo_filed=1, bar_filed=B(buz_filed='123'))

NoneFormat

Via OmitNone we can drop None values for non required fields in the serialized dicts

from dataclasses import dataclass
from serpyco_rs import Serializer

@dataclass
class A:
    required_val: bool | None
    optional_val: bool | None = None

ser = Serializer(A, omit_none=True) # or Serializer(Annotated[A, OmitNone])

print(ser.dump(A(required_val=None, optional_val=None)))
>>> {'required_val': None}

Unions

serpyco-rs supports unions of types.

from dataclasses import dataclass
from serpyco_rs import Serializer

@dataclass
class Foo:
    val: int

ser = Serializer(Foo | int)

print(ser.load({'val': 1}))
>> Foo(val=1)
print(ser.load(1))
>> 1

But performance of unions is worse than for single dataclasses. Because we need to check all possible types in the union. For better performance, you can use Tagged unions.

Tagged unions

Supports tagged joins with discriminator field.

All classes in the union must be dataclasses or attrs with discriminator field Literal[str] or Literal[Enum.variant].

The discriminator field is always mandatory.

from typing import Annotated, Literal
from dataclasses import dataclass
from serpyco_rs import Serializer
from serpyco_rs.metadata import Discriminator

@dataclass
class Foo:
    type: Literal['foo']
    value: int

@dataclass(kw_only=True)
class Bar:
    type: Literal['bar'] = 'bar'
    value: str

ser = Serializer(list[Annotated[Foo | Bar, Discriminator('type')]])

print(ser.load([{'type': 'foo', 'value': 1}, {'type': 'bar', 'value': 'buz'}]))
>>> [Foo(type='foo', value=1), Bar(type='bar', value='buz')]

Min / Max

Supported for int / float / Decimal types and only for validation on load.

from typing import Annotated
from serpyco_rs import Serializer
from serpyco_rs.metadata import Min, Max

ser = Serializer(Annotated[int, Min(1), Max(10)])

ser.load(123)
>> SchemaValidationError: [ErrorItem(message='123 is greater than the maximum of 10', instance_path='')]

MinLength / MaxLength

MinLength / MaxLength can be used to restrict the length of loaded strings.

from typing import Annotated
from serpyco_rs import Serializer
from serpyco_rs.metadata import MinLength

ser = Serializer(Annotated[str, MinLength(5)])

ser.load("1234")
>> SchemaValidationError: [ErrorItem(message='"1234" is shorter than 5 characters', instance_path='')]

NoneAsDefaultForOptional

ForceDefaultForOptional / KeepDefaultForOptional can be used to set None as default value for optional (nullable) fields.

from dataclasses import dataclass
from serpyco_rs import Serializer


@dataclass
class Foo:
    val: int                 # not nullable + required
    val1: int | None         # nullable + required
    val2: int | None = None  # nullable + not required

ser_force_default = Serializer(Foo, force_default_for_optional=True)  # or Serializer(Annotated[Foo, ForceDefaultForOptional])
ser = Serializer(Foo)

# all fields except val are optional and nullable
assert ser_force_default.load({'val': 1}) == Foo(val=1, val1=None, val2=None) 

# val1 field is required and nullable and val1 should be present in the dict
ser.load({'val': 1})
>> SchemaValidationError: [ErrorItem(message='"val1" is a required property', instance_path='')]

Custom encoders for fields

You can provide CustomEncoder with serialize and deserialize functions, or serialize_with and deserialize_with annotations.

from typing import Annotated
from dataclasses import dataclass
from serpyco_rs import Serializer
from serpyco_rs.metadata import CustomEncoder

@dataclass
class Foo:
    val: Annotated[str, CustomEncoder[str, str](serialize=str.upper, deserialize=str.lower)]

ser = Serializer(Foo)
val = ser.dump(Foo(val='bar'))
>> {'val': 'BAR'}
assert ser.load(val) == Foo(val='bar') 

Note: CustomEncoder has no effect to validation and JSON Schema generation.

Bytes fields

serpyco-rs can loads bytes fields as is (without base64 encoding and validation).

from dataclasses import dataclass
from serpyco_rs import Serializer

@dataclass
class Foo:
    val: bytes

ser = Serializer(Foo)
ser.load({'val': b'123'}) == Foo(val=b'123')

Getting JSON Schema

serpyco-rs can generate JSON Schema for your dataclasses (Draft 2020-12).

from dataclasses import dataclass
from serpyco_rs import Serializer

@dataclass
class A:
    """Description of A"""
    foo: int
    bar: str

ser = Serializer(A)

print(ser.get_json_schema())
>> {
    '$schema': 'https://json-schema.org/draft/2020-12/schema', 
    '$ref': '#/components/schemas/A', 
    'components': {
        'schemas': {
            'A': {
                'properties': {
                    'foo': {'type': 'integer'}, 
                    'bar': {'type': 'string'}
                }, 
                'required': ['foo', 'bar'], 
                'type': 'object', 
                'description': 'Description of A'
            }
        }
    }
}

Also, you can configure the schema generation via JsonSchemaBuilder.

from dataclasses import dataclass
from serpyco_rs import Serializer, JsonSchemaBuilder

@dataclass
class A:
    foo: int
    bar: str

ser = Serializer(A)

builder = JsonSchemaBuilder(
  add_dialect_uri=False,
  ref_prefix='#/definitions',
)

print(builder.build(ser))
>> {'$ref': '#/definitions/__main__.A'}

print(builder.get_definitions())
>> {
  "__main__.A": {
    "properties": {
      "foo": {
        "type": "integer"
      },
      "bar": {
        "type": "string"
      }
    },
    "required": [
      "foo",
      "bar"
    ],
    "type": "object"
  }
}

Query string deserialization

serpyco-rs can deserialize query string parameters (MultiDict like structures) with from string coercion.

from dataclasses import dataclass
from urllib.parse import parse_qsl

from serpyco_rs import Serializer
from multidict import MultiDict

@dataclass
class A:
    foo: int
    bar: str

ser = Serializer(A)

print(ser.load_query_params(MultiDict(parse_qsl('foo=1&bar=2'))))
>> A(foo=1, bar='2')

Custom Type Support

In serpyco-rs, you can add support for your own types by using the custom_type_resolver parameter and the CustomType class. This allows you to define how your custom types should be serialized and deserialized.

CustomType

The CustomType class is a way to define how a custom type should be serialized and deserialized. It is a generic class that takes two type parameters: the type of the object to be serialized/deserialized and the type of the serialized/deserialized object.

Here is an example of a CustomType for IPv4Address:

from serpyco_rs import CustomType
from ipaddress import IPv4Address, AddressValueError

class IPv4AddressType(CustomType[IPv4Address, str]):
    def serialize(self, obj: IPv4Address) -> str:
        return str(obj)

    def deserialize(self, data: str) -> IPv4Address:
        try:
            return IPv4Address(data)
        except AddressValueError:
            raise ValueError(f"Invalid IPv4 address: {data}")

    def get_json_schema(self) -> dict:
        return {"type": "string", "format": "ipv4"}

In this example, IPv4AddressType is a CustomType that serializes IPv4Address objects to strings and deserializes strings to IPv4Address objects. The get_json_schema method returns the JSON schema for the custom type.

custom_type_resolver

The custom_type_resolver is a function that takes a type as input and returns an instance of CustomType if the type is supported, or None otherwise. This function is passed to the Serializer constructor.

Here is an example of a custom_type_resolver that supports IPv4Address:

def custom_type_resolver(t: type) -> CustomType | None
    if t is IPv4Address:
        return IPv4AddressType()
    return None

ser = Serializer(MyDataclass, custom_type_resolver=custom_type_resolver)

In this example, the custom_type_resolver function checks if the type is IPv4Address and returns an instance of IPv4AddressType if it is. Otherwise, it returns None. This function is then passed to the Serializer constructor, which uses it to handle IPv4Address fields in the dataclass.

Full Example

from dataclasses import dataclass
from ipaddress import IPv4Address
from serpyco_rs import Serializer, CustomType

# Define custom type for IPv4Address
class IPv4AddressType(CustomType[IPv4Address, str]):
    def serialize(self, value: IPv4Address) -> str:
        return str(value)

    def deserialize(self, value: str) -> IPv4Address:
        return IPv4Address(value)

    def get_json_schema(self):
        return {
            'type': 'string',
            'format': 'ipv4',
        }

# Defining custom_type_resolver
def custom_type_resolver(t: type) -> CustomType | None:
    if t is IPv4Address:
        return IPv4AddressType()
    return None

@dataclass
class Data:
    ip: IPv4Address

# Use custom_type_resolver in Serializer
serializer = Serializer(Data, custom_type_resolver=custom_type_resolver)

# Example usage
data = Data(ip=IPv4Address('1.1.1.1'))
serialized_data = serializer.dump(data)  # {'ip': '1.1.1.1'}
deserialized_data = serializer.load(serialized_data)  # Data(ip=IPv4Address('1.1.1.1'))

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

serpyco_rs-1.11.0.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

serpyco_rs-1.11.0-cp313-none-win_amd64.whl (336.1 kB view details)

Uploaded CPython 3.13 Windows x86-64

serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (450.9 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl (601.5 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ s390x

serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (467.9 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ppc64le

serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (477.6 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ppc64

serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (456.9 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARMv7l

serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (451.6 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (801.8 kB view details)

Uploaded CPython 3.13 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

serpyco_rs-1.11.0-cp312-none-win_amd64.whl (337.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (451.3 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (601.5 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (468.1 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (478.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64

serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (457.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (451.8 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (793.1 kB view details)

Uploaded CPython 3.12 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

serpyco_rs-1.11.0-cp311-none-win_amd64.whl (338.6 kB view details)

Uploaded CPython 3.11 Windows x86-64

serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (451.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (597.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (466.9 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (476.7 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64

serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (456.0 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (450.0 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (794.8 kB view details)

Uploaded CPython 3.11 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

serpyco_rs-1.11.0-cp310-none-win_amd64.whl (334.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (597.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (466.9 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (476.7 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64

serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (456.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (450.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (794.7 kB view details)

Uploaded CPython 3.10 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

serpyco_rs-1.11.0-cp39-none-win_amd64.whl (341.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (453.2 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (598.2 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (467.5 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (477.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64

serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (456.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (450.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (795.0 kB view details)

Uploaded CPython 3.9 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

File details

Details for the file serpyco_rs-1.11.0.tar.gz.

File metadata

  • Download URL: serpyco_rs-1.11.0.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.1

File hashes

Hashes for serpyco_rs-1.11.0.tar.gz
Algorithm Hash digest
SHA256 70a844615ffb229e6e89c204b3ab7404aacaf2838911814c7d847969b8da2e3a
MD5 0c67363f7282e165307515291397f3b8
BLAKE2b-256 68a9a67f1f7574ac0031c774bbaaad18ac49320c3d28f37613fba90805d57a31

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-none-win_amd64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-none-win_amd64.whl
Algorithm Hash digest
SHA256 84ee2c109415bd81904fc9abb9aec86a5dd13166808c21142cf23ec639f683bd
MD5 ee550bdeebeae4a5746dfb9ecbe0e83c
BLAKE2b-256 d5b76b8eb0706f1800606fe3c325e421e1e165ff3862c9c837d1a47b4b28eacf

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15438a076047c34cff6601a977df54948e8d39d1a86f89d05c48bc60f4c12a61
MD5 6a7120119107319061e08a150328783b
BLAKE2b-256 e186658b653aba728d7b46407021c1c4f6e3036a71b34d746a7d5f5565339282

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 5f8e6ba499f6a0825bee0d8f8764569d367af871b563fc6512c171474e8e5383
MD5 59b6feb1f7d0444d9cb77556b243b066
BLAKE2b-256 798b5d1e7d7ca69cf8d6149195a1082853c6d7d0092128a40cb27d6cd7ee3065

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f47c23132d4e03982703a7630aa09877b41e499722142f76b6153f6619b612f3
MD5 d20d0e1ff73fe2ce048208795fc96cf6
BLAKE2b-256 100608a8ed9729fbc44772be7e9fd238ec22de4b3a74afb920b791d4b703a523

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 18500ebc5e75285841e35585a238629a990b709e14f68933233640d15ca17d5f
MD5 1041fb26c7caf1b165dab6615119cc3d
BLAKE2b-256 3e535610aa773abf30693f037d6aeb18dac54b6a4dbd016f1a6887310ecd59eb

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 e7dde9ef09cdfaf7c62378186b9e29f54ec76114be4c347be6a06dd559c5681e
MD5 6b332e8ac2c6ac388cc0cb1a2fd0aeab
BLAKE2b-256 158cb4319d9910f4ad07212c8f6849cfc94464415c00188c73d249e1b8384457

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3c18bf511316f3abf648a68ee62ef88617bec57d3fcde69466b4361102715ae5
MD5 fc2c85e2ad36074285b4b6082711e0bd
BLAKE2b-256 91a6b2f1feeb4f99330a47f71c51682a941ad73d386f04ecc7f8fae7ff6398ef

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 3028893366a1985adcedb13fa8f6f98c087c185efc427f94c2ccdafa40f45832
MD5 ed98347d5c7500be18569b6daa2b709c
BLAKE2b-256 e80fb2b6076c8687c6e82115e1782303027b7bed34b13c43b891044c7b08a969

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 00081eae77fbf4c5d88371c5586317ab02ccb293a330b460869a283edf2b7b69
MD5 8f02472dafa062f6202620dfd4036da3
BLAKE2b-256 8c1776e02919cbfb09b0966fe6316a4a042959c490b36ac4efb85c07551e053a

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15609158b0d9591ffa118302cd9d0039970cb3faf91dce32975f7d276e7411d5
MD5 14c32791f68cc632e38630f0b571dabc
BLAKE2b-256 4e8e47c7b6717032b013deaef2fb7cef369fb417ef4b4ed1be124ed0be4b4ad7

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 d29c8f9aeed734a3b51f7349d04ec9063516ffa4e10b632d75e9b1309e4930e4
MD5 aa4c0f8de6a32d23d10da4aac65ce7e1
BLAKE2b-256 a5f4c8214534e468a763c93eddda9d1c130a4dc4d194205789b6ab2936ff86c9

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 c8fd79051f9af9591fc03cf7d3033ff180416301f6a4fd3d1e3d92ebd2d68697
MD5 bb57acf0e9a523fdac7acaf1077775e3
BLAKE2b-256 6ba7406a1ffd09b1adad8a24fd3f925764d456703c3706dfa97bdc79b0d59369

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 79481a455b76cc56021dc55bb6d5bdda1b2b32bcb6a1ee711b597140d112e9b1
MD5 f646795ed14bb560ad42a3b908bf5576
BLAKE2b-256 37a550cdcfde5c1b1ac0ce4ae0a82448a626ae5ff2c396a9d8737ee95e7052db

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 42118463c1679846cffd2f06f47744c9b9eb33c5d0448afd88ea19e1a81a8ddd
MD5 9c5998f455bbea814e28a7edfc23ff52
BLAKE2b-256 3be5bc155537d1c28b0a57bc742eae53fac04ee5be57506bb24462d8a5bae9a9

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7772410d15694b03f9c5500a2c47d62eed76e191bea4087ad042250346b1a38e
MD5 5d4860ee73a37edab884a6805617954f
BLAKE2b-256 aa0ee66bd11fc277a4cbd5a66ddca6706f82892ea647bbf60f147c720e9d71ed

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 3ea93d485f03dc8b0cfb0d477f0ad2e86e78f0461b53010656ab5b4db1b41fb0
MD5 d146133b6589ba17dc881a31c84954b3
BLAKE2b-256 1831d6cb84d9ac57b2002707134fa4c5d0b7540eb200d8a344b30dcf6a2e0f6b

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 37fc1cf192bef9784fbf1f4e03cec21750b9e704bef55cc0442f71a715eee920
MD5 e3549a34de3a84fccb1539f44fc05536
BLAKE2b-256 ca2026aa23fd5f7fb467e9df614fca19595e3dbe7419172bf302adea1abd1533

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 84f497361952d4566bc1f77e9e15a84a2614f593cc671fbf0a0fa80046f9c3d7
MD5 597b3997e7bea0a023fa77bc3181cc1e
BLAKE2b-256 a9b9f585df612dad43afa7648eab46cff5c9f04ea076b08b2aed04fd84aa2bde

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 5c92e36b0ab6fe866601c2331f7e99c809a126d21963c03d8a5c29331526deed
MD5 3a5f30abb1ee178856a61dc9de1061c4
BLAKE2b-256 37a42ad4d4cfbf67536df182fab2be8a010b3c0c1e5604ea31ffd11c8a10865a

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 3480e09e473560c60e74aaa789e6b4d079637371aae0a98235440111464bbba7
MD5 5650ea66d9493ed0f6395c8c3dad1069
BLAKE2b-256 65fd7c3c7e9da67be8191ba45f4a9893c3df506cf4a44cd608fe0b63714feebf

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 b52ef8affb7e71b9b98a7d5216d6a7ad03b04e990acb147cd9211c8b931c5487
MD5 10f806da5fae938e92c8cf6a79971daf
BLAKE2b-256 02c7f5805c3ddba45c2b5a1166f1702e7e038e89729d0d65ee0ed0f766d278e7

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 7192eb3df576386fefd595ea31ae25c62522841ffec7e7aeb37a80b55bdc3213
MD5 23a1e12e6bf3c098243b6e517d7cffcb
BLAKE2b-256 30de27aad627e3277753b2d924daefb8d8c1c7bd6dc51d95467404768212f692

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6090d9a1487237cdd4e9362a823eede23249602019b917e7bd57846179286e79
MD5 52962ab43a992a4aab31a9487008e98a
BLAKE2b-256 8deba2dd5dc0a513c6cbc95502aeb45b544cfb668f1149e9a26b160716a7c934

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 8d47ee577cf4d69b53917615cb031ad8708eb2f59fe78194b1968c13130fc2f7
MD5 af8f788b3dc43246d993ec4ff5f3ee7b
BLAKE2b-256 a316e600ff346c792742e6f63d1237550ef29377f32802bf0fe6dc08fbb96d94

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 c7b60aef4c16d68efb0d6241f05d0a434d873d98449cbb4366b0d385f0a7172b
MD5 c0e5724222be3d17c54d9b6883022203
BLAKE2b-256 04614b1a7ac177b9d190e9f5c2bea943243b5ad176547ac8bc652eacc0759f12

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4d4808df5384e3e8581e31a90ba7a1fa501c0837b1f174284bb8a4555b6864ea
MD5 597b8cb002f549d3b9f42c96b5b9e422
BLAKE2b-256 09f1381c18166ad27b3761cbfa88df246d2a2a03a99fd25d5faf6f0b70fe49b9

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 5a72bfbd282af17ebe76d122639013e802c09902543fdbbd828fb2159ec9755e
MD5 898ae251eb80dbca3958232069b21f97
BLAKE2b-256 8219686944dbde456f8271e004c5ce86e507447fad637f54b762ba62c8925b59

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 bda437d86e8859bf91c189c1f4650899822f6d6d7b02b48f5729da904eb7bb7d
MD5 b63a31a7eaa14c868b12c2deba14aadc
BLAKE2b-256 66d9f50ac952166a8d5377595e42bd1af296e2b38c61431db1a3b4a7a8aa8c82

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 9ce46683d92e34abb20304817fc5ac6cb141a06fc7468dedb1d8865a8a9682f6
MD5 6d69fe4d81db7d994abe86b5b4bd7bbd
BLAKE2b-256 dee9b00c2ecdabec663681ec3391b18e677ab833f54140a72535c7cdcaac5266

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b0933620abc01434023e0e3e22255b7e4ab9b427b5a9a5ee00834656d792377a
MD5 bca9e29aa894b4da84db86e977a7935a
BLAKE2b-256 d58d78cb1d658997fb567ab590ad321c2b36d316642097e5793a8eedaaabd9f5

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 627f957889ff73c4d2269fc7b6bba93212381befe03633e7cb5495de66ba9a33
MD5 ee6111a49fecaf9503bfa5cf064112bc
BLAKE2b-256 8f15390d0988ceb17abdd22c2050e369e0851b449f8714e835597aaec40ec8df

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 4b2bd933539bd8c84315e2fb5ae52ef7a58ace5a6dfe3f8b73f74dc71216779e
MD5 1a3d6429e66ea2626ea0d39ca833bd1f
BLAKE2b-256 74a9f15f4350a20cf50d18e91e0fe80fdb0ed977d45ba2509ddf562057f72d2b

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-none-win_amd64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 0fee1c89ec2cb013dc232e4ebef88e2844357ce8631063b56639dbfb83762f20
MD5 e95b2515b59c1149365af83d50ec06c5
BLAKE2b-256 f10173e4fa23c7ae8eb24cee61add8db791a2eb0f1b1a0fe3a91ab1af236d803

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 038d748bfff31f150f0c3edab2766b8843edb952cb1bd3bf547886beb0912dae
MD5 95132915e27d9535e9ed99dad25d8405
BLAKE2b-256 4d2319af96569aedc254a5e7e39305c63d9bc675ff0fae6e5af8a02824af240c

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 e2b8b6f205e8cc038d4d30dd0e70eece7bbecc816eb2f3787c330dc2218e232d
MD5 2327a6e12b911ede561869546e382a46
BLAKE2b-256 2fb45383fc8bb58d536fb4708fc8756af461ac25611ff8039b3f8ee199f9a8a6

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 29d72b748acce4b4e3c7c9724e1eb33d033a1c26b08a698b393e0288060e0901
MD5 0e346ab168e336045076034c945e73f7
BLAKE2b-256 cd5b725184447607a115d79c84abeaa1a2d655aeb04b83ee06abf56c13269ac3

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 3a46f334af5a9d77acc6e1e58f355ae497900a2798929371f0545e274f6e6166
MD5 45b55cabef935635a6c9c52dfbe2edd6
BLAKE2b-256 5d02739432b88911fcf86296e977f8a59ce9cca6738f032c9a57694d9f7f3c12

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 24d220220365110edba2f778f41ab3cf396883da0f26e1361a3ada9bd0227f73
MD5 e744696cd66068997d954be4eb1ce253
BLAKE2b-256 dc041e8dd19c66cdc2712666e4119690fe87e3093dd5e6bfb92e323134fdf145

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 47825e70f86fd6ef7c4a835dea3d6e8eef4fee354ed7b39ced99f31aba74a86e
MD5 6698d2c657c375c08adb3c4b0d23c69d
BLAKE2b-256 b4d311c3ff770641c09361fe4ea3983df532ac404c88033466fdb2ef9447b0d0

See more details on using hashes here.

File details

Details for the file serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 5c97c16c865261577fac4effeccc7ef5e0a1e8e35e7a3ee6c90c77c3a4cd7ff9
MD5 ac3bba954e53eef27dcccf8c5244e717
BLAKE2b-256 323851272b62791cdd1229ec927657f9071e62378987c16bf7bd954ef73a4f50

See more details on using hashes here.

Supported by

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