Skip to main content

Python ctypes bindings for reliq

Project description

reliq-python

A python bindings for reliq library.

Installation

pip install reliq

Benchmark

Benchmarks were inspired by selectolax and performed on 355MB, 896 files sample of most popular websites. You can find the benchmark script here.

Parsing

Package Time
bs4 121.615s
html5-parser 22.424s
lxml 4.955s
selectolax (modest) 2.901s
selectolax (lexbor) 1.200s
reliq 0.310s

Collective memory usage of parsed trees

Package Memory
bs4 2234MB
selectolax (lexbor) 1666MB
selectolax (modest) 1602MB
lxml 1274MB
html5-parser 1262MB
reliq 58MB

Parsing and processing

Package Time
bs4 230.661s
html5-parser 31.138s
lxml 14.010s
selectolax (modest) 4.291s
reliq 2.974s
selectolax (lexbor) 2.628s

Usage

Code

from reliq import reliq

html = ""
with open('index.html','r') as f:
    html = f.read()

rq = reliq(html) #parse html
expr = reliq.expr(r"""
    div .user; {
        a href; {
            .name @ | "%i",
            .link @ | "%(href)v"
        },
        .score.u span .score,
        .info dl; {
            .key dt | "%i",
            .value dd | "%i"
        } |,
        .achievements.a li class=b>"achievement-" | "%i\n"
    }
""") #expressions can be compiled

users = []
links = []

for i in rq.filter(r'table; { tr, text@ iw>lisp }')[:-2]:
    # ignore comments and text nodes
    if i.type is not reliq.Type.tag:
        continue

    first_child = i[0]

    if first_child.desc_count < 3 and first_child.name == "div" and first_child.starttag == '<div>':
        continue

    link = first_child[2].attrib['href']
    if re.match('^https://$',link):
        links.append(link)
        continue

    #make sure that object is an ancestor of <main> tag
    for j in i.ancestors():
        if j.name == "main":
          break
    else:
      continue

    #search() returns str, in this case expression is already compiled
    #  but can be also passed as a str() or bytes(). If Path() is passed
    #  file will be read
    user = json.loads(i.search(expr))
    users.append(user)

try: #handle errors
    rq.search('p / /','<p></p>')
except reliq.ScriptError: # all errors inherit from reliq.Error
    print("error")

#get text from all text nodes that are descendants of object
print(rq[2].text_recursive)
#get text from all text nodes that are children of object
print(rq[2].text)

#decode html entities
reliq.decode('loop &amp; &lt &tdot; &#212')

#execute and convert to dictionary
rq.json(r"""
    .files * #files; ( li )( span .head ); {
        .type i class child@ | "%(class)v" / sed "s/^flaticon-//",
        .name @ | "%Dt" / trim sed "s/ ([^)]* [a-zA-Z][Bb])$//",
        .size @ | "%t" / sed 's/.* \(([^)]* [a-zA-Z][Bb])\)$/\1/; s/,//g; /^[0-9].* [a-zA-Z][bB]$/!d' "E"
    } |
""") #dict format is enforced and any incompatible expressions will raise reliq.ScriptError

Import

Most is contained inside reliq class

from reliq import reliq, RQ

Initialization

reliq object takes an argument representing html, this can be str(), bytes(), Path() (file is read as bytes), reliq() or None.

rq = reliq('<p>Example</p>') #passed directly

rq2 = reliq(Path('index.html')) #passed from file

rq3 = reliq(None) # empty object
rq4 = reliq() # empty object

If optional argument ref is a string it'll set url to the first base tag in html structure, and in case there isn't any it'll be set to ref.

rq = reliq('<p>Example</p>')
rq.ref # None

rq2 = reliq(b'<p>Second example</p>',ref="http://en.wikipedia.org")
rq2.ref # http://en.wikipedia.org

rq3 = reliq(b'<base href="https://wikipedia.org"><p>Second example</p>',ref="http://en.wikipedia.org")
rq3.ref # https://wikipedia.org

rq4 = reliq(b'<base href="https://wikipedia.org"><p>Second example</p>',ref="")
rq4.ref # https://wikipedia.org

Types

reliq can have 5 types that change the behaviour of methods.

Calling type property on object e.g. rq.type returns instance of reliq.Type(Flag).

empty

Gets returned from either reliq(None) or reliq.filter() that matches nothing, makes all methods return default values.

unknown

Similar to empty but should never happen

struct

Returned by successful initialization e.g.

reliq('<p>Example</p>')

list

Returned by reliq.filter() that succeeds

single

Returned by axis methods or by accessing the object like a list.

The type itself is a grouping of more specific types:

  • tag
  • comment
  • textempty (text made only of whitespaces)
  • texterr (text where an html error occurred)
  • text
  • textall (grouping of text types)

get_data(raw=False) -> str|bytes

Returns the same html from which the object was compiled.

If first argument is True or raw=True returns bytes.

data = Path('index.html').read_bytes

rq = reliq(data)
x = rq[0][2][1][8]

# if both objects are bytes() then their ids should be the same
x.get_data(True) is data

special methods

