Skip to main content

##ugrapheme Unicode Extended grapheme clusters in nanoseconds

PyPI - Version PyPI - License PyPI - Downloads
GitHub Actions Workflow Status GitHub branch check runs PyPI - Status PyPI - Wheel

Use ugrapheme to make your Python and Cython code see strings as a sequence of grapheme characters, so that the length of 👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi is 4 instead of 13.

Trivial operations like reversing a string, getting the first and last character, etc. become easy not just for Latin and Emojis, but Devanagari, Hangul, Tamil, Bengali, Arabic, etc. Centering and justifying Emojis and non-Latin text in terminal output becomes easy again, as ugrapheme uses uwcwidth under the hood.

ugrapheme exposes an interface that's almost identical to Python's native strings and maintains a similar performance envelope, processing strings at hundreds of megabytes or even gigabytes per second:

graphemes graphemes
result
str str
result
g = graphemes('👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi') s = '👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi'
len(g) 4 len(s) 13
print(g[0]) 👩🏽‍🔬 print(s[0]) 👩
print(g[2]) H print(s[2]) 🔬
print(g[2:]) Hi print(s[2:]) ‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi
print(g[::-1]) iH🏴󠁧󠁢󠁳󠁣󠁴󠁿👩🏽‍🔬 print(s[::-1]) iH󠁿󠁴󠁣󠁳󠁢󠁧🏴🔬‍🏽👩
g.find('🔬') -1 s.find('🔬') 3
print(','.join(g)) 👩🏽‍🔬,🏴󠁧󠁢󠁳󠁣󠁴󠁿,H,i print(','.join(s)) 👩,🏽,‍,🔬,🏴,󠁧,󠁢,󠁳,󠁣,󠁴,󠁿,H,i
print(g.center(10, '-')) --👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi-- print(s.center(10, '-')) 👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi
print(max(g)) 👩🏽‍🔬 print(max(s)) unprintable
print(','.join(set(g))) i,🏴󠁧󠁢󠁳󠁣󠁴󠁿,👩🏽‍🔬,H print(','.join(set(s))) ,H,󠁿,🏴,‍,󠁳,󠁴,i,󠁧,󠁢,🏽,👩,🔬

Just like native Python strings, graphemes  are hashable, iterable and pickleable.

Aside from passing the Unicode 16.0 UAX #29 Extended Grapheme Clusters grapheme break tests, ugrapheme correctly parses many difficult cases that break other libraries in Python and other languages.

As of this writing (October 2024), ugrapheme is among the fastest and probably among more correct implementations across all programming languages and operating systems.

Installation

pip install ugrapheme

Basic usage

In [1]: from ugrapheme import graphemes
In [2]: g = graphemes("👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi")
In [3]: print(g[0])
👩🏽‍🔬
In [4]: print(g[-1])
i
In [5]: len(g)
Out[5]: 4
In [6]: print(g.center(10) + '\n0123456789')
  👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi
0123456789
In [7]: print(g * 5)
👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi
In [8]: print(g.join(["Ho", "Hey"]))
Ho👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿HiHey
In [9]: print(g.replace('🏴󠁧󠁢󠁳󠁣󠁴󠁿','<scotland>'))
👩🏽‍🔬<scotland>Hi
In [10]: namaste = graphemes('नमस्ते')
In [11]: list(namaste)
Out[11]: ['न', 'म', 'स्ते']
In [12]: print('>> ' + g[::-1] + namaste + ' <<')
>> iH🏴󠁧󠁢󠁳󠁣󠁴󠁿👩🏽‍🔬नमस्ते <<

Documentation

Aside from this file, all public methods have detailed docstrings with examples, which should hopefully show up in IPython, VS Code, Jupyter Notebook or whatever else you happen to be using.

Performance: pyuegc 25x slower, uniseg 45x slower, ...

The popular Python grapheme splitting libraries are dramatically slower. Some could not even return the correct results despite spending orders of magnitude more CPU on the same task.

I gave these libraries the benefit of doubt by employing them on simple tasks such as returning the list of graphemes. The graphemes object takes an even smaller amount of time to build and takes less memory than a Python list of strings that these libraries expect you to work with, but let's try and do apples to apples here..

pyuegc: 24x slower

