Skip to main content

Unicode 16.0 Extended grapheme clusters in nanoseconds

Project description

##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.

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

ugrapheme-0.8.tar.gz (56.0 kB view details)

Uploaded Source

Built Distributions

ugrapheme-0.8-cp313-cp313-win_amd64.whl (258.2 kB view details)

Uploaded CPython 3.13 Windows x86-64

ugrapheme-0.8-cp313-cp313-win32.whl (232.2 kB view details)

Uploaded CPython 3.13 Windows x86

ugrapheme-0.8-cp313-cp313-musllinux_1_2_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

ugrapheme-0.8-cp313-cp313-musllinux_1_2_i686.whl (1.5 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ i686

ugrapheme-0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

ugrapheme-0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.5 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ugrapheme-0.8-cp313-cp313-macosx_11_0_arm64.whl (273.1 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

ugrapheme-0.8-cp312-cp312-win_amd64.whl (263.1 kB view details)

Uploaded CPython 3.12 Windows x86-64

ugrapheme-0.8-cp312-cp312-win32.whl (235.2 kB view details)

Uploaded CPython 3.12 Windows x86

ugrapheme-0.8-cp312-cp312-musllinux_1_2_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

ugrapheme-0.8-cp312-cp312-musllinux_1_2_i686.whl (1.6 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

ugrapheme-0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

ugrapheme-0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.5 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ugrapheme-0.8-cp312-cp312-macosx_11_0_arm64.whl (278.0 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

ugrapheme-0.8-cp311-cp311-win_amd64.whl (264.0 kB view details)

Uploaded CPython 3.11 Windows x86-64

ugrapheme-0.8-cp311-cp311-win32.whl (236.1 kB view details)

Uploaded CPython 3.11 Windows x86

ugrapheme-0.8-cp311-cp311-musllinux_1_2_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

ugrapheme-0.8-cp311-cp311-musllinux_1_2_i686.whl (1.6 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

ugrapheme-0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

ugrapheme-0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.5 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ugrapheme-0.8-cp311-cp311-macosx_11_0_arm64.whl (276.1 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

ugrapheme-0.8-cp310-cp310-win_amd64.whl (263.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

ugrapheme-0.8-cp310-cp310-win32.whl (236.6 kB view details)

Uploaded CPython 3.10 Windows x86

ugrapheme-0.8-cp310-cp310-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

ugrapheme-0.8-cp310-cp310-musllinux_1_2_i686.whl (1.4 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

ugrapheme-0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

ugrapheme-0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ugrapheme-0.8-cp310-cp310-macosx_11_0_arm64.whl (275.2 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

ugrapheme-0.8-cp39-cp39-win_amd64.whl (264.5 kB view details)

Uploaded CPython 3.9 Windows x86-64

ugrapheme-0.8-cp39-cp39-win32.whl (237.6 kB view details)

Uploaded CPython 3.9 Windows x86

ugrapheme-0.8-cp39-cp39-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

ugrapheme-0.8-cp39-cp39-musllinux_1_2_i686.whl (1.4 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

ugrapheme-0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

ugrapheme-0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ugrapheme-0.8-cp39-cp39-macosx_11_0_arm64.whl (276.5 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

ugrapheme-0.8-cp38-cp38-win_amd64.whl (265.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

ugrapheme-0.8-cp38-cp38-win32.whl (237.9 kB view details)

Uploaded CPython 3.8 Windows x86

ugrapheme-0.8-cp38-cp38-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

ugrapheme-0.8-cp38-cp38-musllinux_1_2_i686.whl (1.4 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ i686

ugrapheme-0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

ugrapheme-0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.4 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ugrapheme-0.8-cp38-cp38-macosx_11_0_arm64.whl (277.6 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

File details

Details for the file ugrapheme-0.8.tar.gz.

File metadata

  • Download URL: ugrapheme-0.8.tar.gz
  • Upload date:
  • Size: 56.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8.tar.gz
Algorithm Hash digest
SHA256 57a5e8c4afb8b9cac18e5c4b662e6b0ba932cae87baab9577dd4c9423c443940
MD5 69429b292d96cbf52b761a76dfa01b5a
BLAKE2b-256 6d8a670a6c92c3014d67a8af24299c2ed72574cbeedf02ae9bb2180bb9265939

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 258.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 619359156bd3f8dc29d587e8c0397cd71452866d6148314ca2a3329a61eb34b9
MD5 922c5df28c72d6fa84ed03bf913d83b2
BLAKE2b-256 ce8dca79fdc4059ccc311d9b4e732ece5840f3789693448b6ccaaeacecf51925

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-win32.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp313-cp313-win32.whl
  • Upload date:
  • Size: 232.2 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 0473d50a8a45a5d0c0e683b7d5810bd5912e24faa6e04d3adb2242c12db719e1
MD5 1414c11aacf06e6beca922586d7af23a
BLAKE2b-256 d662a27a5ad82ae4b3744c2d7ae9f11d56cf697e148900b9d2469bfa32b893c0

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e89a5ef3dbe2d021be68cc5448b323654cf33dc998a468801d8038f26e0e99ca
MD5 cde0bb43707c6fd82b99817622aab38f
BLAKE2b-256 54452e169e91ef3d52cb1202b6e720005e6a23acbc63c151808bdd3da7d89c46

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 41715c84eac300695bc5a93d90e46e2de229d9ea7d5c71e990270fd83e54d89d
MD5 35191b20f581d29819fbdf4433900dfa
BLAKE2b-256 222cb35e7ea523fcbb161d90075e01342ee51dd7984cd97b1e5c131a5ff41a00

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1e021fbe49084b73468f3f222a03e4bc96cffd35a0e23b5eaff93130de9b413f
MD5 fdae3aa1f41d4a3967cbf0c7b9994cb7
BLAKE2b-256 9096c0b24450534fd1886c35bcc13fdffbcf69593d667a5d85bcb09610f17263

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 90bdacbde8ee387ac8efd98fea0994238b4eb24f535ba535ddb37df4421921a4
MD5 1d4035754e6a8c60affa1381c8210a70
BLAKE2b-256 f8979535eeaf93aeb5a1266dcffa9f681ac8161613adba88c1be6f216015f4f8

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ecf541f3029a9077c42ae3afb4c3b03bdd59dbb03a1acbaa9cee1ee0e52ed8b
MD5 7b1ba4397e81ba8bfcf9825717e8683b
BLAKE2b-256 14a87b2c8e465a29e96841d99ffc09bc3a33fc40edf43d89a7292503c8f4ecfd

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 263.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bc300f5bf2d0a6f47550223d6e7741f447afac34c69036cc380bac2283c5bbaf
MD5 58821d0f39a1a96623a2750560225cc6
BLAKE2b-256 56b2fb2fd46693002d69ee7b16eb55b0d4f534fb8feb238263a3f2c74f691015

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-win32.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp312-cp312-win32.whl
  • Upload date:
  • Size: 235.2 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 da3af676efaf92c26a667ce63b74c7186f19698309cf95810f7ef12881656d11
MD5 16368a14ef2054bc12b12ae45752cd27
BLAKE2b-256 2e0a75f9ff650b411269ad38d84cf0f5772142ac93e38b671a3d868ddab98fbb

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 759563e60dccbeea9bf75d74f52e6a1c970c435b79a8de6d1f20d7d79c38cd89
MD5 d76f1c17bd1ea229e93aee8fd72f1a35
BLAKE2b-256 b7c089e538d5d955e701eb98fb6f90b823180308821555986e75de48e3797f3c

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0894e3cd88a9e2c62dd3171583f5fd66e97d72ac8f4cd8bf5de67999b1577202
MD5 27ca4bcb3c574c12407185b88d32eeeb
BLAKE2b-256 a068542f840a63092e2061a3966fc405bd4949531da93ae8622df179453303b0

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10328e7500a1e16ef72bc4b63b55a6ac1d74bfbea21cc2f32332d3d69584e5e7
MD5 2f66b46b13d3acb0acb981afa770c26a
BLAKE2b-256 82cc642a6f307840175e5d3990e17fe4f29b570eb1849b1bd25ffdf4fa268a42

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b21b27c63fc85ed294acff3d6109f549e45a7fd7958359a937a10b92c3177f3d
MD5 4db49b992d0e11220e95d883d8277be5
BLAKE2b-256 28cc9c7f03cdadc9730a8ffb8855f330c487467fe521f31b10ccd31ffeb5bb56

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9b7b1bab3557bce6561966d41197697ed0f6437bd0d324d2cb6aa828128ed547
MD5 79caaf62d704fd2ce38d4181e1674c40
BLAKE2b-256 0597b68befe44e2b68089c204c633c08bf305f7b2c9ba9b21c372e6b42283d4d

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 264.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d49af0e61822711f5617faa664eca19040dc72ac5106b38121699c5f8cfdec75
MD5 1877c1608e7ed42e7c6f7e318bc521fa
BLAKE2b-256 d6d8c4dfc41a6fefeceba4fd68a6ea170aabf5354487d95fa8297dd0a7a75856

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-win32.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp311-cp311-win32.whl
  • Upload date:
  • Size: 236.1 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 cc4e6702fc6c2d31048049d50d25ba0483edc3c63d4b805ff7bacf855f830c17
MD5 80255c02b4a8c8194240fc4da9c4d46d
BLAKE2b-256 3a916994c07005d3f19f47ce0bc68c2502c38c4b946e2376cbade0f9c94f3652

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 524b70593be4bad613bf44d55282aa5423d42dcaf89e980c9ed3449fbf8e3ffa
MD5 016579721fe2d35d57131f9e11bdff4c
BLAKE2b-256 12825ee9f07549607fedd5bd9ca43ad679458b2e223992dce7934dc9928388e0

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 4a3d0f7c9f17a30e9a314cef9de30bdd2be99e20aefbccdea6c6933f3dfaf4f8
MD5 00b394f54f9c01cb7e505a1d409d64e2
BLAKE2b-256 56e3a6abdf534f0fee55957dd23257b8e0592d5be81b3d4b3a367e6abd7c16ed

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 30b3edd036993f03844c5a0833d34ea5193eb6fea9136c352d4042ecdbe94cb1
MD5 0a72c1b8ca57ca5b5678f0a0aadf0830
BLAKE2b-256 780ab10d16a54556e9795cec274dec2705b77c2bdcf472513a45da7b909cebf3

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 edde1f0410b62d57939c47d030d2080a3fdec05d9fcb4f9f2b9585ec3c1a677b
MD5 fee42d985a76b8073001b17843423597
BLAKE2b-256 7cc648ec4c416902fcaa029aeca37ba2d2bc9cbf17f40386945573df341458ad

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 997038edafc285e8f31cd34959de023d21254d79713c996404c0739d616e3734
MD5 1a62a51e1dfe934fd55f36e13d3ba686
BLAKE2b-256 0db02a6c534f3ff87ccc003229e1df3e28968c8083e211249142465cd598811b

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 263.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 645c68092ef33c1266ee6d2bac100760f12f1eee1b0204b0a8e9b79e6d909237
MD5 486f8e73f95f19e1550f833a31f3eee1
BLAKE2b-256 bbe73f6c8473feab203a6ac30f6090a3b577ecd10ce95526f63bc5c2a992cf77

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-win32.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp310-cp310-win32.whl
  • Upload date:
  • Size: 236.6 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 acb5379c6a90d8ee1a1aab890335119ddb94acf5517ffda4e6daecc6d19e7adf
MD5 8be3784e6d96666ec01fa697f34d672d
BLAKE2b-256 68ed56a0d8af4a5c029cbbcd33ac84c02f513b45805b231f6a1fb8ab0e8ba3a1

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e0d2cd6ddcc4d840eda4d589a849ecdb4ce176fc63f5536e1ff7c1b8eb3669e6
MD5 c865876bd8b6863391f96d145d62e127
BLAKE2b-256 342e7820d21e41b98ec81a6c82737e9323ffac27a0a8b8af3658f01b8532c082

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fe8888be3b9da7f64cb866a4567d3c38377eec0664469452cafdc136f0fc5879
MD5 f2e0011fa82c9c8c92e923fcc5f5c2e8
BLAKE2b-256 fbbd14df68b6c10ffb919eeba30ed1529392fad0f180cb34517daeb1f7e07915

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2f4909f4c3a0952c78e4ef90049b9a2c9f800a6039db80ddcafe0a848a58f4a0
MD5 f927e6c5ee518b8746fc524bddcf4d29
BLAKE2b-256 a7490f7c9376c3dac267742f6a3dd568da0a3429d074c03c0f2b509b384400d1

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e506589aa0ece33e0d9e565220126308e57093d2829bbf1bcb05b96982db7335
MD5 130c03e6564e1f5d6d561d96315c146d
BLAKE2b-256 3808bb6d50540a45b77cc855f4845e05a5153c58af835cc588e8f639ab17b734

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d2233381b43c0d85c886b7cd700c990c022417f2cfa0d8d6fe392e47ead0499f
MD5 461ca35b557755a1c8d35bc7f77e5860
BLAKE2b-256 c007799562cd6169e59176a53507a5d8157182434047d0f3643f5c05ed211f54

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 264.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 95b1d6a6d348cde41a6f3ecce9ab5e9b3b9eb07e4c2ce16af119cce12fa9d591
MD5 2cead3fe8043d152ca4acf9626a0232a
BLAKE2b-256 9cdf5597fa43c54159fb270e3513c1afe23ff68bf685032ba18f1688f97518af

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-win32.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp39-cp39-win32.whl
  • Upload date:
  • Size: 237.6 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 30d9490daf43aab79aa4ddba82c925891b5d5b868f8b3a43ba11648df34acd91
MD5 d2608107e584a9eaa98b90bfe24ebd67
BLAKE2b-256 6631a96a6e11fee4ad028566b9fe945ab4c4ea6007b602b9bdcf8210f80e039d

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a1cfd822cf308354d4eafec6cefb9b117aa4be3fe9b7b57253a851b8dc8f5d9b
MD5 779b1673a39e691d3b9ffe7f6b943f2b
BLAKE2b-256 10df967de74e12d8ec0152eba6ca4e823f11b2d526769a7bcf9a8e7d8cf763f4

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 1c8fcf9c33e5f887b5d434ea7fcbd5547f081b8d00566e527c76b46039ca2fee
MD5 6321bbba7db82c04580405512792e399
BLAKE2b-256 f77e440cd34152d7a51e8c44d7757dd72f2ae8bfa77caff84e2e698c6e9737a6

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bb3c8822bda23386bd0bb4587fb9885d26c4a514e0a2652ec8f006b85b12de59
MD5 093b19d1bc62e6db8b98a08ef53f75dd
BLAKE2b-256 5ea47ae40663e0b3795a51cf5639f9074b1db96e3d771c6f509fd475b21a667c

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 414d7bb24e0c62fd81901a64876a8b69e208b7b4f6c478a110b77ae00d2a46f8
MD5 60aea09f06c438130677a7f96ece7b51
BLAKE2b-256 80e593b40bcc50633a82cf4b8a65a81af451c40bcb79b53c5097559cf01374ac

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 89ba8a47cc135bcf650f967008324a4f14fbed76cbf660ad930e27f1833f3499
MD5 88b0d63fa702bfdc26bf7a3cd15b7765
BLAKE2b-256 a7c36d6e0735e39e76b7b5f408df4043201eccd71370588c249ce04065c0eff5

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 265.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ef436684ba0aa92034a8938da159d0add9b3b89a0608fb8427512c54922b2980
MD5 4f31a42e6cd36886b4cf0e756dfe684c
BLAKE2b-256 1c069b637189ca7946a62731bfb8a66dbf8b1aeee3bbd7d88eed4c04a5dcb809

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-win32.whl.

File metadata

  • Download URL: ugrapheme-0.8-cp38-cp38-win32.whl
  • Upload date:
  • Size: 237.9 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 a862459aab6b304f2b2fdfd55b7a4479e43706039fdbb96373e16466bda72095
MD5 812a023ac37b0d4cdfe81ecfc09cbc01
BLAKE2b-256 42dafc7224f3e5d51490d3031b9d0305c9505906ad41ca17a3d0674e27731148

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 06f8a9405fa23e27240eae243dd35bc902a61867d27902909d41fb2f4c005180
MD5 079e88ae71136d44c992dfe1ffc16a0b
BLAKE2b-256 1b76b49f9193d4f96d20755bf91fdc1d7c04bd33296472eb01fc2df6ca10e94b

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 10c5ef1fc35981cd4f66e5efdaf850d4fcf372b5ea5c2a42c31269e20dc6a4ec
MD5 855d4e07ada9ccd8e2c9998a52032043
BLAKE2b-256 8f789ca3d41fc3d68307002e88323cf764fb309b02ccbdaf261fed20eb05faa1

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 13ed371a78831c48bacf69a1d09f7b33bd2480477afd62a1647e1cf7c5b54446
MD5 23acf2ca6d4785cadb501e98e2f3693e
BLAKE2b-256 ef0eee10cd3e6c63d28f50190ca27e6a1483751e02c0f8ebcf3f7622a312f18c

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4dc357956fdc5a2c62459df5123ecb45e2f2ae4e858b13c117d40a656789a9f0
MD5 6f75a25d9dc81cf87124906490d0b4b5
BLAKE2b-256 4a9dc9915e454c0085689166e5799a9728422be063c8bf68b0065e5506221dd6

See more details on using hashes here.

File details

Details for the file ugrapheme-0.8-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ugrapheme-0.8-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c9caf53860f38ce2aea0b082dcae36dbebc1695b304e40a4d3c02415c9638d71
MD5 4421942a5800615de61afd315af44f03
BLAKE2b-256 b6c69ea2f1b6b5e9f3e37afd5d559d9d6d3a0b5db60f9f6a99a603e70582a623

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