__bytes__ and __str__

Full string representation of current object

rq = reliq("""
  <h1><b>H</b>1</h1>
  <h2>N2</h2>
  <h2>N3</h2>
""")

str(rq) # struct
# '\n  <h1><b>H</b>1</h1>\n  <h2>N2</h2>\n  <h2>N3</h2>\n'

str(rq.filter('h2')) # list
# '<h2>N2</h2><h2>N3</h2>'

str(rq[0]) # single
# '<h1><b>H</b>1</h1>'

str(reliq()) # empty
# ''

__getitem__

For single indexes results from children() axis, otherwise from self() axis

rq = reliq('<div><p>1</p> Text <b>H</b></div>')

first = rq[0] # struct
# <div>

first[1] # single
# <b>

r = first.filter('( text@ * )( * ) child@')
r[1] # list
# " Text " obj

r[2] == first[1]

__len__

Amount of objects returned from __getitem__

ref and ref_raw

ref -> str

ref_raw -> bytes

They return saved reference url at initialization.

rq = reliq('',ref="http://en.wikipedia.org")
rq.ref # "http://en.wikipedia.org"
rq.ref_raw # b"http://en.wikipedia.org"

properties of single

Calling these properties for types other than single returns their default values.

lvl -> int level in html structure

rlvl -> int level in html structure, relative to parent

position -> int position in html structure

rposition -> int position in html structure, relative to parent

Calling some properties makes sense only for certain types.

tag

tag_count -> int count of tags

text_count -> int count of text

comment_count -> int count of comments

desc_count -> int count of descendants

attribl -> int number of attributes


attrib -> dict dictionary of attributes


These return None only if called from empty type. They also have _raw counterparts that return bytes e.g. text_recursive_raw -> Optional[bytes], name_raw -> Optional[bytes]

insides -> Optional[str] string containing contents inside tag or comment

name -> Optional[str] tag name e.g. 'div'

starttag -> Optional[str] head of the tag e.g. '<div class="user">'

endtag -> Optional[str] tail of the tag e.g. '</div>'

endtag_strip -> Optional[str] tail of the tag, stripped of < and > e.g. '/div'

text -> Optional[str] text of children

text_recursive -> Optional[str] text of descendants

rq = reliq("""
  <main>
    <ul>
      <a>
        <li>L1</li>
      </a>
      <li>L2</li>
    </ul>
  </main>
""")

ul = rq[0][0]
a = ul[0]
li1 = a[0]
li2 = ul[1]

ul.name
# 'ul'

ul.name_raw
# b'ul'

ul.lvl
# 1

li1.lvl
# 3

ul.text
# '\n      \n      \n    '

ul.text_recursive
# '\n      \n        L1\n      \n      L2\n    '

a.insides
# '\n        <li>L1</li>\n      '

comment

Comments can either return their string representation or insides by insides property.

c = reliq('<!-- Comment -->').self(type=None)[0]

c.insides
# ' Comment '

bytes(c)
# b'<!-- Comment -->'

str(c)
# '<!-- Comment -->'

text

Text can only be converted to string

t = reliq('Example').self(type=None)[0]

str(t)
# 'Example'

axes

Convert reliq objects into a list or a generator of single type objects.

If their first argument is set to True or gen=True is passed, a generator is returned, otherwise a list.

By default they filter node types to only reliq.Type.tag, this can be changed by setting the type argument e.g. type=reliq.Type.comment|reliq.Type.texterr. If type is set to None all types are matched.

If rel=True is passed returned objects will be relative to object from which they were matched.

rq = reliq("""
  <!DOCTYPE html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <section>
      <h1>Title</h1>
      <p>A</p>
    </section>
    <h2>List</h2>
    <ul>
      <li>A</li>
      <li>B</li>
      <li>C</li>
    </ul>
    <section>
      TEXT
    </section>
  </body>
""")

everything

everything() gets all elements in structure, no matter the previous context.

#traverse everything through generator
for i in rq.everything(True):
  print(str(i))

self

self() gets the context itself, single element for single type, list of the list type and elements with .lvl == 0 for struct type.

By default filtered type depends on object type it was called for, for single and list types are unfiltered, only struct type enforces type=reliq.Type.tag.

# rq is a reliq.Type.struct object

rq.self()
# [<tag head>, <tag body>]

rq.self(type=None)
# [<textempty>, <comment>, <textempty>, <tag head>, <textempty>, <tag body>]

rq.self(type=reliq.Type.tag|reliq.Type.comment)
# [<comment>,<tag head>, <tag body>]

# ls is a reliq.Type.list object that has comments and text types
ls = rq.filter('[:3] ( comment@ * )( text@ * )')

ls.self()
# [<comment>, <text>, <text>, <text>]

ls.self(type=reliq.Type.tag|reliq.Type.comment)
# [<comment>]

# body is a reliq.Type.single object
body = rq[1].self()

len(body.self())
# 1

body.self()[0].name
# "body"

children

children() gets all nodes of the context that have level relative to them equal to 1.

# struct
rq.children()
# [<tag title>, <tag section>, <tag h2>, <tag ul>, <tag section>]