In [1]: from pyuegc import EGC
In [2]: from ugrapheme import grapheme_split
In [3]: print(','.join(EGC("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्छे,द
In [4]: print(','.join(grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्छे,द
In [5]: %%timeit
   ...: EGC("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")
8.19 μs ± 77.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
In [6]: %%timeit
    ...: grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")
337 ns ± 3.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

uniseg: 45x slower, incorrect

In [1]: from uniseg.graphemecluster import grapheme_clusters
In [2]: from ugrapheme import grapheme_split
In [3]: print(','.join(grapheme_clusters("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))  # Wrong
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्,छे,द
In [4]: print(','.join(grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))     # Correct
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्छे,द
In [5]: %%timeit
    ...: list(grapheme_clusters("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद"))
14.6 μs ± 107 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
In [6]: %%timeit
    ...: grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")
340 ns ± 5.31 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

grapheme: 52x slower, incorrect

In [1]: from grapheme import graphemes
In [2]: from ugrapheme import grapheme_split
In [3]: print(','.join(graphemes("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))         # Wrong
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्,छे,द
In [4]: print(','.join(grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))    # Correct
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्छे,द
In [5]: %%timeit
   ...: list(graphemes("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद"))
17.4 μs ± 26.4 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
In [6]: %%timeit
   ...: grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")
332 ns ± 0.79 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

pyicu: 8x slower

In [1]: import icu
   ...: def iterate_breaks(text, break_iterator):
   ...:     text = icu.UnicodeString(text)
   ...:     break_iterator.setText(text)
   ...:     lastpos = 0
   ...:     while True:
   ...:         next_boundary = break_iterator.nextBoundary()
   ...:         if next_boundary == -1: return
   ...:         yield str(text[lastpos:next_boundary])
   ...:         lastpos = next_boundary
   ...: bi = icu.BreakIterator.createCharacterInstance(icu.Locale.getRoot())
In [2]: from ugrapheme import grapheme_split
In [3]: print(','.join(iterate_breaks("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद", bi)))
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्छे,द
In [4]: print(','.join(grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")))
H,e,l,l,o, ,👩🏽‍🔬,!, ,👩🏼‍❤️‍💋‍👨🏾, ,अ,नु,च्छे,द
In [5]: %%timeit
   ...: list(iterate_breaks("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद", bi))
2.84 μs ± 23.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
In [6]: %%timeit
   ...: grapheme_split("Hello 👩🏽‍🔬! 👩🏼‍❤️‍💋‍👨🏾 अनुच्छेद")
337 ns ± 4.1 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

In order for PyICU to split correctly, the strings need explicit conversion from/to icu.UnicodeString. While Python strings index into Unicode codepoints/characters, the boundaries returned by PyICU iterators are unfortunately indices into a UTF-8 representation of the string, even if you pass in a native Python string initially. Thanks to Behdad Esfahbod of harfbuzz fame for catching this.

Gotchas and performance tips

Standalone functions for highest performance

The graphemes type is overall optimized for minimal CPU overhead, taking nanoseconds to instantiate and around 4 bytes extra for each string character. However, if you want absolutely the maximum performance and only want specific grapheme information, try the grapheme_ family of standalone functions as these do not allocate memory or preprocess the input string in any way:

In [1]: from ugrapheme import (grapheme_len, grapheme_split,
    ...:  grapheme_iter, grapheme_at, grapheme_slice)
In [2]: grapheme_len("👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi")
Out[2]: 4

In [3]: grapheme_split('नमस्ते')
Out[3]: ['न', 'म', 'स्ते']

In [4]: grapheme_slice('👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi', 2, 4)
Out[4]: 'Hi'

In [5]: grapheme_at('नमस्ते', 2)
Out[5]: 'स्ते'

In [6]: for gr in grapheme_iter('👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi'):
    ...:     print(gr)
    ...:
👩🏽‍🔬
🏴󠁧󠁢󠁳󠁣󠁴󠁿
H
i

Just like the graphemes methods, the individual functions can be cimported into Cython for even less overhead.

Concatenating

The fastest way to concatenate many graphemes and strings into another graphemes is to join them by using graphemes('').join, for example:

g2 = graphemes('').join(['>> ', g, ' -- ', namaste, ' <<'])

If you are just joining everything into a string, use the string .join method, it will work fine and be faster. Converting a graphemes object into a string is instantaneous, as graphemes works with native Python strings internally:

s2 = ''.join(['>> ', g, ' -- ', namaste, ' <<'])

Slices are strings, not graphemes

When you take a slice of a graphemes, you get back a Python string.

If you want to keep working with graphemes(), use the gslice method:

In [2]: g = graphemes("👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿Hi")
In [3]: print(g[:2])
👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿
In [4]: len(g[:2])   # Returns 11, because g[:2] is a string
Out[4]: 11
In [5]: print(g.gslice(end=2))
👩🏽‍🔬🏴󠁧󠁢󠁳󠁣󠁴󠁿
In [6]: len(g.gslice(end=2))
Out[6]: 2

Using gslice constructs another graphemes object, which takes additional CPU and memory. Not returning graphemes saves a bunch of nanoseconds (percentage-wise) on very small strings, but unfortunately introduces this quirk.

Cython

If you are using graphemes in a Cython project, you can further dramatically improve performance by doing a cimport of the provided .pxd files. There are fully-typed versions of operations such as accessing individual grapheme characters, slicing, find, replace, append, etc.

Performance explained

What's hard about this?

Not only are individual graphemes formed by rules that take dozens of pages to describe, there's tables that need to be consulted. If naively implemented, you are computing hashes for each codepoint and doing random access across hundreds of kilobytes or even megabytes of RAM.

To make things even more complex, Python internally represents strings in different data formats depending on whether they contain ASCII, Latin1, 2-byte unicode or 4-byte unicode characters and whether they are "compact" or not. ugrapheme internally understands the different formats and has separate low-level implementations for different combinations of underlying formats.

Custom sparse bitmaps instead of tables, tries or maps

Using custom sparse bitmap datastructures, ugrapheme stores properties for every possible unicode codepoint in less than 11KB of data, comfortably fitting into L1 cache of most CPUs produced in the last 20 years. The property lookup costs 2 loads, a few shifts and maybe a compare or two. Furthermore, similar characters occur in similar places, so for most text only a few smaller contiguous portions of tables are actually used and read.

Simpler LL(1) parser / DFA

Instead of implementing the state machine suggested by UAX #29, ugrapheme implements the rules as an LL(1) grammar parsed by a DFA with a very small number of states. An attempt is made towards a minimum number of codepoint property lookups to decide on a state transition. An unsigned comparison is used as an early Bloom filter for properties. Eventually, the CPU's branch predictor gets trained on the text you are processing and skips character classes your text does not belong to. Easier strings to process, such as those containing mostly ASCII or Latin1 will take less than a nanosecond per character on a fast 2024 laptop, reaching around 1.5 GB/second.

CPython optimizations

The underlying Python string representation is kept and not copied or transformed, reducing memory pressure. Concatenations, joins, replications and substring replaces are done speculatively, assuming easy cases and reverting to more memory allocation or recalculations of underlying grapheme boundaries as rarely as possible.

Mirroring the Reykjavik Need for Speed sprint from 2 decades ago, the efforts of Andrew Dalke and late Frederik Lundh have been replicated in spirit, so that we can match or even sometimes beat the native Python string library. Generally, there's hand-coded solutions to subcases in instantiation, replicating, concatenating, search and replace when they give a significant performance advantage.

Cython optimizations

In performance-critical loops, we sometimes do away with using Python/Cython object types and instead deal directly with the PyObject *, to avoid Cython generating unnecessary reference count increments and decrements. Decrements in particular include checks and threaten to jump into a maze of deallocation code, confusing both the compiler and the CPU.

Correctness

Like many other libraries, ugrapheme passes the unicode.org UAX #29 suggested GraphemeBreakTest.txt .

Separately, there's a brute-force exhaustive test over all possible unicode codepoints for ugrapheme custom sparse bitmap data structures.

Separate tests cover many cases where concatenating or replacing a portion of a grapheme changes the underlying grapheme boundaries.

Here's some examples of corner cases:

from ugrapheme import graphemes

len(graphemes('hi') + chr(13))
# outputs 3

len(graphemes('hi') + chr(13) + chr(10))
# also outputs 3, because chr(13) + chr(10) is a single grapheme!

len(graphemes('hi') + chr(10) + 'there')
# outputs 8

len((graphemes('hi') + chr(10) + 'there').replace('i', 'i' + chr(13)))
# also outputs 8, because chr(13) + chr(10) is a single grapheme! 

g = graphemes('Hi👍')
len(g)
# outputs 3

g += '🏾'  # Adding a Fitzpatrick skin type modifier...
len(g)     # ..does not change the grapheme length
# outputs 3
g
# outputs graphemes('Hi👍🏾')

Additionally, there's explicit tests for complicated graphemes known to have caused issues with other libraries, such as Devanagari conjuncts.

For slicing, joining and replacing substrings, there are extra unittests done to make sure we always create the correct underlying python string representation (ASCII, Latin1, 2-byte or 4-byte).

Limitations

graphemes() string length is limited to 4,294,967,294 unicode codepoints.

The stand-alone functions grapheme_split, grapheme_len, grapheme_at, etc. are not affected by this limit and work on all sizes.

Giving credit

The whole library is licensed under the most permissive license I could find, so there are absolutely no legal requirements for giving credit.

However, outside of legal requirements, I promise that those who misrepresent this work as theirs will be dealt with in a professional demoscene way.

License for Unicode Data Files (not packaged by default)

The test files for ugrapheme, available under ugrapheme_ucd/data are

Copyright © 1991-2024 Unicode, Inc.

and provided under the UNICODE LICENSE V3. See ugrapheme_ucd/data/LICENSE.

The ugrapheme_ucd/data is not shipped with the ugrapheme library build, but only included inside the testing component.

License

© 2024 !ZAJC!/GDS

Licensed under the BSD Zero Clause License. See LICENSE in the project root, or the SPDX 0BSD page for full license information.

The SPDX license identifier for this project is 0BSD.

Release files for ugrapheme 0.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ugrapheme 0.8
File Size Uploaded
ugrapheme-0.8.tar.gz 56.0 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for ugrapheme 0.8
File
ugrapheme-0.8-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
ugrapheme-0.8-cp313-cp313-win32.whl CPython 3.13 CPython 3.13 Windows x86-32 Details
ugrapheme-0.8-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
ugrapheme-0.8-cp313-cp313-musllinux_1_2_i686.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-32 Details
ugrapheme-0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
ugrapheme-0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.13 CPython 3.13 Linux glibc 2.5+ x86-32, Linux glibc 2.17+ x86-32 Details
ugrapheme-0.8-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
ugrapheme-0.8-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
ugrapheme-0.8-cp312-cp312-win32.whl CPython 3.12 CPython 3.12 Windows x86-32 Details
ugrapheme-0.8-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
ugrapheme-0.8-cp312-cp312-musllinux_1_2_i686.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-32 Details
ugrapheme-0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
ugrapheme-0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-32, Linux glibc 2.5+ x86-32 Details
ugrapheme-0.8-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
ugrapheme-0.8-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
ugrapheme-0.8-cp311-cp311-win32.whl CPython 3.11 CPython 3.11 Windows x86-32 Details
ugrapheme-0.8-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
ugrapheme-0.8-cp311-cp311-musllinux_1_2_i686.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-32 Details
ugrapheme-0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
ugrapheme-0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.11 CPython 3.11 Linux glibc 2.5+ x86-32, Linux glibc 2.17+ x86-32 Details
ugrapheme-0.8-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
ugrapheme-0.8-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
ugrapheme-0.8-cp310-cp310-win32.whl CPython 3.10 CPython 3.10 Windows x86-32 Details
ugrapheme-0.8-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details
ugrapheme-0.8-cp310-cp310-musllinux_1_2_i686.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-32 Details
ugrapheme-0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
ugrapheme-0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.10 CPython 3.10 Linux glibc 2.5+ x86-32, Linux glibc 2.17+ x86-32 Details
ugrapheme-0.8-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
ugrapheme-0.8-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
ugrapheme-0.8-cp39-cp39-win32.whl CPython 3.9 CPython 3.9 Windows x86-32 Details
ugrapheme-0.8-cp39-cp39-musllinux_1_2_x86_64.whl CPython 3.9 CPython 3.9 Linux musl 1.2+ x86-64 Details
ugrapheme-0.8-cp39-cp39-musllinux_1_2_i686.whl CPython 3.9 CPython 3.9 Linux musl 1.2+ x86-32 Details
ugrapheme-0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ x86-64 Details
ugrapheme-0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.9 CPython 3.9 Linux glibc 2.5+ x86-32, Linux glibc 2.17+ x86-32 Details
ugrapheme-0.8-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details
ugrapheme-0.8-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
ugrapheme-0.8-cp38-cp38-win32.whl CPython 3.8 CPython 3.8 Windows x86-32 Details
ugrapheme-0.8-cp38-cp38-musllinux_1_2_x86_64.whl CPython 3.8 CPython 3.8 Linux musl 1.2+ x86-64 Details
ugrapheme-0.8-cp38-cp38-musllinux_1_2_i686.whl CPython 3.8 CPython 3.8 Linux musl 1.2+ x86-32 Details
ugrapheme-0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.17+ x86-64 Details
ugrapheme-0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.8 CPython 3.8 Linux glibc 2.5+ x86-32, Linux glibc 2.17+ x86-32 Details
ugrapheme-0.8-cp38-cp38-macosx_11_0_arm64.whl CPython 3.8 CPython 3.8 macOS 11.0+ ARM64 Details

Total release size: 40.8 MB

Release files / ugrapheme-0.8.tar.gz

Download URL ugrapheme-0.8.tar.gz
Size 56.0 kB
Tags Source
SHA-256 checksum
How to use checksums
57a5e8c4afb8b9cac18e5c4b662e6b0ba932cae87baab9577dd4c9423c443940
BLAKE2b-256 checksum
How to use checksums
6d8a670a6c92c3014d67a8af24299c2ed72574cbeedf02ae9bb2180bb9265939
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-win_amd64.whl

Download URL ugrapheme-0.8-cp313-cp313-win_amd64.whl
Size 258.2 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
619359156bd3f8dc29d587e8c0397cd71452866d6148314ca2a3329a61eb34b9
BLAKE2b-256 checksum
How to use checksums
ce8dca79fdc4059ccc311d9b4e732ece5840f3789693448b6ccaaeacecf51925
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-win32.whl

Download URL ugrapheme-0.8-cp313-cp313-win32.whl
Size 232.2 kB
Tags CPython 3.13 Windows x86-32
SHA-256 checksum
How to use checksums
0473d50a8a45a5d0c0e683b7d5810bd5912e24faa6e04d3adb2242c12db719e1
BLAKE2b-256 checksum
How to use checksums
d662a27a5ad82ae4b3744c2d7ae9f11d56cf697e148900b9d2469bfa32b893c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL ugrapheme-0.8-cp313-cp313-musllinux_1_2_x86_64.whl
Size 1.6 MB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
e89a5ef3dbe2d021be68cc5448b323654cf33dc998a468801d8038f26e0e99ca
BLAKE2b-256 checksum
How to use checksums
54452e169e91ef3d52cb1202b6e720005e6a23acbc63c151808bdd3da7d89c46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-musllinux_1_2_i686.whl

Download URL ugrapheme-0.8-cp313-cp313-musllinux_1_2_i686.whl
Size 1.5 MB
Tags CPython 3.13 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
41715c84eac300695bc5a93d90e46e2de229d9ea7d5c71e990270fd83e54d89d
BLAKE2b-256 checksum
How to use checksums
222cb35e7ea523fcbb161d90075e01342ee51dd7984cd97b1e5c131a5ff41a00
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL ugrapheme-0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.6 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
1e021fbe49084b73468f3f222a03e4bc96cffd35a0e23b5eaff93130de9b413f
BLAKE2b-256 checksum
How to use checksums
9096c0b24450534fd1886c35bcc13fdffbcf69593d667a5d85bcb09610f17263
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl

Download URL ugrapheme-0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Size 1.5 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
90bdacbde8ee387ac8efd98fea0994238b4eb24f535ba535ddb37df4421921a4
BLAKE2b-256 checksum
How to use checksums
f8979535eeaf93aeb5a1266dcffa9f681ac8161613adba88c1be6f216015f4f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp313-cp313-macosx_11_0_arm64.whl

Download URL ugrapheme-0.8-cp313-cp313-macosx_11_0_arm64.whl
Size 273.1 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6ecf541f3029a9077c42ae3afb4c3b03bdd59dbb03a1acbaa9cee1ee0e52ed8b
BLAKE2b-256 checksum
How to use checksums
14a87b2c8e465a29e96841d99ffc09bc3a33fc40edf43d89a7292503c8f4ecfd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-win_amd64.whl

Download URL ugrapheme-0.8-cp312-cp312-win_amd64.whl
Size 263.1 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
bc300f5bf2d0a6f47550223d6e7741f447afac34c69036cc380bac2283c5bbaf
BLAKE2b-256 checksum
How to use checksums
56b2fb2fd46693002d69ee7b16eb55b0d4f534fb8feb238263a3f2c74f691015
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-win32.whl

Download URL ugrapheme-0.8-cp312-cp312-win32.whl
Size 235.2 kB
Tags CPython 3.12 Windows x86-32
SHA-256 checksum
How to use checksums
da3af676efaf92c26a667ce63b74c7186f19698309cf95810f7ef12881656d11
BLAKE2b-256 checksum
How to use checksums
2e0a75f9ff650b411269ad38d84cf0f5772142ac93e38b671a3d868ddab98fbb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL ugrapheme-0.8-cp312-cp312-musllinux_1_2_x86_64.whl
Size 1.6 MB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
759563e60dccbeea9bf75d74f52e6a1c970c435b79a8de6d1f20d7d79c38cd89
BLAKE2b-256 checksum
How to use checksums
b7c089e538d5d955e701eb98fb6f90b823180308821555986e75de48e3797f3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-musllinux_1_2_i686.whl

Download URL ugrapheme-0.8-cp312-cp312-musllinux_1_2_i686.whl
Size 1.6 MB
Tags CPython 3.12 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
0894e3cd88a9e2c62dd3171583f5fd66e97d72ac8f4cd8bf5de67999b1577202
BLAKE2b-256 checksum
How to use checksums
a068542f840a63092e2061a3966fc405bd4949531da93ae8622df179453303b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL ugrapheme-0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.6 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
10328e7500a1e16ef72bc4b63b55a6ac1d74bfbea21cc2f32332d3d69584e5e7
BLAKE2b-256 checksum
How to use checksums
82cc642a6f307840175e5d3990e17fe4f29b570eb1849b1bd25ffdf4fa268a42
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl

Download URL ugrapheme-0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Size 1.5 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
b21b27c63fc85ed294acff3d6109f549e45a7fd7958359a937a10b92c3177f3d
BLAKE2b-256 checksum
How to use checksums
28cc9c7f03cdadc9730a8ffb8855f330c487467fe521f31b10ccd31ffeb5bb56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp312-cp312-macosx_11_0_arm64.whl

Download URL ugrapheme-0.8-cp312-cp312-macosx_11_0_arm64.whl
Size 278.0 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9b7b1bab3557bce6561966d41197697ed0f6437bd0d324d2cb6aa828128ed547
BLAKE2b-256 checksum
How to use checksums
0597b68befe44e2b68089c204c633c08bf305f7b2c9ba9b21c372e6b42283d4d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-win_amd64.whl

Download URL ugrapheme-0.8-cp311-cp311-win_amd64.whl
Size 264.0 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
d49af0e61822711f5617faa664eca19040dc72ac5106b38121699c5f8cfdec75
BLAKE2b-256 checksum
How to use checksums
d6d8c4dfc41a6fefeceba4fd68a6ea170aabf5354487d95fa8297dd0a7a75856
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-win32.whl

Download URL ugrapheme-0.8-cp311-cp311-win32.whl
Size 236.1 kB
Tags CPython 3.11 Windows x86-32
SHA-256 checksum
How to use checksums
cc4e6702fc6c2d31048049d50d25ba0483edc3c63d4b805ff7bacf855f830c17
BLAKE2b-256 checksum
How to use checksums
3a916994c07005d3f19f47ce0bc68c2502c38c4b946e2376cbade0f9c94f3652
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL ugrapheme-0.8-cp311-cp311-musllinux_1_2_x86_64.whl
Size 1.6 MB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
524b70593be4bad613bf44d55282aa5423d42dcaf89e980c9ed3449fbf8e3ffa
BLAKE2b-256 checksum
How to use checksums
12825ee9f07549607fedd5bd9ca43ad679458b2e223992dce7934dc9928388e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-musllinux_1_2_i686.whl

Download URL ugrapheme-0.8-cp311-cp311-musllinux_1_2_i686.whl
Size 1.6 MB
Tags CPython 3.11 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
4a3d0f7c9f17a30e9a314cef9de30bdd2be99e20aefbccdea6c6933f3dfaf4f8
BLAKE2b-256 checksum
How to use checksums
56e3a6abdf534f0fee55957dd23257b8e0592d5be81b3d4b3a367e6abd7c16ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL ugrapheme-0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.6 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
30b3edd036993f03844c5a0833d34ea5193eb6fea9136c352d4042ecdbe94cb1
BLAKE2b-256 checksum
How to use checksums
780ab10d16a54556e9795cec274dec2705b77c2bdcf472513a45da7b909cebf3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl

Download URL ugrapheme-0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Size 1.5 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
edde1f0410b62d57939c47d030d2080a3fdec05d9fcb4f9f2b9585ec3c1a677b
BLAKE2b-256 checksum
How to use checksums
7cc648ec4c416902fcaa029aeca37ba2d2bc9cbf17f40386945573df341458ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp311-cp311-macosx_11_0_arm64.whl

Download URL ugrapheme-0.8-cp311-cp311-macosx_11_0_arm64.whl
Size 276.1 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
997038edafc285e8f31cd34959de023d21254d79713c996404c0739d616e3734
BLAKE2b-256 checksum
How to use checksums
0db02a6c534f3ff87ccc003229e1df3e28968c8083e211249142465cd598811b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-win_amd64.whl

Download URL ugrapheme-0.8-cp310-cp310-win_amd64.whl
Size 263.4 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
645c68092ef33c1266ee6d2bac100760f12f1eee1b0204b0a8e9b79e6d909237
BLAKE2b-256 checksum
How to use checksums
bbe73f6c8473feab203a6ac30f6090a3b577ecd10ce95526f63bc5c2a992cf77
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-win32.whl

Download URL ugrapheme-0.8-cp310-cp310-win32.whl
Size 236.6 kB
Tags CPython 3.10 Windows x86-32
SHA-256 checksum
How to use checksums
acb5379c6a90d8ee1a1aab890335119ddb94acf5517ffda4e6daecc6d19e7adf
BLAKE2b-256 checksum
How to use checksums
68ed56a0d8af4a5c029cbbcd33ac84c02f513b45805b231f6a1fb8ab0e8ba3a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL ugrapheme-0.8-cp310-cp310-musllinux_1_2_x86_64.whl
Size 1.5 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
e0d2cd6ddcc4d840eda4d589a849ecdb4ce176fc63f5536e1ff7c1b8eb3669e6
BLAKE2b-256 checksum
How to use checksums
342e7820d21e41b98ec81a6c82737e9323ffac27a0a8b8af3658f01b8532c082
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-musllinux_1_2_i686.whl

Download URL ugrapheme-0.8-cp310-cp310-musllinux_1_2_i686.whl
Size 1.4 MB
Tags CPython 3.10 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
fe8888be3b9da7f64cb866a4567d3c38377eec0664469452cafdc136f0fc5879
BLAKE2b-256 checksum
How to use checksums
fbbd14df68b6c10ffb919eeba30ed1529392fad0f180cb34517daeb1f7e07915
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL ugrapheme-0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
2f4909f4c3a0952c78e4ef90049b9a2c9f800a6039db80ddcafe0a848a58f4a0
BLAKE2b-256 checksum
How to use checksums
a7490f7c9376c3dac267742f6a3dd568da0a3429d074c03c0f2b509b384400d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl

Download URL ugrapheme-0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Size 1.4 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
e506589aa0ece33e0d9e565220126308e57093d2829bbf1bcb05b96982db7335
BLAKE2b-256 checksum
How to use checksums
3808bb6d50540a45b77cc855f4845e05a5153c58af835cc588e8f639ab17b734
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp310-cp310-macosx_11_0_arm64.whl

Download URL ugrapheme-0.8-cp310-cp310-macosx_11_0_arm64.whl
Size 275.2 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d2233381b43c0d85c886b7cd700c990c022417f2cfa0d8d6fe392e47ead0499f
BLAKE2b-256 checksum
How to use checksums
c007799562cd6169e59176a53507a5d8157182434047d0f3643f5c05ed211f54
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-win_amd64.whl

Download URL ugrapheme-0.8-cp39-cp39-win_amd64.whl
Size 264.5 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
95b1d6a6d348cde41a6f3ecce9ab5e9b3b9eb07e4c2ce16af119cce12fa9d591
BLAKE2b-256 checksum
How to use checksums
9cdf5597fa43c54159fb270e3513c1afe23ff68bf685032ba18f1688f97518af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-win32.whl

Download URL ugrapheme-0.8-cp39-cp39-win32.whl
Size 237.6 kB
Tags CPython 3.9 Windows x86-32
SHA-256 checksum
How to use checksums
30d9490daf43aab79aa4ddba82c925891b5d5b868f8b3a43ba11648df34acd91
BLAKE2b-256 checksum
How to use checksums
6631a96a6e11fee4ad028566b9fe945ab4c4ea6007b602b9bdcf8210f80e039d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-musllinux_1_2_x86_64.whl

Download URL ugrapheme-0.8-cp39-cp39-musllinux_1_2_x86_64.whl
Size 1.5 MB
Tags CPython 3.9 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
a1cfd822cf308354d4eafec6cefb9b117aa4be3fe9b7b57253a851b8dc8f5d9b
BLAKE2b-256 checksum
How to use checksums
10df967de74e12d8ec0152eba6ca4e823f11b2d526769a7bcf9a8e7d8cf763f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-musllinux_1_2_i686.whl

Download URL ugrapheme-0.8-cp39-cp39-musllinux_1_2_i686.whl
Size 1.4 MB
Tags CPython 3.9 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
1c8fcf9c33e5f887b5d434ea7fcbd5547f081b8d00566e527c76b46039ca2fee
BLAKE2b-256 checksum
How to use checksums
f77e440cd34152d7a51e8c44d7757dd72f2ae8bfa77caff84e2e698c6e9737a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL ugrapheme-0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
bb3c8822bda23386bd0bb4587fb9885d26c4a514e0a2652ec8f006b85b12de59
BLAKE2b-256 checksum
How to use checksums
5ea47ae40663e0b3795a51cf5639f9074b1db96e3d771c6f509fd475b21a667c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl

Download URL ugrapheme-0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Size 1.4 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
414d7bb24e0c62fd81901a64876a8b69e208b7b4f6c478a110b77ae00d2a46f8
BLAKE2b-256 checksum
How to use checksums
80e593b40bcc50633a82cf4b8a65a81af451c40bcb79b53c5097559cf01374ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp39-cp39-macosx_11_0_arm64.whl

Download URL ugrapheme-0.8-cp39-cp39-macosx_11_0_arm64.whl
Size 276.5 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
89ba8a47cc135bcf650f967008324a4f14fbed76cbf660ad930e27f1833f3499
BLAKE2b-256 checksum
How to use checksums
a7c36d6e0735e39e76b7b5f408df4043201eccd71370588c249ce04065c0eff5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-win_amd64.whl

Download URL ugrapheme-0.8-cp38-cp38-win_amd64.whl
Size 265.0 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
ef436684ba0aa92034a8938da159d0add9b3b89a0608fb8427512c54922b2980
BLAKE2b-256 checksum
How to use checksums
1c069b637189ca7946a62731bfb8a66dbf8b1aeee3bbd7d88eed4c04a5dcb809
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-win32.whl

Download URL ugrapheme-0.8-cp38-cp38-win32.whl
Size 237.9 kB
Tags CPython 3.8 Windows x86-32
SHA-256 checksum
How to use checksums
a862459aab6b304f2b2fdfd55b7a4479e43706039fdbb96373e16466bda72095
BLAKE2b-256 checksum
How to use checksums
42dafc7224f3e5d51490d3031b9d0305c9505906ad41ca17a3d0674e27731148
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-musllinux_1_2_x86_64.whl

Download URL ugrapheme-0.8-cp38-cp38-musllinux_1_2_x86_64.whl
Size 1.5 MB
Tags CPython 3.8 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
06f8a9405fa23e27240eae243dd35bc902a61867d27902909d41fb2f4c005180
BLAKE2b-256 checksum
How to use checksums
1b76b49f9193d4f96d20755bf91fdc1d7c04bd33296472eb01fc2df6ca10e94b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-musllinux_1_2_i686.whl

Download URL ugrapheme-0.8-cp38-cp38-musllinux_1_2_i686.whl
Size 1.4 MB
Tags CPython 3.8 Linux musl 1.2+ x86-32
SHA-256 checksum
How to use checksums
10c5ef1fc35981cd4f66e5efdaf850d4fcf372b5ea5c2a42c31269e20dc6a4ec
BLAKE2b-256 checksum
How to use checksums
8f789ca3d41fc3d68307002e88323cf764fb309b02ccbdaf261fed20eb05faa1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL ugrapheme-0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
13ed371a78831c48bacf69a1d09f7b33bd2480477afd62a1647e1cf7c5b54446
BLAKE2b-256 checksum
How to use checksums
ef0eee10cd3e6c63d28f50190ca27e6a1483751e02c0f8ebcf3f7622a312f18c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl

Download URL ugrapheme-0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Size 1.4 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
4dc357956fdc5a2c62459df5123ecb45e2f2ae4e858b13c117d40a656789a9f0
BLAKE2b-256 checksum
How to use checksums
4a9dc9915e454c0085689166e5799a9728422be063c8bf68b0065e5506221dd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release files / ugrapheme-0.8-cp38-cp38-macosx_11_0_arm64.whl

Download URL ugrapheme-0.8-cp38-cp38-macosx_11_0_arm64.whl
Size 277.6 kB
Tags CPython 3.8 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c9caf53860f38ce2aea0b082dcae36dbebc1695b304e40a4d3c02415c9638d71
BLAKE2b-256 checksum
How to use checksums
b6c69ea2f1b6b5e9f3e37afd5d559d9d6d3a0b5db60f9f6a99a603e70582a623
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.1 CPython/3.12.7

Release history Release notifications | RSS feed

This release

0.8 This release

43 release files

0.7

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page