# list
rq.filter('head, ul').children()
# [<tag title>, <tag li>, <tag li>, <tag li>]

# single
first_section = rq[1][0]
first_section.children()
# [<tag h1>, <tag p>]

descendants

descendants() gets all nodes of the context that have level relative to them greater or equal to 1.

# struct
rq.descendants()
# [<tag title>, <tag section>, <tag h1>, <tag p>, <tag h2>, <tag ul>, <tag li>, <tag li>, <tag li>, <tag section>]

# list
rq.filter('[0] section').descendants()
# [<tag h1>, <tag p>]

# single
rq[1][0].descendants()
# [<tag h1>, <tag p>]

full

full() gets all nodes of the context and all nodes below them (like calling self() and descendants() at once).

# struct
rq.full()
# [<tag head>, <tag title>, <tag body>, <tag section>, <tag h1>, <tag p>, <tag h2>, <tag ul>, <tag li>, <tag li>, <tag li>, <tag section>]

# list
rq.filter('[0] section').descendants()
# [<tag section>, <tag h1>, <tag p>]

# single
rq[1][0].descendants()
# [<tag section>, <tag h1>, <tag p>]

parent

parent() gets parent of context nodes. Doesn't work for struct type.

# list
rq.filter('li').parent()
# [<tag ul>, <tag ul>, <tag ul>]

# single
rq[1][2][0].parent()
# [<tag li>]

# single
rq[0].parent() # top level nodes don't have parents
# []

rparent

rparent() behaves like parent() but returns the parent to which the current object is relative to. Doesn't work for struct type.

It doesn't take rel argument, returned objects are always relative.

ancestors

ancestors() gets ancestors of context nodes. Doesn't work for struct type.

# list
rq.filter('li').ancestors()
# [<tag ul>, <tag body>, <tag ul>, <tag body>, <tag ul>, <tag body>]

# single
rq[1][2][0].ancestors()
# [<tag ul>, <tag body>]

# first element of ancestors() should be the same as for parent()
rq[1][2][0].ancestors()[0].name == rq[1][2][0].parent()[0].name

# single
rq[0].ancestors() # top level nodes don't have ancestors
# []

before

before() gets all nodes that have lower .position property than context nodes. Doesn't work for struct type.

# list
rq.filter('[0] title, [1] section').before()
# [<tag head>, <tag li>, <tag li>, <tag li>, <tag ul>, <tag h2>, <tag p>, <tag h1>, <tag section>, <tag body>, <tag title>, <tag head>]

# single
title = rq[0][0]
title.before()
# [<tag head>]

# single
second_section = rq[1][3]
second_section.before()
# [<tag li>, <tag li>, <tag li>, <tag ul>, <tag h2>, <tag p>, <tag h1>, <tag section>, <tag body>, <tag title>, <tag head>]

# single
head = rq[0]
head.before() #first element doesn't have any nodes before it
# []

preceding

preceding() is similar to before() but ignores ancestors. Doesn't work for struct type.

# list
rq.filter('[0] title, [1] section').preceding()
# [<tag li>, <tag li>, <tag li>, <tag ul>, <tag h2>, <tag p>, <tag h1>, <tag section>, <tag title>, <tag head>]

# single
title = rq[0][0]
title.preceding() # all tags before it are it's ancestors
# []

# single
second_section = rq[1][3]
second_section.preceding()
# [<tag li>, <tag li>, <tag li>, <tag ul>, <tag h2>, <tag p>, <tag h1>, <tag section>, <tag title>, <tag head>]

after

after() gets all nodes that have higher .position property than context nodes. Doesn't work for struct type.

# list
rq.filter('h2, ul').after()
# [<tag ul>, <tag li>, <tag li>, <tag li>, <tag section>, <tag li>, <tag li>, <tag li>, <tag section>]

# single
h2 = rq[1][1]
h2.after()
# [<tag ul>, <tag li>, <tag li>, <tag li>, <tag section>]

# single
ul = rq[1][2]
ul.after()
# [<tag li>, <tag li>, <tag li>, <tag section>]

# single
third_section = rq[1][3] # last element
third_section.after()
# []

subsequent

subsequent() is similar to after() but ignores descendants. Doesn't work for struct type.

# list
rq.filter('h2, ul').subsequent()
# [<tag ul>, <tag li>, <tag li>, <tag li>, <tag section>, <tag section>]

# single
h2 = rq[1][1]
h2.subsequent()
# [<tag ul>, <tag li>, <tag li>, <tag li>, <tag section>]

# single
ul = rq[1][2]
ul.subsequent()
# [<tag section>]

siblings_preceding

siblings_preceding() gets nodes on the same level as context nodes but before them and limited to their parent. Doesn't work for struct type.

If full=True is passed descendants of siblings will also be matched.

# list
rq.filter('ul, h2').siblings_preceding()
# [<tag h2>, <tag section>, <tag section>]

# single
h2 = rq[1][1]

h2.siblings_preceding()
# [<tag section>]
h2.siblings_preceding(full=True)
# [<tag p>, <tag h1>, <tag section>]

# single
ul = rq[1][2]

ul.siblings_preceding()
# [<tag h2>, <tag section>]
ul.siblings_preceding(full=True)
# [<tag h2>, <tag p>, <tag h1>, <tag section>]

siblings_subsequent

siblings_preceding() gets nodes on the same level as context nodes but after them and limited to their parent. Doesn't work for struct type.

If full=True is passed descendants of siblings will also be matched.

# list
rq.filter('ul, h2').siblings_subsequent()
# [<tag h2>, <tag section>, <tag section>]

# single
h2 = rq[1][1]

h2.siblings_subsequent()
# [<tag ul>, <tag section>]
h2.siblings_subsequent(full=True)
# [<tag ul>, <tag li>, <tag li>, <tag li>, <tag section>]

# single
ul = rq[1][2]

ul.siblings_subsequent()
# [<tag section>]
ul.siblings_subsequent(full=True)
# [<tag section>]

siblings

siblings() returns merged output of siblings_preceding() and siblings_subsequent().

expr

reliq.expr is a class that compiles expressions, it accepts only one argument that can be a str(), bytes() or Path().

If Path() argument is specified, file under it will be read with Path.read_bytes().

# str
reliq.expr(r'table; { tr .name; li | "%(title)v\n", th }')

# bytes
reliq.expr(rb'li')

# file from Path
reliq.expr(Path('expression.reliq'))

search

search() executes expression in the first argument and returns str() or bytes if second argument is True or raw=True.

Expression can be passed both as compiled object of reliq.expr or its representation in str(), bytes() or Path() that will be compiled in function.

rq = reliq('<span class=name data-user-id=1282>User</span><p>Title: N1ase</p>')

rq.search(r'p')
# '<p>Title: N1ase</p>\n'

rq.search(r'p', True)
# b'<p>Title: N1ase</p>\n'

rq.search(r'p', raw=True)
# b'<p>Title: N1ase</p>\n'

rq.search(r"""
  span .name; {
    .id.u @ | "%(data-user-id)v",
    .name @ | "%t"
  },
  .title p | "%i" sed "s/^Title: //"
""",True)
# b'{"id":1282,"name":"User","title":"N1ase"}'

rq.search(Path('expression.reliq'))

json

Similar to search() but returns dict() while validating expression.

filter

filter() executes expression in the first argument and returns reliq object of list type or empty type if nothing has been found.

If second argument is True or independent=True then returned object will be completely independent from the one the function was called on. A new HTML string representation will be created, and structure will be copied and shifted to new string, levels will also change.

Expression can be passed both as compiled object of reliq.expr or its representation in str(), bytes() or Path() that will be compiled in function.

Any field, formatting or string conversion in expression will be ignored, only objects used in them will be returned.

rq = reliq('<span class=name data-user-id=1282>User</span><p>Title: N1ase</p>')

rq.filter(r'p').self()
# [<tag p>]

rq.filter(r'p').type
# reliq.Type.list

rq.filter(r'p').get_data()
# '<span class=name data-user-id=1282>User</span><p>Title: N1ase</p>'

rq.filter(r'p',True).get_data()
# '<p>Title: N1ase</p>'

rq.filter(r'nothing').type
# reliq.Type.empty

rq.filter(r"""
  span .name; {
    .id.u @ | "%(data-user-id)v",
    .name @ | "%t"
  },
  .title p | "%i" sed "s/^Title: //"
""")
# [<tag span>, <tag span>, <tag p>]

rq.filter(Path('expression.reliq'))

Encoding and decoding html entities

decode() decodes html entities in first argument of str() or bytes(), and returns str() or bytes() if second argument is True or raw=True.

By default &nbsp; is translated to space, this can be changed by setting no_nbsp=False.

encode() does the opposite of decode() in the same fashion.

By default only special characters are encoded i.e. <, >, ", ', &. If full=True is set everything possible will be converted to html entities (quite slow approach).

reliq.decode(r"text &amp; &lt &tdot; &#212")
# "loop & <  ⃛⃛ Ô"

reliq.decode(r"text &amp; &lt &tdot; &#212",True)
# b'text & <  \xe2\x83\x9b\xe2\x83\x9b \xc3\x94'

reliq.decode(r"text &amp; &lt &tdot; &#212",raw=True)
# b'text & <  \xe2\x83\x9b\xe2\x83\x9b \xc3\x94'

reliq.decode('ex&nbsp;t')
# "ex t"

reliq.decode('ex&nbsp;t',no_nbsp=False)
# 'ex\xa0t'

reliq.decode('ex&nbsp;t',True,no_nbsp=False)
# b'ex\xc2\xa0t'

reliq.encode("<p>li &amp; \t 'seq' \n </p>")
# '&lt;p&gt;li &amp;amp; \t &#x27;seq&#x27; \n &lt;/p&gt;'

reliq.encode("<p>li &amp; \t 'seq' \n </p>",True)
# b'&lt;p&gt;li &amp;amp; \t &#x27;seq&#x27; \n &lt;/p&gt;'

reliq.encode("<p>li &amp; \t 'seq' \n </p>",raw=True)
# b'&lt;p&gt;li &amp;amp; \t &#x27;seq&#x27; \n &lt;/p&gt;'

reliq.encode("<p>li &amp; \t 'seq' \n </p>",full=True)
# '&lt;p&gt;li &amp;amp&semi; &Tab; &#x27;seq&#x27; &NewLine; &lt;&sol;p&gt;'

reliq.encode("<p>li &amp; \t 'seq' \n </p>",True,full=True)
# b'&lt;p&gt;li &amp;amp&semi; &Tab; &#x27;seq&#x27; &NewLine; &lt;&sol;p&gt;'

URLS

urljoin work like urllib.parse.urljoin but it can take argument's in bytes and returns str or bytes depending on raw argument.

ujoin works the same way as urljoin but ref argument is set to default reference url in structure.

Errors

All errors are instances of reliq.Error.

reliq.SystemError is raised when kernel fails (you should assume it doesn't happen).

reliq.HtmlError is raised when html structure exceeds limits.

reliq.ScriptError is raised when incorrect script is compiled.

try:
  reliq('<div>'*8193) # 8192 passes :D
except reliq.HtmlError:
  print('html depth limit exceeded')

try:
  reliq.expr('| |')
except reliq.ScriptError:
  print('incorrect expression')

Relativity

list and single type object also stores a pointer to node that object is relative to in context i.e. rq.filter(r'body; nav') will return nav objects that were found in body tags, nav objects might not be direct siblings of body tags but because of relativity their relation is not lost.

reliq.filter() always keeps the relativity.

By default axis functions don't change relativity unless rel=True is passed.

rq = reliq("""
  <body>
    <nav>
      <ul>
        <li> A </li>
        <li> B </li>
        <li> C </li>
      </ul>
    </nav>
  </body>
""")

li = rq[0][0][0][1] # not relative

li_self = rq.filter('li i@w>"B"')[0] # relative to itself

li_rel = rq.filter('nav; li i@w>"B"')[0] # relative to nav

# .rlvl and .rposition for non relative objects return same values as .lvl and .position

li.lvl
# 3
li_rel.lvl
# 3

li.rlvl
# 3
li_rel.rlvl
# 2

li.position
# 10
li_rel.position
# 10

li.rposition
# 10
li_rel.rposition
# 9

nav = rq[0][0]
for i in nav.descendants(rel=True):
    if i.rlvl == 2 and i.name == 'li':
        print(i.lvl,i.rlvl)
        # 3 2
        break

nav_rel = li_rel.rparent()[0] # nav element relative to li

nav_rel.rlvl
# -2
nav_rel.rposition
# -7

Project wrapper

Expressions can grow into considerable sizes so it's beneficial to save them in separate directories and cache them. RQ function returns a new reliq type that keeps track of cache and directory of the script that has called this function.

from reliq import RQ

reliq = RQ(cached=True)

rq = reliq('<p>Alive!</p>')
print(rq)

It takes two optional arguments def RQ(path="", cached=False). If cached is set, compiled expressions will be saved and reused.

If path is not an absolute path it will be merged with directory of the calling function. When in any function that takes expression argument a Path() is passed it will be relative to first declared path argument. Exceptions to that are paths that are absolute or begin with ./ or ../.

This function should be used by packages to save reliq expressions under their directories without polluting the general reliq object space. After the first declaration of this type it should be reused everywhere in project.

Projects using reliq in python

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

reliq-0.0.47.tar.gz (2.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

reliq-0.0.47-cp314-cp314-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.14

reliq-0.0.47-cp314-cp314-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.14

reliq-0.0.47-cp314-cp314-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.14

reliq-0.0.47-cp314-cp314-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

reliq-0.0.47-cp314-cp314-macosx_14_0_arm64.whl (115.3 kB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

reliq-0.0.47-cp313-cp313-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.13

reliq-0.0.47-cp313-cp313-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.13

reliq-0.0.47-cp313-cp313-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.13

reliq-0.0.47-cp313-cp313-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

reliq-0.0.47-cp313-cp313-macosx_14_0_arm64.whl (115.3 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

reliq-0.0.47-cp312-cp312-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.12

reliq-0.0.47-cp312-cp312-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.12

reliq-0.0.47-cp312-cp312-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.12

reliq-0.0.47-cp312-cp312-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

reliq-0.0.47-cp312-cp312-macosx_14_0_arm64.whl (115.3 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

reliq-0.0.47-cp311-cp311-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.11

reliq-0.0.47-cp311-cp311-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.11

reliq-0.0.47-cp311-cp311-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.11

reliq-0.0.47-cp311-cp311-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

reliq-0.0.47-cp311-cp311-macosx_14_0_arm64.whl (115.2 kB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

reliq-0.0.47-cp310-cp310-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.10

reliq-0.0.47-cp310-cp310-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.10

reliq-0.0.47-cp310-cp310-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.10

reliq-0.0.47-cp310-cp310-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

reliq-0.0.47-cp310-cp310-macosx_14_0_arm64.whl (115.3 kB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

reliq-0.0.47-cp39-cp39-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.9

reliq-0.0.47-cp39-cp39-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.9

reliq-0.0.47-cp39-cp39-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

reliq-0.0.47-cp39-cp39-macosx_14_0_arm64.whl (115.3 kB view details)

Uploaded CPython 3.9macOS 14.0+ ARM64

reliq-0.0.47-cp38-cp38-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.8

reliq-0.0.47-cp38-cp38-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.8

reliq-0.0.47-cp38-cp38-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.8

reliq-0.0.47-cp38-cp38-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.8macOS 15.0+ ARM64

reliq-0.0.47-cp38-cp38-macosx_14_0_arm64.whl (115.2 kB view details)

Uploaded CPython 3.8macOS 14.0+ ARM64

reliq-0.0.47-cp37-cp37-manylinux2014_x86_64.whl (151.0 kB view details)

Uploaded CPython 3.7

reliq-0.0.47-cp37-cp37-manylinux2014_armv7l.whl (120.6 kB view details)

Uploaded CPython 3.7

reliq-0.0.47-cp37-cp37-manylinux2014_aarch64.whl (147.2 kB view details)

Uploaded CPython 3.7

reliq-0.0.47-cp37-cp37-macosx_15_0_arm64.whl (115.9 kB view details)

Uploaded CPython 3.7macOS 15.0+ ARM64

reliq-0.0.47-cp37-cp37-macosx_14_0_arm64.whl (115.2 kB view details)

Uploaded CPython 3.7macOS 14.0+ ARM64

File details

Details for the file reliq-0.0.47.tar.gz.

File metadata

  • Download URL: reliq-0.0.47.tar.gz
  • Upload date:
  • Size: 2.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for reliq-0.0.47.tar.gz
Algorithm Hash digest
SHA256 a43854bff5a2c24535d99e5e5127a4edcc6849aa2725a583ae7305d7b160ac7f
MD5 cbce35a1c01559fbcb9e4e7345ff6bf8
BLAKE2b-256 f87fa969c15a475b920285eb34934b63dc4266459ef5582ceee93686b0b673bf

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp314-cp314-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp314-cp314-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dec7ef9825bd456b56a5ab6b23c8992385faabb61daf61afceeb5416ab4ec8ff
MD5 192f45f0ccc88daf723357dcd7d13d70
BLAKE2b-256 240ce33c3f7a560888463a913d91212e9a65e7378f53ce084ab7703943963b7b

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp314-cp314-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp314-cp314-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 df84fd71ac79a78a4a1c99ac98e5ab9598303b48ddcf700ad2ca750daecf6589
MD5 c0c8954d2a42f21d7b43f6a69f470692
BLAKE2b-256 7292db3f514c4f885ec240a888aa2aa975751267ca95c517b006aee662fa174a

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp314-cp314-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp314-cp314-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cf57d8fc0fcf99fd817f17ae9eb9241d1e4b898046e6abda0bf494b7e3ffde45
MD5 21d7b4e4b43eb1789e22e11c952c9915
BLAKE2b-256 906d2a36c145e4195790aa72db6b50dc2072a68579a36943ae4b163db0cc26fc

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 628fded0118d7d9beb79946fdfcbe733112bf773805b38bfca9950970c3c61d1
MD5 157ff1e2348b6893d14cd172fee24945
BLAKE2b-256 3598eb792bef72f0fb8bbe689753fa8e25cd6afa03921c92171f932f37541a01

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 da439ce69db91c5a0e19810f91e19c7791c5ca9c50397b3a3b5451117e752b16
MD5 496ae4077dcba67c7bfcb5f1a44290b2
BLAKE2b-256 0bdb9bea973fee970ea8f61a60d28e622220d99f2bdef54adeb9b3baf2c27d48

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp313-cp313-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp313-cp313-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a8c43a47dbf0705a28d282dcad07486b9ef1e711c45a8fb915d58a6fdbef249e
MD5 e776c671976764049baced3e3fb937ed
BLAKE2b-256 d23a2e25feefad0acd80ff969d1cebe36e29ce11baaa8d104e4f25184286fc45

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp313-cp313-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp313-cp313-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 53333dd90eca5ffa5ac93858d40a7e1f1c173aa72279bd78b5bf0cc58c1124bb
MD5 4dbb91a6a1cbdd925477951e6e691819
BLAKE2b-256 8e71c962aaefc8c7ca9e9eee8f92b04249f5d88a3498ba8f65ca2890ed631b89

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp313-cp313-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp313-cp313-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0815e04d616ef10c2f9afae64b6a21df701cdb691d3138d6d81fef5fba36c729
MD5 a361418991b339779e52501cd4318785
BLAKE2b-256 0d9ee796efba2e2b3eab6d3f46be3b1e22bb2804c584d0021e0c011e5c59ac2f

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 21fe107a9ceeb381befd39d8fa72cf249b53f7a63e5b30f65b6e051935d702c9
MD5 c9cb27b0c6c8a8a8623e1cf68d927ffc
BLAKE2b-256 661278db804c097f16b5ec8e70a71005841dc914dcccd884eeab558e8e530287

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7412dcae372abeb74f00414abea0a5df47bc1728eda6b841759232de4ea567e6
MD5 4c157da128461c1a6c04cb74d04034bd
BLAKE2b-256 81d3458fda63ebfe2adfee8f070f04cb32e57ebd8409c8e13b4dc0a29539c277

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp312-cp312-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cea176f4cf6c3cf672b1442e00bde29fc134e4fd0a98e2fb33c1e3422bee5363
MD5 28d75fba0443d41d9a369df89fc033a1
BLAKE2b-256 4b5e08eef2515489e5d8e5739718abb31497b40315cc00ca063601856ec44c27

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp312-cp312-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp312-cp312-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b9ae94256ec73f5a38342a18f8985d0431b9c7d068342aba75ddc55ac4877c54
MD5 6526cebb49b22d4164d299ee951e2c60
BLAKE2b-256 17d31d63f0369e8ede36d560f4d5375385035aa1923f3d880361517579028710

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp312-cp312-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp312-cp312-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7c6ee92f6526f1b4fea81704601ccb8a2b2ddc9daff487e119061c0e613e409b
MD5 d16d416c5a4266a0db446aed41700b34
BLAKE2b-256 a0523bb9c13888a9c716896b8dce6fd8753bfc79f83d66ebb922514bcac21127

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 039dc2c4cd965ad25aa422af100198af757c888ad957563dc0860a73f752a1a1
MD5 cde1722eb5bd7f2a6df326790143fba4
BLAKE2b-256 93b4739789c09e74bd25722334fead85f08ec406b1c3728b67e797072ecfeb97

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7bce36a642e97887d46789494197c15c84f3b0aab41892c3dd58b9ed9c0af494
MD5 f86e020534988800d36644995125deb7
BLAKE2b-256 b6b3ff2f313bc8a73d97669ffd62b26a5b6ec543b3bbde0663d81766f3f303e0

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp311-cp311-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1bbeca1f7195609962b2d91993db8ce9bd019cdacdf83ab5d21ac2f38ec21664
MD5 83691cee76e44ce09a77a41a758232cd
BLAKE2b-256 d24024c80dd966266bc67a2207682e8bec6053f4819ca2a4aee29ae2ca2fcec2

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp311-cp311-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp311-cp311-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 c7fe4417c4f99430122db71bf9133e8f3eced2b2dcd0b10206a63272e06aadc7
MD5 5a73e0781af373fce65508e8538da166
BLAKE2b-256 e84b7516f7e6aa52a827890030bdc779d8b9eb6ea1fa4a400537bb136fbd74c8

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp311-cp311-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp311-cp311-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7604da4776618f024cc53e0de8d67ec4b42682847535e66cf4e900b15a3c55c5
MD5 5c3cae7e96c467dc677ae3b4a0c89530
BLAKE2b-256 4ec0e8c1d0a0f7198226e525aa3023eeeb5fa311765fb6478fe1900c49fdf807

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f0940f8fb34ffdb5c9a3701eec00f525af387d97232d93df74a56459847741fd
MD5 db22d0a1b3fa0568175db237986477a3
BLAKE2b-256 c801ec15ccb7ff0e25d7c15940d9f731497a142ee5b594c476e841a285088757

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 576be9196ad777526ec555252365bcc1d2eed164b6e51ef4402ef9bbbafd13af
MD5 77a4ba8adfb0fe9c08f361b9cfc6df17
BLAKE2b-256 9ebc7d0fb98b62b20ee6e20f662a2deacfb612a1dc0adc86905d2a5ba87470cb

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp310-cp310-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp310-cp310-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 783010ce0a6454b1e3308aa5b39cfd0503779faee468fdc975b50c992fc91bf4
MD5 3c11283a1bda571a57506f977459ec4c
BLAKE2b-256 4c379b01b3fc0fbb9f3a8008bb6680c74e2f19b2e212a9c09f6a6e1e51dd9216

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp310-cp310-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp310-cp310-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 7a51488a293189bd73618880ca4a31bd5e75b7d3695e8ef92602fafb830fb5bb
MD5 93054c2ca8a022a82fbaac04dcd5f5ef
BLAKE2b-256 b84779866b921b0689be14676892c8a07d9f36ca6e004ccfa1c45fda3605158e

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp310-cp310-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp310-cp310-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 06a55896a0a37bae41ad14276cc00c32a90b903254c2905abc9c033967378b6f
MD5 8ebba9c150a5166087eac23494ccb02e
BLAKE2b-256 7c06a644bed6a85bd57691341a11632bb59d241ed2bcf63dd6ce27a4a60529fd

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 1580856827aa25dfbeb471523572248d03aa3cce251dccd40b980e1e91fc3989
MD5 be0de4e8414a20bbe8de499f9dcdd9a9
BLAKE2b-256 433268495fda522ee945aec36fe620df38680549509fe9ec35edda958702cf34

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a42f16ae6cb270a7801d5d93f2d004dad4c40931a7ccbd358320a375c4865530
MD5 4a73124c3d86d874fa9fe3027d8de50d
BLAKE2b-256 08ee7ac6fbebf0952b9bf9c4e06fddc7078c3311fa602fe4498961ee6ff17d0c

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e64d6200c36da41dcb8fdfc7a7abd5106a2c17c2350ee5533cfe168650017120
MD5 cd8f6c0d30d7b6c51c09dbe6b752e2c7
BLAKE2b-256 d5873d72799f5fb6a8783167ea7ae799cfd54f93fdf74b4be387a2b810efcfbc

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp39-cp39-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp39-cp39-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 d14dac7a40803bd85b6633145162812a6f36350af8643bcbb69b08748d7d4f2f
MD5 316f8bb6367c381d5bd2fbdb18e8bc45
BLAKE2b-256 f9b2da48a198e8700d50cbe5ed21574ebb7fe2be6f5369e95645b0559a1a23ae

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp39-cp39-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 b2fd6e46f3e2ad452aca415e9b2ae37108819e2e69c4c852922773911be5cc04
MD5 c2ff694bf0631b446dcd0a31693707a7
BLAKE2b-256 da584c6cf07c1ff56ea187b2289026b94c2af657e31421ee6694c458c79e3819

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp39-cp39-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 269f719ef04abf804e90d91dc8b0dcfa0a6e223eff2b9eb7050dfba7dabf8b42
MD5 afbe88731e5fd62fb483ad0a9df3ac71
BLAKE2b-256 3518863933e416d971afa8b2b531842d42e18f07ae141386da352377520a726c

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f3d9cd62db10d5094a69026e35d6e073279631e19e46d5307c528d4e52a49533
MD5 06c59fdb4071306cdcfb7c3f0f0d1c92
BLAKE2b-256 b7635e5259b79bf2f7ed0694cf41039108471177e6dbd05c3b34e122979031f6

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp38-cp38-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp38-cp38-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 dd508653c6c3c4483804d3f145f318e479f4891365bd56eb2710e23d2158a3cf
MD5 fb831db7ba485170e0cef0ce5de1d15a
BLAKE2b-256 ac7825d7ef886394b45472316bf6ebc16bdd83abab226463a9f6c36d46047897

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp38-cp38-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp38-cp38-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2e1059e5c2172a651be7186297cc156425426f62cc98a841daeb3f60cf5bf25c
MD5 ef4d7480f31e965b267c577ffe0ee754
BLAKE2b-256 80216d2182bd654fb8f85d1732f9fdffb522031f7bd198459d9fa174a24cd2b8

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp38-cp38-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp38-cp38-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 af5f60904b6845bda54a8dc046a466c62ec6079ba6942d208e99b008bd377182
MD5 637eb091d82babac23f7c42619810d03
BLAKE2b-256 7f7b5b0846ec5642214525f708fa0fe7439f2aec758f42c54bac15f65b626d3c

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp38-cp38-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 858215c804c3074ecbc87f818c2fb3a38defab9a89636ebba34646d726e90de7
MD5 e0f1603ea15e267501c4eeaa3667ed1e
BLAKE2b-256 7dbf6089ef5251099f68447f812f43de53fd19d092705d434447c1c4069f5ba4

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp37-cp37-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp37-cp37-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ceb5a1d6ba43586d1cd8cb0da6472d7bf2d4ca8f67f46c3962fee2a3df5653f2
MD5 29eecd87368cf87c92a4e736e759a193
BLAKE2b-256 9e8d3ab0739900be2654eb1f495bcc864afe03c8928a428ea7415f7a96462d31

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp37-cp37-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp37-cp37-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f43d58852b09da8fd98b0bbc027b30ee3e311cac4affa7b3eb58e5c198b59c4c
MD5 81ff35fa1d11673d4fd5444665890d43
BLAKE2b-256 521c7ad593482b86f7ece73591105ae4b5e1d6dfd08d02f3fb4de0ff195ed480

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp37-cp37-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp37-cp37-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8210189135afaf27615ffd54d67e70859163fee8bef84a8135871e52296c72f0
MD5 dcc9f247cf2c8f143ee80f8e59d1f6a7
BLAKE2b-256 b1887fb4615e8f40e27504eb73d0ace78fa724d7cc063025f656ac3c5d7547e5

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp37-cp37-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp37-cp37-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 957e37189b7a02d35f8f698a6a541275239aec52e81e8348334ca8b165f7989f
MD5 e72a1ee7dcd953ae40fd45f5d3cfe912
BLAKE2b-256 c761deadd5ed06243a7b6df9d88227f0b374e1d5c40a0d12512339b11f757797

See more details on using hashes here.

File details

Details for the file reliq-0.0.47-cp37-cp37-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for reliq-0.0.47-cp37-cp37-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4cc4093218cc6780fbd61f7ab2fff9595a9bbc80e2d291cea109889d22fea665
MD5 7858357966865a2be030bb29cfe6be61
BLAKE2b-256 5cead14c5926e4a42cf696ab6cdcee117ae449da6f62cdd67f8bc35aa3265a60

See more details on using hashes here.

Supported by

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