diff --git a/CHANGELOG.md b/CHANGELOG.md index 19349d75..d3bff798 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,25 @@ Instructions: Add a subsection under `[Unreleased]` for additions, fixes, change ## [Unreleased] +### Fixed + +- Improve custom `ol` markers in HTML output, especially for safari browsers. +- Doenet loading improvements +- Workspace and solutions for printouts work better (in the right order). +- Asymptote rendering recognizes the version of asymptote installed (and reacts accordingly). + +### Changed + +- `pretext validate` now follows core, which checks the source against both schemas in one pass and adds a survey of the experimental constructs in use to the report. An experimental construct is not an error, so it no longer makes validation exit non-zero; it is counted and reported separately, since its markup may change without a deprecation cycle. +- `pretext validate --method` now selects only where the checks run: `local` (an installed jing, the default) or `server` (jing as a remote service). The shape of the report has moved to `pretext validate --report-form`: `full` (the default) or `terse` (machine-readable, one tab-separated message per line), so `--method terse` becomes `--report-form terse`. + +### Removed + +- `pretext import` command (LaTeX conversion via plastex) completely removed. It was an experimental feature that never reached a stable enough state to be useful. +- CodeChat support has been removed. Builds no longer write the `.mapping.json` source-to-output map, `codechat_config.yaml` is no longer a managed project resource (`pretext update-project` deletes an unmodified one), and the devcontainer template no longer forwards the CodeChat Server ports or installs the CodeChat extension. Neither Codespaces nor the PreTeXt Tools VS Code extension use it. +- `pretext validate --dev` (and `--method local-dev`), since validation now always consults the development schema and reports what only the production schema rejects as an experimental construct. +- Ordered-lists as a way to structure multi-part exercises has been deprecated (use `` instead). + ## [2.49.1] - 2026-08-13 Includes updates to core through commit: [5836dfc](https://github.com/PreTeXtBook/pretext/commit/5836dfcbdc342841acdbe266871a204c8a9dc8cc) diff --git a/pretext/__init__.py b/pretext/__init__.py index dd22b7e5..5692a56e 100644 --- a/pretext/__init__.py +++ b/pretext/__init__.py @@ -18,7 +18,7 @@ VERSION = get_version("pretext", Path(__file__).parent.parent) -CORE_COMMIT = "5836dfcbdc342841acdbe266871a204c8a9dc8cc" +CORE_COMMIT = "5db49adcff964748dba917941936989e6ca9f09f" def activate() -> None: diff --git a/pretext/cli.py b/pretext/cli.py index 1034e080..1caf3c5e 100644 --- a/pretext/cli.py +++ b/pretext/cli.py @@ -22,7 +22,6 @@ resources, constants, logger, - plastex, server, VERSION, CORE_COMMIT, @@ -735,18 +734,20 @@ def build( ) @click.argument("target_name", required=False, metavar="target") @click.option( - "--dev", - is_flag=True, - help="Validate against the development schema (pretext-dev.rng) instead of the " - "stable schema, allowing experimental elements.", + "--method", + type=click.Choice(["local", "server"]), + default="local", + show_default=True, + help='Where the schema checks run: "local" (an installed jing) or "server" ' + "(jing as a remote service, needing no local install).", ) @click.option( - "--method", - type=click.Choice(["local", "local-dev", "server", "terse"]), - default=None, - help='How to validate: "local" (an installed jing, the default), "local-dev" ' - '(as "local", against the development schema), "server" (jing as a remote ' - 'service, needing no local install), or "terse" (machine-readable, one ' + "--report-form", + type=click.Choice(["full", "terse"]), + default="full", + show_default=True, + help='The shape of the report: "full" (locations, excerpts, and ' + 'explanations, meant to be read) or "terse" (machine-readable, one ' "tab-separated message per line).", ) @click.option( @@ -765,18 +766,21 @@ def build( def validate( ctx: click.Context, target_name: Optional[str], - dev: bool, - method: Optional[str], + method: str, + report_form: str, engine: str, ) -> None: """ Validate the source of TARGET against the PreTeXt RelaxNG schema. - Writes the consolidated validation report: the schema messages from jing - together with those of the "validation-plus" stylesheet, each naming the - source file, path, and line it came from. Without TARGET, the first target - in project.ptx is used. Exit codes: 0 = valid, 1 = invalid, 2 = validation - could not be performed (no validator available). + Writes the consolidated validation report: the schema messages from jing, + a survey of the experimental constructs in use, and the messages of the + "validation-plus" stylesheet, each naming the source file, path, and line + it came from. An experimental construct is not an error, so it does not + make validation fail; it is markup whose form may change without a + deprecation cycle. Without TARGET, the first target in project.ptx is used. + Exit codes: 0 = valid, 1 = invalid, 2 = validation could not be performed + (no validator available). """ project = ctx.obj["project"] target = project.get_target(target_name) @@ -788,11 +792,9 @@ def validate( log.error(f"Could not assemble source for validation: {e}") raise SystemExit(1) - if method is None: - method = "local-dev" if dev else "local" log.info( f"Validating source of target {target.name} " - f"(method: {method}, engine: {engine})." + f"(method: {method}, report form: {report_form}, engine: {engine})." ) if engine == "salve": log.warning( @@ -800,7 +802,9 @@ def validate( "differently from jing's, so a report from it will not match a " "report from jing line for line." ) - result = target.validate_source(method=method, engine=engine) + result = target.validate_source( + method=method, engine=engine, report_form=report_form + ) if result is None: log.error("Validation could not be performed.") @@ -811,7 +815,13 @@ def validate( ) raise SystemExit(2) - message_count, report = result + message_count, experimental_count, report = result + if experimental_count: + log.info( + f"Experimental constructs are in use at {experimental_count} " + "locations; the report surveys them. They are not errors, but " + "their markup may change without a deprecation cycle." + ) if message_count == 0: log.info("PreTeXt source passed validation with no messages.") log.info(f"Report: {report}") @@ -1212,47 +1222,3 @@ def deploy( ctx.invoke(view, stage=True) else: project.deploy(update_source=update_source, skip_staging=True, no_push=no_push) - - -# pretext import -@main.command( - short_help="Experimental: convert a latex file to pretext", - context_settings=CONTEXT_SETTINGS, - name="import", -) -@nice_errors -@click.pass_context -@click.argument("latex_file", required=True) -@click.option("-o", "--output", help="Specify output directory", required=False) -def import_command(ctx: click.Context, latex_file: str, output: str) -> None: - """ - Experimental: convert a latex file to pretext - """ - latex_file_path = Path(latex_file).resolve() - if not latex_file_path.exists(): - log.error(f"File {latex_file_path} does not exist.") - return - if output is not None: - output_path = Path(output).resolve() - if not output_path.exists(): - log.warning("Output directory does not exist. Creating it.") - output_path.mkdir(parents=True) - else: - output_path = Path.cwd() / "imports" / latex_file_path.stem - output_path.mkdir(parents=True, exist_ok=True) - # Now we use plastex to convert: - log.info(f"Converting {latex_file_path} to PreTeXt.") - with tempfile.TemporaryDirectory(prefix="ptxcli_") as tmpdirname: - temp_path = Path(tmpdirname) / "import" - temp_path.mkdir() - log.info(f"Using temporary directory {temp_path}") - # change to this directory to run plastex - with utils.working_directory(temp_path): - try: - plastex.convert(latex_file_path, output_path) - shutil.copytree(temp_path, output_path, dirs_exist_ok=True) - log.debug(f"Conversion done in {temp_path}") - except Exception as e: - log.error(e) - log.debug("Exception info:\n------------------------\n", exc_info=True) - return diff --git a/pretext/codechat.py b/pretext/codechat.py deleted file mode 100644 index c30765e2..00000000 --- a/pretext/codechat.py +++ /dev/null @@ -1,128 +0,0 @@ -# *********************************************************** -# codechat.py -- Compute mapping used by the CodeChat System -# *********************************************************** -# This function computes a mapping between source file names and the resulting HTML files built from them by PreTeXt. The `CodeChat System `_ then uses this mapping to synchronize between a source file and its resulting rendered form. -# -# -# Imports -# ======= -# These are listed in the order prescribed by `PEP 8 -# `_. -# -# Standard library -# ---------------- -import collections # defaultdict -import glob # glob -import json # dumps -from pathlib import Path -import sys # platform -import urllib.parse # urlparse -import urllib.request # pathname2url - -# Third-party imports -# ------------------- -# We assume a previous call to ``xsltproc`` has already verified that lxml is installed. -import lxml.etree as ET # noqa: N812 -import lxml.ElementInclude - -# Local application imports -# ------------------------- -# None. - - -# Mapping -# ======= -# Build a mapping between XML IDs and the resulting generated HTML files. The goal: map from source files to the resulting HTML files produced by the pretext build. The data structure is: -# -# .. code:: -# :number-lines: -# -# path_to_xml_id: Dict[ -# # A path to the source file -# str, -# # A list of XML IDs in this source file which produce HTML files. -# List[str] -# ] -# -# This allows a single source file to produce multiple HTML files, as well as supporting a one-to-one relationship. The list captures the order of appearance of the XML IDs in the tree -- element 0 is the first XML ID, etc. -def map_path_to_xml_id( - # A path to the root XML file in the pretext book being processed. - xml: Path, - # A path to the project directory, which (should) contain ``codechat_config.yaml``. - project_path: Path, - # A path to the destination or output directory. The resulting JSON file will be stored there. - dest_dir: str, -) -> None: - # Make insertions easy by specifying that newly-created entries in ``path_to_xml_id`` contain an empty list. - path_to_xml_id = collections.defaultdict(list) - - # Normalize path separators to current OS. - _xml = str(xml.resolve()) - - # This follows the `Python recommendations `_. - is_win = sys.platform == "win32" - - # Look at all HTML files in the output directory. Store only their stem, since this is what an XML ID specifies. Note that all output files will have the same path prefix (the ``dest_dir`` and the same suffix (``.html``); the stem is the only unique part. - html_files = set( - Path(html_file).stem for html_file in glob.glob(dest_dir + "/*.html") - ) - - # lxml turns ``xml:id`` into the string below. - xml_ns = "{http://www.w3.org/XML/1998/namespace}" - xml_base_attrib = f"{xml_ns}base" - xml_id_attrib = f"{xml_ns}id" - - # Define a loader which sets the ``xml:base`` of an xincluded element. While lxml `evidently used to do this in 2013 `_, a change eliminated this ability per some `discussion `_, which included a rejected patch fixing this problem. `Current source `_ lacks this patch. - # - # Since there's few docs on this function, ignore the lack of types. - def my_loader(href: str, parse: str, encoding: str = None, parser=None): # type: ignore - # Decode the URL-encoded filename for non-xml, on-disk data. See `lxml.ElementInclude._lxml_default_loader`. - if parse != "xml" and "://" not in href: - href = urllib.parse.unquote(href) - ret = lxml.ElementInclude._lxml_default_loader(href, parse, encoding, parser) - # The return value may not be an element. - if isinstance(ret, ET._Element): - ret.attrib[xml_base_attrib] = href - return ret - - # Load the XML, performing xincludes using this loader. - huge_parser = ET.XMLParser(huge_tree=True) - src_tree = ET.parse(_xml, parser=huge_parser) - try: - # ``max_depth=None`` lifts ElementInclude's default 6-level inclusion - # limit, which deeply divided books can exceed. Cyclic includes still - # raise, so this cannot loop forever. - lxml.ElementInclude.include(src_tree, loader=my_loader, max_depth=None) - except Exception: - # ``tree.xinclude()`` also performs the inclusions, but libxml2 >= 2.13 - # no longer records ``xml:base`` on included elements, so every xml:id - # gets attributed to the root source file. Acceptable as a fallback: - # the mapping stays complete, only its per-file granularity is lost. - src_tree.xinclude() - - # Walk though every element with an xml ID. Note: the type stubs don't have the ``iterfind`` method, hence the ignore in the next line. - for elem in src_tree.iterfind(f".//*[@{xml_id_attrib}]"): # type: ignore - # Consider only elemets whose ID produced an HTML file. TODO: use a walrus operator after Python 3.7 is EOL. - xml_id = elem.get(xml_id_attrib) - if xml_id in html_files: - # Store this discovered mapping between ID and output file. - # - # The `elem.base `_ gives the URL of this file (which is correct due to the custom loader). Extract the path. - up = urllib.parse.urlparse(elem.base) - # If this isn't a ``file`` scheme (or an unspecified schema, which seems to default to a file), we're lost. - assert up.scheme in ("file", "") - path = up.path - # On Windows, this produces ``path == "/C:/path/to/file.ptx"``. Remove the slash. - if is_win: - path = path[1:] - # Decode the URL-encoded filename. - path = urllib.parse.unquote(path) - # Use ``resolve()`` to standardize capitalization on Windows. - stdpath = Path(path).resolve() - # Make this path relative to the project directory, to avoid writing potentially confidential information (username / local filesystem paths) to the mapping file, which might be published to the web. Do this in posix, to avoid platform-specific paths. - relpath = stdpath.relative_to(project_path).as_posix() - # Add this XML ID to others for this path. - path_to_xml_id[str(relpath)].append(xml_id) - - # Save the result as a JSON file in the ``dest_dir``. - (Path(dest_dir) / ".mapping.json").write_text(json.dumps(path_to_xml_id)) diff --git a/pretext/constants.py b/pretext/constants.py index cf1c5dd8..bd5d4da7 100644 --- a/pretext/constants.py +++ b/pretext/constants.py @@ -282,7 +282,6 @@ PROJECT_RESOURCES = { "project.ptx": Path("project.ptx"), - "codechat_config.yaml": Path("codechat_config.yaml"), ".gitignore": Path(".gitignore"), "devcontainer.json": Path(".devcontainer/devcontainer.json"), "requirements.txt": Path("requirements.txt"), @@ -292,6 +291,7 @@ } DEPRECATED_PROJECT_RESOURCES = { + "codechat_config.yaml": Path("codechat_config.yaml"), "deploy.yml": Path(".github", "workflows", "deploy.yml"), "test-build.yml": Path(".github", "workflows", "test-build.yml"), ".devcontainer.json": Path(".devcontainer.json"), diff --git a/pretext/plastex/Alignment.jinja2s b/pretext/plastex/Alignment.jinja2s deleted file mode 100644 index 011a7f8f..00000000 --- a/pretext/plastex/Alignment.jinja2s +++ /dev/null @@ -1,24 +0,0 @@ -name: center centering centerline - - {{ obj }} - -{# #} - -name: flushleft raggedright leftline - - {{ obj }} - -{# #} - - -name: raggedleft flushright llap - - {{ obj }} - -{# #} - -name: raggedbottom - - {{ obj }} - -{# #} diff --git a/pretext/plastex/Arrays.jinja2s b/pretext/plastex/Arrays.jinja2s deleted file mode 100644 index c66799c9..00000000 --- a/pretext/plastex/Arrays.jinja2s +++ /dev/null @@ -1,15 +0,0 @@ -name: tabular array tabular* tabularx - -{% for row in obj %} - - {% for cell in row %} - {{ cell }} - {% endfor %} - -{% endfor %} - - -name: multicolumn -{{ obj }} - -name: cline toprule bottomrule midrule cmidrule morecmidrules addlinespace specialrule diff --git a/pretext/plastex/Bibliography.jinja2s b/pretext/plastex/Bibliography.jinja2s deleted file mode 100644 index 32964bc8..00000000 --- a/pretext/plastex/Bibliography.jinja2s +++ /dev/null @@ -1,15 +0,0 @@ -name: thebibliography - -{% for item in obj %} - {{ item }} -{% endfor %} - - -name: bibliography - - -{{ obj }} - - - - diff --git a/pretext/plastex/Boxes.jinja2s b/pretext/plastex/Boxes.jinja2s deleted file mode 100644 index ab41fa0e..00000000 --- a/pretext/plastex/Boxes.jinja2s +++ /dev/null @@ -1,13 +0,0 @@ -name: mbox makebox -{{ obj }} - -name: fbox framebox -{{ obj }} - -name: parbox -{{ obj }} - -name: minipage -{{ obj }} - -name: raisebox rule diff --git a/pretext/plastex/Breaking.jinja2s b/pretext/plastex/Breaking.jinja2s deleted file mode 100644 index 2776cc6e..00000000 --- a/pretext/plastex/Breaking.jinja2s +++ /dev/null @@ -1,2 +0,0 @@ -name: linebreak \ newline pagebreak newpage clearpage cleardoublepage - diff --git a/pretext/plastex/Crossref.jinja2s b/pretext/plastex/Crossref.jinja2s deleted file mode 100644 index f34e41a0..00000000 --- a/pretext/plastex/Crossref.jinja2s +++ /dev/null @@ -1,13 +0,0 @@ -name: ref -{% if 'label' in obj.idref and obj.idref.label.ref %}{{obj.idref.label.ref}}{% else %}??{% endif %} - -name: eqref -{% if 'label' in obj.idref and obj.idref.label.ref %}{{obj.idref.label.ref}}{% else %}??{% endif %} - -name: cref Cref -{% if 'label' in obj.idref and obj.idref.label.ref %}{{ obj.refname() }} {{obj.idref.label.ref}}{% else %}??{% endif %} - -name: pageref -{% if 'label' in obj.idref and obj.idref.label.ref %}{% else %}??{% endif %} - -name: label diff --git a/pretext/plastex/Floats.jinja2s b/pretext/plastex/Floats.jinja2s deleted file mode 100644 index c84f98e2..00000000 --- a/pretext/plastex/Floats.jinja2s +++ /dev/null @@ -1,17 +0,0 @@ -name: figure figure* -
- {{ obj }} -
- -name: table table* - - {{ obj }} -
- -name: marginpar - - -name: caption - - {{ obj }} - diff --git a/pretext/plastex/FontSelection.jinja2s b/pretext/plastex/FontSelection.jinja2s deleted file mode 100644 index f0986487..00000000 --- a/pretext/plastex/FontSelection.jinja2s +++ /dev/null @@ -1,87 +0,0 @@ -name: mdseries textmd -{{ obj }} - -name: bfseries textbf -{{ obj }} - -name: rmfamily textrm -{{ obj }} - -name: sffamily textsf -{{ obj }} - -name: ttfamily texttt -{{ obj }} - -name: upshape textup -{{ obj }} - -name: itshape textit -{{ obj }} - -name: slshape textsl -{{ obj }} - -name: scshape textsc -{{ obj }} - -name: textnormal -{{ obj }} - -name: rm -{{ obj }} - -name: cal -{{ obj }} - -name: it -{{ obj }} - -name: sl -{{ obj }} - -name: bf -{{ obj }} - -name: tt -{{ obj }} - -name: sc -{{ obj }} - - -name: tiny -{{ obj }} - - -name: scriptsize -{{ obj }} - -name: footnotesize -{{ obj }} - -name: small -{{ obj }} - -name: normalsize -{{ obj }} - -name: large -{{ obj }} - -name: Large -{{ obj }} - -name: LARGE -{{ obj }} - -name: huge -{{ obj }} - -name: Huge -{{ obj }} - - -name: symbol - {{obj}} - diff --git a/pretext/plastex/Footnotes.jinja2s b/pretext/plastex/Footnotes.jinja2s deleted file mode 100644 index 9b57701c..00000000 --- a/pretext/plastex/Footnotes.jinja2s +++ /dev/null @@ -1,7 +0,0 @@ -name: footnote -{{ obj }} - -name: footnotemark -{{ obj }} - -name: footnotetext diff --git a/pretext/plastex/Index.jinja2s b/pretext/plastex/Index.jinja2s deleted file mode 100755 index 56a8f8e3..00000000 --- a/pretext/plastex/Index.jinja2s +++ /dev/null @@ -1,11 +0,0 @@ -name: theindex printindex - - Index - - - -name: index -{{obj.argSource[1:-1]}} - -name: see seealso -{{ obj.captionName }} diff --git a/pretext/plastex/Lists.jinja2s b/pretext/plastex/Lists.jinja2s deleted file mode 100644 index 84224d60..00000000 --- a/pretext/plastex/Lists.jinja2s +++ /dev/null @@ -1,21 +0,0 @@ -name: itemize -
    -{% for item in obj %} -
  • {{ item }}
  • -{% endfor %} -
- -name: enumerate -
    -{% for item in obj %} -
  1. {{ item }}
  2. -{% endfor %} -
- -name: list trivlist description -
-{% for item in obj %} - {{ item.attributes.term or obj.attributes.defaultlabel }} -
  • {{ item }}
  • -{% endfor %} -
    diff --git a/pretext/plastex/Pictures.jinja2s b/pretext/plastex/Pictures.jinja2s deleted file mode 100644 index 86e6bc1a..00000000 --- a/pretext/plastex/Pictures.jinja2s +++ /dev/null @@ -1,6 +0,0 @@ -name: picture -{{ obj.source }} - -{{ obj.source }} - - diff --git a/pretext/plastex/Quotations.jinja2s b/pretext/plastex/Quotations.jinja2s deleted file mode 100644 index 55b6ccd4..00000000 --- a/pretext/plastex/Quotations.jinja2s +++ /dev/null @@ -1,14 +0,0 @@ -name: quote -
    - {{ obj }} -
    - -name: quotation -
    - {{ obj }} -
    - -name: verse - - {{ obj }} - diff --git a/pretext/plastex/Sectioning.jinja2s b/pretext/plastex/Sectioning.jinja2s deleted file mode 100644 index 7dbadccd..00000000 --- a/pretext/plastex/Sectioning.jinja2s +++ /dev/null @@ -1,123 +0,0 @@ -name: abstract - - {{ obj }} - - -name: title -{{ obj }} - - -name: author - - {{ obj }} - - - -name: date - - {{ obj }} - - -name: thanks - - {{ obj }} - - -name: maketitle -{% set metadata=obj.ownerDocument.userdata %} - - -{{ metadata.title }} -{% if metadata.author %} -{%for author in metadata.author %} -{{ author }} -{% endfor %} -{% endif %} -{% if metadata.date %} -{{ metadata.date }} -{% endif %} -{% if metadata.thanks %} -{{ metadata.thanks }} -{% endif %} - - - - -name: document -{{ obj }} - - -name: part - - {{ obj.title }} - - {% if obj.links.child and obj.childNodes[0].nodeName == "par" %} - - {{ obj }} - - {%- else -%} - {{ obj }} - {%- endif %} - - {% for section in obj.tableofcontents recursive %} - - {% endfor %} - -{# #} - - -name: chapter - - {{ obj.title }} - - {% if obj.links.child and obj.childNodes[0].nodeName == "par" %} - - {{ obj }} - - {%- else -%} - {{ obj }} - {%- endif %} - - {% for section in obj.tableofcontents recursive %} - - {% endfor %} - -{# #} - - -name: section -
    - {{ obj.title }} - - {{ obj }} - -
    - - - -name: subsection - - {{ obj.title }} - - {{ obj }} - - -{# #} - - -name: subsubsection - - {{ obj.title }} -{# #} - - -name: paragraph - - {{ obj.title }} - - {{ obj }} - -{# #} diff --git a/pretext/plastex/Sentences.jinja2s b/pretext/plastex/Sentences.jinja2s deleted file mode 100644 index 0b293f63..00000000 --- a/pretext/plastex/Sentences.jinja2s +++ /dev/null @@ -1,56 +0,0 @@ -name: $ -$ - -name: % -% - -name: { -{ - -name: } -} - -name: _ -_ - -name: & -& - -name: # -# - - -name: LaTeX -{{""}} - - -name: TeX -type: xml -{{""}} - -name: emph em -{{ obj }} - -name: active::~ -  - -name: enspace enskip -comment:   - -name: quad - - -name: qquad - - -name: thinspace / -comment:   - -name: underbar -{{ obj }} - -name: textsuperscript - - -name: textsubscript - diff --git a/pretext/plastex/Space.jinja2s b/pretext/plastex/Space.jinja2s deleted file mode 100644 index d9426ea3..00000000 --- a/pretext/plastex/Space.jinja2s +++ /dev/null @@ -1,17 +0,0 @@ -name: -hspace -  - -name: -vspace -
     
    - - - -name: -bigskip -
    - -name: -medskip -
    - -name: -smallskip -
    - diff --git a/pretext/plastex/Tabbing.jinja2s b/pretext/plastex/Tabbing.jinja2s deleted file mode 100644 index bb6b4c62..00000000 --- a/pretext/plastex/Tabbing.jinja2s +++ /dev/null @@ -1,5 +0,0 @@ -name: tabbing - - diff --git a/pretext/plastex/Themes/__init__.py b/pretext/plastex/Themes/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pretext/plastex/Themes/default/__init__.py b/pretext/plastex/Themes/default/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pretext/plastex/Themes/default/default-layout.jinja2 b/pretext/plastex/Themes/default/default-layout.jinja2 deleted file mode 100644 index 608d7b2c..00000000 --- a/pretext/plastex/Themes/default/default-layout.jinja2 +++ /dev/null @@ -1,4 +0,0 @@ - - -{{ obj }} - diff --git a/pretext/plastex/Themes/default/document-layout.jinja2 b/pretext/plastex/Themes/default/document-layout.jinja2 deleted file mode 100644 index b10022e0..00000000 --- a/pretext/plastex/Themes/default/document-layout.jinja2 +++ /dev/null @@ -1,38 +0,0 @@ -{% set links = obj.links %} -{% set doc = obj.ownerDocument.getElementsByTagName('document')[0] %} -{% set type = obj.ownerDocument.getElementsByTagName('documentclass')[0].attributes['name'] %} -{% set toc = obj.tableofcontents %} - - - - - - -{% if type == 'article' %} -
    - {{ obj.title }} - {{ obj }} -{% for section in toc recursive %} - - {% endfor %} -
    - {% else %} - - {{ obj.title }} - - - - - {{ obj }} - -{% for section in toc recursive %} - - {% endfor %} - - - - - -{% endif %} -
    - diff --git a/pretext/plastex/Thms.jinja2s b/pretext/plastex/Thms.jinja2s deleted file mode 100644 index 8f5c0d2c..00000000 --- a/pretext/plastex/Thms.jinja2s +++ /dev/null @@ -1,18 +0,0 @@ -name: thmenv -<{{ obj.thmName }}> - {% if obj.title %} - {{ obj.title }} - {% endif %} - - {{ obj }} - - - - -name: proof - - {{ obj }} - - -name: qedhere qed - diff --git a/pretext/plastex/Verbatim.jinja2s b/pretext/plastex/Verbatim.jinja2s deleted file mode 100644 index 0d3aba36..00000000 --- a/pretext/plastex/Verbatim.jinja2s +++ /dev/null @@ -1,5 +0,0 @@ -name: verbatim -
    {{ obj }}
    - -name: verb -{{ obj }} diff --git a/pretext/plastex/__init__.py b/pretext/plastex/__init__.py deleted file mode 100644 index 969dd0ac..00000000 --- a/pretext/plastex/__init__.py +++ /dev/null @@ -1,78 +0,0 @@ -from plasTeX.Renderers.PageTemplate import Renderer as _Renderer -from plasTeX.TeX import TeX -from pathlib import Path -import re -import logging - -log = logging.getLogger("ptxlogger") - - -class Pretext(_Renderer): - """Renderer for the PreTeXt XML format""" - - fileExtension = ".ptx" # noqa: N815 - - def processFileContent(self, document: str, s: str) -> str: # noqa: N802 - s = _Renderer.processFileContent(self, document, s) - - # Remove empty paragraphs - s = re.compile(r"

    \s*

    ", re.I).sub(r"", s) - - # Fix fancy quotes - s = re.compile(r"“(.*?)”", re.I).sub(r"\1", s) - s = re.compile(r"‘(.*?)’", re.I).sub(r"\1", s) - - # Fix strange apostrophes - s = s.replace("’", "'") - - return s - - -Renderer = Pretext - - -def convert(input_file: Path, output: Path) -> None: - log.info(f"Converting {input_file} to {output}") - - input_file_dir = input_file.parent - - def getLines(input_file: Path) -> str: # noqa: N802 - with open(input_file, "r") as f: - lines = str() - line = f.readline() - while line: - if line.strip().startswith("\\input{") or line.strip().startswith( - "\\include{" - ): - inner_file = ( - input_file_dir / line[line.find("{") + 1 : line.find("}")] - ) - # ensure inner_file has file extension: - if not inner_file.suffix: - inner_file = inner_file.with_suffix(".tex") - log.debug(f"Adding .tex extension to {inner_file}") - lines = lines + "\n" + getLines(inner_file) + "\n" - else: - lines += line - line = f.readline() - return lines - - tex = TeX() - tex.input(getLines(input_file)) - doc = tex.parse() - log.debug("Done reading input file.") - - tex.ownerDocument.config["files"]["split-level"] = 1 - tex.ownerDocument.config["files"][ - "filename" - ] = "main $name-[$id, $title, $ref, sect$num(4)]" - # Disable image generation - tex.ownerDocument.config["images"]["enabled"] = "no" - tex.ownerDocument.config["images"]["imager"] = "none" - tex.ownerDocument.config["images"]["vector-imager"] = "none" - - renderer = Renderer() - renderer.render(doc) - - # shutil.move('test.xml', output) - log.info("\nConversion complete") diff --git a/pretext/plastex/babel.jinja2s b/pretext/plastex/babel.jinja2s deleted file mode 100644 index 5295760d..00000000 --- a/pretext/plastex/babel.jinja2s +++ /dev/null @@ -1,3 +0,0 @@ -name: foreignlanguage otherlanguage -{{ obj }} - diff --git a/pretext/plastex/graphicx.jinja2s b/pretext/plastex/graphicx.jinja2s deleted file mode 100755 index 2521f011..00000000 --- a/pretext/plastex/graphicx.jinja2s +++ /dev/null @@ -1,9 +0,0 @@ -name: includegraphics rotatebox scalebox reflectbox resizebox -{% set image = obj.image %} - - -{{ obj.source }} - - - -name: DeclareGraphicsExtensions graphicspath diff --git a/pretext/plastex/hyperref.jinja2s b/pretext/plastex/hyperref.jinja2s deleted file mode 100644 index ed963a95..00000000 --- a/pretext/plastex/hyperref.jinja2s +++ /dev/null @@ -1,28 +0,0 @@ -name: href -{{ obj }} - -name: url - - -name: nolinkurl -{{ obj.attributes.url }} - - -name: hyperimage - - -name: hyperdef - - -name: hyperref - - -name: hyperlink - - -name: hypertarget - - -name: phantomsection - - diff --git a/pretext/plastex/lipsum.jinja2s b/pretext/plastex/lipsum.jinja2s deleted file mode 100755 index 27121249..00000000 --- a/pretext/plastex/lipsum.jinja2s +++ /dev/null @@ -1,2 +0,0 @@ -name:lipsum -{{ obj.text }} diff --git a/pretext/plastex/longtable.jinja2s b/pretext/plastex/longtable.jinja2s deleted file mode 100644 index 547a4585..00000000 --- a/pretext/plastex/longtable.jinja2s +++ /dev/null @@ -1,15 +0,0 @@ -name: longtable - -{% if obj.title %} -{{ obj.title }} -{% endif %} - -{% for row in obj %} - -{% for cell in row %} - -{% endfor %} - -{% endfor %} - -
    diff --git a/pretext/plastex/math.jinja2s b/pretext/plastex/math.jinja2s deleted file mode 100644 index 3d150edf..00000000 --- a/pretext/plastex/math.jinja2s +++ /dev/null @@ -1,12 +0,0 @@ -name: math ensuremath -{{ obj.mathjax_source[2:-2].replace(" _","_").replace(" ^","^") }}{# -#} - -name: displaymath equation* eqnarray eqnarray* align align* gather gather* flalign flalign* multline multline* alignat alignat* split - - {{ obj.mathjax_source[2:-2].replace(" _","_").replace(" ^","^") }} - - -name: equation - - {{ obj.mathjax_source[2:-2].replace(" _","_").replace(" ^","^") }} - \ No newline at end of file diff --git a/pretext/plastex/misc.jinja2s b/pretext/plastex/misc.jinja2s deleted file mode 100644 index e69de29b..00000000 diff --git a/pretext/plastex/natbib.jinja2s b/pretext/plastex/natbib.jinja2s deleted file mode 100644 index 541ead31..00000000 --- a/pretext/plastex/natbib.jinja2s +++ /dev/null @@ -1,9 +0,0 @@ -name: cite citet citep citealt citealp citeauthor citeyear citeyearpar \ - Cite Citet Citep Citealt Citealp Citeauthor citefullauthor citetalias \ - citepalias - - -name: citetext -{{ obj }} - -name: newblock nocite defcitealias diff --git a/pretext/plastex/p.jinja2s b/pretext/plastex/p.jinja2s deleted file mode 100644 index 8d4511f0..00000000 --- a/pretext/plastex/p.jinja2s +++ /dev/null @@ -1,8 +0,0 @@ -name: par -{% if obj.blockType %} -{{ obj }} -{% else %} -

    - {{ obj }} -

    -{% endif %} \ No newline at end of file diff --git a/pretext/plastex/subfig.jinja2s b/pretext/plastex/subfig.jinja2s deleted file mode 100644 index e5cdc130..00000000 --- a/pretext/plastex/subfig.jinja2s +++ /dev/null @@ -1,28 +0,0 @@ -name: subfloat subfig subfigure subtable - - -name: subref subref* - - - -name: newsubfloat DeclareCaptionListOfFormat listsubcaptions captionsetup clearcaptionsetup ContinuedFloat diff --git a/pretext/plastex/textcomp.jinja2s b/pretext/plastex/textcomp.jinja2s deleted file mode 100644 index 8ac9d0e7..00000000 --- a/pretext/plastex/textcomp.jinja2s +++ /dev/null @@ -1,3 +0,0 @@ -name: newtie capitaltie capitaldieresis capitalbreve capitalnewtie \ - capitalgrave capitaldotaccent capitalcedilla -alias: . diff --git a/pretext/plastex/tikzcd.jinja2 b/pretext/plastex/tikzcd.jinja2 deleted file mode 100644 index 57c26b82..00000000 --- a/pretext/plastex/tikzcd.jinja2 +++ /dev/null @@ -1,6 +0,0 @@ - - - {{ obj.source|e }} - - - diff --git a/pretext/plastex/tikzpicture.jinja2 b/pretext/plastex/tikzpicture.jinja2 deleted file mode 100644 index f680ddac..00000000 --- a/pretext/plastex/tikzpicture.jinja2 +++ /dev/null @@ -1,5 +0,0 @@ - - - {{ obj.source|e }} - - diff --git a/pretext/plastex/url.jinja2s b/pretext/plastex/url.jinja2s deleted file mode 100644 index b46c28df..00000000 --- a/pretext/plastex/url.jinja2s +++ /dev/null @@ -1,8 +0,0 @@ -name: url path - - -name: email -{{ obj.attributes.url }} - - -name: urldef urlstyle DeclareUrlCommand diff --git a/pretext/plastex/wrapfig.jinja2s b/pretext/plastex/wrapfig.jinja2s deleted file mode 100755 index 80523a1b..00000000 --- a/pretext/plastex/wrapfig.jinja2s +++ /dev/null @@ -1,2 +0,0 @@ -name: wrapfigure wraptable - diff --git a/pretext/project/__init__.py b/pretext/project/__init__.py index efedd916..a3eb3cb7 100644 --- a/pretext/project/__init__.py +++ b/pretext/project/__init__.py @@ -33,7 +33,6 @@ from . import generate from .. import constants from .. import core -from .. import codechat from .. import utils from .. import types as pt # PreTeXt types from .. import resources @@ -798,23 +797,33 @@ def validate_source( method: str = "local", dest_dir: t.Optional[Path] = None, engine: str = "jing", - ) -> t.Optional[t.Tuple[int, Path]]: + report_form: str = "full", + ) -> t.Optional[t.Tuple[int, int, Path]]: """ Validate the source with core's `validate`, which consolidates the RELAX-NG messages from jing with those of the "validation-plus" stylesheet into one report, and deposits the assembled source its line numbers refer to. - `method` is core's: "local" (the installed jing), "local-dev" (as "local", - against the development schema), "server" (jing as a remote service), or - "terse" (one tab-separated message per line, for a program). + Core checks the source against both schemas. A message from the development + schema is a genuine problem; a construct that only the production schema + rejects is experimental -- not an error, but markup that may change without + a deprecation cycle -- and is surveyed in its own section of the report. + + `method` is core's, and says where the jing runs happen: "local" (an + installed jing) or "server" (jing as a remote service). + + `report_form` is core's shape for the report: "full" (locations, excerpts, + and explanations, meant for an author) or "terse" (one tab-separated + message per line, meant for a program). `engine` selects what performs the RELAX-NG check: "jing", or the experimental "salve" (the validator behind the pretext-tools VS Code extension, run through a jing-compatible shim). The engine is irrelevant to `method="server"`, which validates remotely. - Returns the number of messages in the report along with its path, or `None` - if validation could not be performed at all. + Returns the number of problems found, the number of experimental constructs + surveyed, and the path of the report; or `None` if validation could not be + performed at all. """ if dest_dir is None: dest_dir = self._project.logs_abspath() @@ -837,6 +846,7 @@ def validate_source( out_file=None, dest_dir=dest_dir.as_posix(), method=method, + report_form=report_form, ) except OSError as e: # Raised when the configured `jing` can't be found; core has already @@ -852,25 +862,35 @@ def validate_source( # core returns without a report when it cannot reach a validation server. return None lines = report.read_text(encoding="utf-8").splitlines() - if method == "terse": - # One message per line, and nothing else in the file. - count = len([line for line in lines if line.strip()]) + # Every message names the check that raised it, so the checks are the + # messages. The survey of experimental constructs shares the report with + # the problems, under the check "experimental", and is counted apart: + # using an experimental construct is not a validation failure. + checks: t.List[str] = [] + if report_form == "terse": + # One message per line, and nothing else in the file: five + # tab-separated fields, of which the fourth is the check. A message + # core could not locate is passed through whole, so a line without + # those fields is still a problem to report. + for line in lines: + if not line.strip(): + continue + fields = line.split("\t") + checks.append(fields[3] if len(fields) > 3 else "schema") else: - # Each message in the consolidated report ends with the check that - # raised it, so those lines count the messages of both sections. The - # report opens with a preamble that describes a message's fields + # The report opens with a preamble that describes a message's fields # (including "check:"), so counting starts at the first section # banner to avoid mistaking that description for a message. banner = "=" * 70 first_section = lines.index(banner) if banner in lines else 0 - count = len( - [ - line - for line in lines[first_section:] - if line.startswith(" check: ") - ] - ) - return count, report + prefix = " check: " + checks = [ + line[len(prefix) :].strip() + for line in lines[first_section:] + if line.startswith(prefix) + ] + experimental = checks.count("experimental") + return len(checks) - experimental, experimental, report def build( self, @@ -973,19 +993,6 @@ def build( dest_dir=self.output_dir_abspath().as_posix(), ext_rs_methods=utils.rs_methods, ) - if self.platform != Platform.RUNESTONE: - # On non-runestone builds, we try to create a codechat mapping for authors. - try: - codechat.map_path_to_xml_id( - self.source_abspath(), - self._project.abspath(), - self.output_dir_abspath().as_posix(), - ) - except Exception as e: - log.warning( - "Failed to map codechat path to xml id; codechat will not work." - ) - log.debug(e, exc_info=True) elif self.format == Format.PDF: if self.pdf_method == PdfMethod.PDF_FO: # Experimental support for the new PDF-FO method. @@ -2057,7 +2064,6 @@ def update_boilerplate(self, backup: bool = False, force: bool = False) -> None: - .gitignore - .devcontainer.json - .github/workflows/pretext-cli.yml - - codechat_config.yaml """ for resource in constants.PROJECT_RESOURCES: diff --git a/pretext/utils.py b/pretext/utils.py index c34f8f11..dd6404f0 100644 --- a/pretext/utils.py +++ b/pretext/utils.py @@ -1153,7 +1153,7 @@ def is_unmodified( # Hash file and compare to hash in resource_hash_table hash = hashlib.sha256() hash.update(contents) - if hash.hexdigest() == resource_hash_table[version[0]][resource]: + if hash.hexdigest() == resource_hash_table[version[0]].get(resource): log.debug( f"Resource file {resource} is unmodified, compared to hash." ) diff --git a/pyproject.toml b/pyproject.toml index 12833dfe..1d188ec3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,6 @@ dependencies = [ "pydantic-xml==2.14.3", "qrcode>=7,<8", "psutil>=7,<8", - "plastex>=3,<4", "jinja2>=3,<4", "coloraide>=4,<5", "citeproc-py>=0,<1", @@ -53,15 +52,14 @@ pretext = "pretext.cli:main" [project.optional-dependencies] homepage = ["pelican[markdown]>=4.10,<5"] -prefigure = ["prefig[text]>=0.7.2,<0.8"] -all = ["pelican[markdown]>=4.10,<5", "prefig[text]>=0.7.2,<0.8"] +prefigure = ["prefig[text]>=0.7.4,<0.8"] +all = ["pelican[markdown]>=4.10,<5", "prefig[text]>=0.7.4,<0.8"] # Development dependencies # ------------------------ [dependency-groups] dev = [ "black>=24.10,<27.0", - "codechat-server>=0,<1", "flake8>=6,<7", "lxml-stubs>=0,<1", "mypy>=1,<2", diff --git a/templates/.gitignore b/templates/.gitignore index 9ba8ad52..09b50ae6 100644 --- a/templates/.gitignore +++ b/templates/.gitignore @@ -99,9 +99,6 @@ venv/ .dropbox.attr .dropbox.cache -# Don't track codechat config (will be generated automatically) -codechat_config.yaml - # Don't track deprecated workflows .github/workflows/deploy.yml .github/workflows/test-build.yml diff --git a/templates/codechat_config.yaml b/templates/codechat_config.yaml deleted file mode 100644 index 337cabf2..00000000 --- a/templates/codechat_config.yaml +++ /dev/null @@ -1,55 +0,0 @@ -# This file was automatically generated with PreTeXt {VERSION}. -# If you modify this file, PreTeXt will no longer automatically update it. -# -############################################################# -# -# This file allows the use of the CodeChat previewer for PreTeXt. -# Generally, there is no need to modify this file. -# It will be automatically generated by PreTeXt with the latest -# updates unless you remove the first comment line above. -# -############################################################ -# -# .. Copyright (C) 2012-2023 Bryan A. Jones. -# -# This file is part of the CodeChat System. -# -# The CodeChat System is free software: you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# The CodeChat System is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied warranty -# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with the CodeChat System. If not, see -# . -# -# ************************************************ -# |docname| - Configuration for a CodeChat project -# ************************************************ -# This file defines the configuration for a CodeChat project. It contains a working `PreTeXt `_ configuration. -# -# ``source_path``: optional; defaults to ``.`` (the current directory). A path to the root of the source tree. Relative paths are rooted in the directory containing this configuration file. -source_path: source - -# ``output_path``: required. A path to the root of the HTML output produced by this renderer. Relative paths are rooted in the directory containing this configuration file. -output_path: output/web - -# ``args``: required string or sequence of strings. This provides the arguments to invoke the renderer. These strings may optionally contain the following replacement values: -# -# - ``{project_path}``: an absolute path to the directory containing this file. -# - ``{source_path}``: the ``source_path`` above, but as an absolute path. -# - ``{output_path}``: the ``output_path`` above, but as an absolute path. -# - ``{sys_executable}``: the value of the running Python's `sys.executable `_. -# - ``{xml_id}``: The value of the the first ``xml:id`` attribute in the currently open file. -args: "{sys_executable} -m pretext build web --xmlid {xml_id} --no-knowls" - -# ``html_ext``: optional; defaults to ``.html``. The extension used by this renderer when generating HTML files. -#html_ext: .html - -# ``project_type``: optional; defaults to ``general``. Define the project type, which enables special processing based on the type. Valid values are ``general`` (no special processing), ``Doxygen``, and ``PreTeXt``. -project_type: PreTeXt diff --git a/templates/devcontainer.json b/templates/devcontainer.json index b6cac9dd..2ad7f749 100644 --- a/templates/devcontainer.json +++ b/templates/devcontainer.json @@ -25,38 +25,6 @@ }, - // Port forwarding - // --------------- - // This is needed by the CodeChat Server. - "forwardPorts": [ - // The port used for a Thrift connection between the VSCode CodeChat - // extension and the CodeChat Server. - 27376, - // The port used for an HTTP connection from the CodeChat Client to - // the CodeChat Server. - 27377, - // The port used by a websocket connection between the CodeChat - // Server and the CodeChat Client. - 27378 - ], - // See the [docs](https://containers.dev/implementors/json_reference/#port-attributes). - "portsAttributes": { - "27376": { - "label": "VSCode extension <-> CodeChat Server", - "requireLocalPort": true - }, - "27377": { - "label": "CodeChat Client", - "requireLocalPort": true - }, - "27378": { - "label": "CodeChat Client<->Server websocket", - "requireLocalPort": true - // This port needs to be public; however, there's no way to specify port visibility here. See `server.py` in the CodeChat Server for details. - } - }, - - // Configure tool-specific properties. "customizations": { "codespaces": { @@ -71,12 +39,10 @@ "editor.snippetSuggestions": "bottom", "files.autoSave": "afterDelay", "xml.validation.enabled": true, - "redhat.telemetry.enabled": false, - "CodeChat.CodeChatServer.Command": "CodeChat_Server" + "redhat.telemetry.enabled": false }, "extensions": [ "oscarlevin.pretext-tools", - "CodeChat.codechat", "streetsidesoftware.code-spell-checker", "alpinebuster.vscode-latex-table-editor", "mathematic.vscode-pdf" diff --git a/tests/ADDING_TESTS.md b/tests/ADDING_TESTS.md index bf256a58..644bc7eb 100644 --- a/tests/ADDING_TESTS.md +++ b/tests/ADDING_TESTS.md @@ -8,7 +8,6 @@ When you add a feature to pretext-cli, the test goes in one of these files: | A change to `pretext.project.Project` or `pretext.project.Target` | `test_project.py` | Tests the library API directly; faster than CLI, easier to inspect state | | A pure helper in `pretext.utils` | `test_utils.py` | Unit tests for string/path/version logic | | Registry/server bookkeeping in `pretext.server` | `test_server.py` | Monkeypatch `home_path` so the real `~/.ptx` is never touched | -| Source-to-output mapping in `pretext.codechat` | `test_codechat.py` | Build a tiny fixture project by hand; fake the HTML output with empty files | | Asset generation (individual_* wrappers) | `test_generate.py` | Mock the core conversion; assert the wrapper raises on missing output | ## General patterns diff --git a/tests/README.md b/tests/README.md index 1b0897ac..1bb1967c 100644 --- a/tests/README.md +++ b/tests/README.md @@ -23,8 +23,7 @@ meaningful (if smaller) run. CI runs the full suite in the | `test_generate.py` | unit (mocked) | The `individual_*` asset-generation wrappers raise when core fails to produce an output file, so failures are never cached as successes. | | `test_utils.py` | unit | Pure helpers in `pretext.utils`: project discovery, version comparison, schema-validation engine selection, resource-modification detection, misc string/path utilities. | | `test_server.py` | unit | The `~/.ptx/running_servers` registry behind `pretext view`: entry serialization, lookup, purge of dead entries. Uses a temp home dir and fake pids only. | -| `test_codechat.py` | unit | `map_path_to_xml_id`, the source-file ↔ HTML-output mapping consumed by the CodeChat System, including per-file attribution across xincludes. | -| `common.py` | — | Shared helpers: `EXAMPLES_DIR`, `check_installed`, `DEMO_MAPPING`. | +| `common.py` | — | Shared helpers: `EXAMPLES_DIR`, `check_installed`. | | `examples/projects/` | fixtures | Small projects copied into `tmp_path` by tests. `project_refactor/simple` (minimal v2 manifest), `project_refactor/elaborate` (every manifest attribute customized), `project_refactor/legacy*` (v1 manifests), plus one-feature projects (`latex-image`, `prefigure`, `graphics`, `datafile`, `interactive`, `custom-xsl`, `custom-wwserver`, `xref`, `xi_pub`). | Conventions: @@ -46,9 +45,8 @@ Conventions: `pretext new --url-template` (downloads a zip from the network). - kindle, braille, and webwork output formats (need kindlegen/liblouis or network services). -- The full demo-template build (`test_cli.py::test_build`, - `test_project.py::test_demo_html_build`) is currently skipped: a subset - build fails before a full build has generated the qrcode xml files, and - the full build is expensive. The pieces are covered separately - (subset builds, qrcode/preview generation, codechat mapping). +- The full demo-template build (`test_cli.py::test_build`) is currently + skipped: a subset build fails before a full build has generated the qrcode + xml files, and the full build is expensive. The pieces are covered + separately (subset builds, qrcode/preview generation). - `pretext view`'s browser launching and codespace-specific server path. diff --git a/tests/common.py b/tests/common.py index f4d10af7..f463254d 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1,7 +1,7 @@ """ Shared helpers for the test suite: the location of the example fixture -projects, the expected CodeChat mapping for the demo template, and a check -for the presence of external executables (xelatex, asy, sage, ...). +projects and a check for the presence of external executables (xelatex, asy, +sage, ...). """ from pathlib import Path @@ -11,34 +11,6 @@ # The example projects used as build fixtures throughout the suite. EXAMPLES_DIR = Path(__file__).parent.resolve() / "examples" -DEMO_MAPPING = { - "source/main.ptx": ["my-demo-book"], - "source/frontmatter.ptx": [ - "frontmatter", - "frontmatter-preface", - ], - "source/ch-first with spaces.ptx": ["ch-first-without-spaces"], - "source/sec-first-intro.ptx": ["sec-first-intro"], - "source/sec-first-examples.ptx": ["sec-first-examples"], - "source/ex-first.ptx": ["ex-first"], - "source/ch-empty.ptx": ["ch-empty"], - "source/ch-features.ptx": ["ch-features"], - "source/sec-features.ptx": ["sec-features-blocks"], - "source/ch-generate.ptx": [ - "ch-generate", - "sec-latex-image", - "sec-sageplot", - "sec-asymptote", - "sec-webwork", - "sec-mom", - "sec-youtube", - "sec-interactive", - "interactive-infinity", - "sec-codelens", - ], - "source/backmatter.ptx": ["backmatter"], -} - # Return True if the given binary is installed and exits with a return code of 0; otherwise, return False. This provides an easy way to check that a given binary is installed. def check_installed( diff --git a/tests/examples/projects/xref/.gitignore b/tests/examples/projects/xref/.gitignore index 4792506b..d7a8284a 100644 --- a/tests/examples/projects/xref/.gitignore +++ b/tests/examples/projects/xref/.gitignore @@ -94,6 +94,3 @@ GitHub.sublime-settings .dropbox .dropbox.attr .dropbox.cache - -# Don't track codechat config (will be generated automatically) -codechat_config.yaml diff --git a/tests/test_cli.py b/tests/test_cli.py index 36664c41..edd452bb 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -6,7 +6,7 @@ would, and asserts on exit codes and on files produced on disk. Tests of the underlying Python API (`pretext.project.Project` et al.) live in ``test_project.py``; pure-function unit tests live in ``test_utils.py``, -``test_server.py``, ``test_codechat.py``, and ``test_generate.py``. +``test_server.py`` and ``test_generate.py``. The file is organized to mirror the CLI's command surface: @@ -39,7 +39,6 @@ import pytest from pytest_console_scripts import ScriptRunner -# from .common import DEMO_MAPPING, EXAMPLES_DIR, check_installed from .common import EXAMPLES_DIR, check_installed PTX_CMD = cast(str, shutil.which("pretext")) @@ -180,7 +179,7 @@ def test_init_and_update(tmp_path: Path, script_runner: ScriptRunner) -> None: assert script_runner.run( [PTX_CMD, "-v", "debug", "update-project"], cwd=tmp_path ).success - for resource in ["requirements.txt", "codechat_config.yaml"]: + for resource in ["requirements.txt"]: resource_path = tmp_path / constants.PROJECT_RESOURCES[resource] resource_path.unlink(missing_ok=True) assert script_runner.run( @@ -205,7 +204,7 @@ def test_init_and_update_with_git(tmp_path: Path, script_runner: ScriptRunner) - [PTX_CMD, "-v", "debug", "update-project"], cwd=tmp_path ).success # Remove resources - for resource in ["requirements.txt", "codechat_config.yaml", ".gitignore"]: + for resource in ["requirements.txt", ".gitignore"]: resource_path = tmp_path / constants.PROJECT_RESOURCES[resource] resource_path.unlink(missing_ok=True) assert script_runner.run( @@ -311,12 +310,6 @@ def test_build(tmp_path: Path, script_runner: ScriptRunner) -> None: ).success web_path = project_path / "output" / "web" assert web_path.exists() - # Temporarily disable: - # mapping = json.load(open(web_path / ".mapping.json")) - # print(mapping) - # # This mapping will vary if the project structure produced by ``pretext new`` changes. Be sure to keep these in sync! - # # The path separator varies by platform. - # assert mapping == DEMO_MAPPING @pytest.mark.skipif( @@ -772,7 +765,8 @@ def test_build_webwork_and_dynamic_fillin( # 5. Validate # # `pretext validate` runs core's `validate`, which writes a consolidated report -# (jing's schema messages plus the "validation-plus" stylesheet's) into `logs/`. +# into `logs/`: jing's schema messages, a survey of the experimental constructs +# in use (not errors), and the "validation-plus" stylesheet's messages. # Exit code contract (see the validate command's docstring in pretext/cli.py): # 0 = valid, 1 = invalid or malformed, 2 = validation could not be performed. # --------------------------------------------------------------------------- @@ -817,12 +811,17 @@ def test_validate_malformed_xml_is_nonzero( @pytest.mark.skipif(not _validator_available(), reason="jing is not available") -def test_validate_dev_schema_runs(tmp_path: Path, script_runner: ScriptRunner) -> None: - """`pretext validate --dev` validates against the dev schema; a fresh - template project passes.""" +def test_validate_experimental_constructs_do_not_fail( + tmp_path: Path, script_runner: ScriptRunner +) -> None: + """Core validates against both schemas, and reports a construct that only + the production schema rejects as experimental rather than as an error, so + it does not make `pretext validate` exit non-zero.""" project = _make_project(tmp_path, script_runner) - ret = script_runner.run([PTX_CMD, "validate", "--dev"], cwd=project) + ret = script_runner.run([PTX_CMD, "validate"], cwd=project) assert ret.returncode == 0 + report = (project / "logs" / "main-validation.txt").read_text(encoding="utf-8") + assert "experimental constructs" in report def test_validate_could_not_validate_exits_2( @@ -895,17 +894,19 @@ def test_validate_engine_salve_end_to_end( @pytest.mark.skipif(not _validator_available(), reason="jing is not available") -def test_validate_terse_method_is_machine_readable( +def test_validate_terse_report_form_is_machine_readable( tmp_path: Path, script_runner: ScriptRunner ) -> None: - """`--method terse` writes core's tab-separated report: one message per - line, each naming the source file it came from.""" + """`--report-form terse` writes core's tab-separated report: one message + per line, each naming the source file it came from.""" project = _make_project(tmp_path, script_runner) main_src = project / "source" / "main.ptx" main_src.write_text( '\n
    Text outside of element.
    \n' ) - ret = script_runner.run([PTX_CMD, "validate", "--method", "terse"], cwd=project) + ret = script_runner.run( + [PTX_CMD, "validate", "--report-form", "terse"], cwd=project + ) assert ret.returncode == 1 report = (project / "logs" / "main-validation.txt").read_text() lines = [line for line in report.splitlines() if line.strip()] @@ -970,29 +971,3 @@ def test_deploy(tmp_path: Path, script_runner: ScriptRunner) -> None: "hi mom" in (custom_path / "build" / "here" / "staging" / "index.html").read_text() ) - - -# --------------------------------------------------------------------------- -# 8. Import (LaTeX conversion, experimental) -# --------------------------------------------------------------------------- - - -def test_import_latex(tmp_path: Path, script_runner: ScriptRunner) -> None: - """`pretext import FILE.tex` converts a LaTeX document to PreTeXt source - via plastex, producing main.ptx plus one file per sectioning unit.""" - (tmp_path / "sample.tex").write_text( - "\\documentclass{article}\n" - "\\title{Imported Document}\n" - "\\begin{document}\n" - "\\section{First Section}\n" - "Some text with math $x^2 + y^2 = z^2$.\n" - "\\end{document}\n" - ) - assert script_runner.run( - [PTX_CMD, "-v", "debug", "import", "sample.tex", "-o", "converted"], - cwd=tmp_path, - ).success - assert (tmp_path / "converted" / "main.ptx").exists() - # The section should have been split into its own source file. - section_files = list((tmp_path / "converted").glob("section-*.ptx")) - assert len(section_files) == 1 diff --git a/tests/test_codechat.py b/tests/test_codechat.py deleted file mode 100644 index da44a5dc..00000000 --- a/tests/test_codechat.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -Unit tests for `pretext.codechat.map_path_to_xml_id`. - -The CodeChat System uses this function to synchronize a PreTeXt source file -with the HTML file(s) built from it. The function inspects the assembled -source (following xincludes), finds every element whose ``xml:id`` matches an -HTML file in the output directory, and writes a ``.mapping.json`` file of the -form ``{source-file-relative-path: [xml-ids-in-document-order]}``. - -These tests build a tiny multi-file source tree by hand and fake the "built" -HTML output by touching empty files, so no actual `pretext build` is needed. -""" - -import json -from pathlib import Path - -from pretext import codechat - - -def _write_source(project: Path) -> Path: - """Create a small book source split across two files via xinclude. - - Returns the path to the root source file. The ``xml:id`` layout is: - - - ``main.ptx`` holds ``my-book`` and ``ch-inline`` - - ``ch-included.ptx`` holds ``ch-included`` and ``sec-included`` - """ - source = project / "source" - source.mkdir(parents=True) - (source / "main.ptx").write_text( - '\n' - '\n' - ' \n' - " Mapping test\n" - ' \n' - " Inline chapter\n" - "

    Text.

    \n" - "
    \n" - ' \n' - "
    \n" - "
    \n" - ) - (source / "ch-included.ptx").write_text( - '\n' - '\n' - " Included chapter\n" - '
    \n' - " Included section\n" - "

    More text.

    \n" - "
    \n" - "
    \n" - ) - return source / "main.ptx" - - -def _fake_build(output: Path, xml_ids: list) -> None: - """Simulate a built HTML target by touching one HTML file per xml:id.""" - output.mkdir(parents=True) - for xml_id in xml_ids: - (output / f"{xml_id}.html").touch() - - -def test_map_path_to_xml_id(tmp_path: Path) -> None: - """Each source file maps to the xml:ids (in document order) that produced - HTML output, with paths relative to the project and in posix form.""" - main = _write_source(tmp_path) - output = tmp_path / "output" - _fake_build(output, ["my-book", "ch-inline", "ch-included", "sec-included"]) - - codechat.map_path_to_xml_id(main, tmp_path, str(output)) - - mapping = json.loads((output / ".mapping.json").read_text()) - assert mapping == { - "source/main.ptx": ["my-book", "ch-inline"], - "source/ch-included.ptx": ["ch-included", "sec-included"], - } - - -def test_map_path_to_xml_id_ignores_ids_without_html(tmp_path: Path) -> None: - """xml:ids with no corresponding HTML file (e.g. ids that only produce - knowls, or sections merged into a parent page) are left out of the map.""" - main = _write_source(tmp_path) - output = tmp_path / "output" - # Only the chapters produced pages; the book and section did not. - _fake_build(output, ["ch-inline", "ch-included"]) - - codechat.map_path_to_xml_id(main, tmp_path, str(output)) - - mapping = json.loads((output / ".mapping.json").read_text()) - assert mapping == { - "source/main.ptx": ["ch-inline"], - "source/ch-included.ptx": ["ch-included"], - } diff --git a/tests/test_project.py b/tests/test_project.py index e35ff23a..6e0e72e7 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -16,8 +16,8 @@ """ import time -import json from pathlib import Path +from typing import Any import requests import shutil @@ -28,7 +28,7 @@ from pretext import utils from pretext.resources import resource_base_path -from .common import DEMO_MAPPING, EXAMPLES_DIR, check_installed +from .common import EXAMPLES_DIR, check_installed TEMPLATES_DIR = Path(__file__).parent.parent / "templates" HAS_XELATEX = check_installed(["xelatex", "--version"]) @@ -148,19 +148,14 @@ def test_manifest_simple(tmp_path: Path) -> None: def test_manifest_simple_build(tmp_path: Path) -> None: """Each target of the simple project builds into its own output - directory: html (with a CodeChat .mapping.json), runestone (with its - manifest), and pdf when xelatex is available.""" + directory: html, runestone (with its manifest), and pdf when xelatex is + available.""" prj_path = tmp_path / "simple" shutil.copytree(EXAMPLES_DIR / "projects" / "project_refactor" / "simple", prj_path) with utils.working_directory(prj_path): project = pr.Project.parse() project.get_target("web").build() assert (prj_path / "output" / "web" / "index.html").exists() - # html builds produce the source-to-output map used by CodeChat. - mapping = json.loads( - (prj_path / "output" / "web" / ".mapping.json").read_text() - ) - assert mapping == {"source/main.ptx": ["article-id"]} project.get_target("rs").build() assert (prj_path / "output" / "rs" / "index.html").exists() assert (prj_path / "output" / "rs" / "runestone-manifest.xml").exists() @@ -423,6 +418,77 @@ def _unreachable(**kwargs: object) -> None: assert project.get_target().validate_source(engine="salve") is None +def test_validate_source_counts_experimental_apart( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """Core reports the experimental constructs in use alongside the problems, + under the check "experimental". Those are not failures, so they are counted + separately from the messages that make `pretext validate` exit non-zero.""" + prj_path = tmp_path / "simple" + shutil.copytree(EXAMPLES_DIR / "projects" / "project_refactor" / "simple", prj_path) + banner = "=" * 70 + report_lines = [ + "Validation Report", + " check: a short name for the check (described in the preamble)", + banner, + 'element "p" not allowed here', + " check: schema", + "", + 'element "notation" not allowed here', + " check: experimental", + "", + "PTX:WARNING: a check no schema can express", + " check: some-plus-check-id", + "", + ] + + def _fake_validate(**kwargs: Any) -> None: + report = Path(kwargs["dest_dir"]) / "main-validation.txt" + report.write_text("\n".join(report_lines), encoding="utf-8") + + with utils.working_directory(prj_path): + project = pr.Project.parse() + monkeypatch.setattr(pr.core, "validate", _fake_validate) + result = project.get_target().validate_source() + assert result is not None + message_count, experimental_count, _ = result + # The two real messages count; the experimental construct and the + # preamble's description of the "check:" field do not. + assert (message_count, experimental_count) == (2, 1) + + +def test_validate_source_passes_report_form_to_core( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """The report form is core's, and separate from the method: it shapes the + report, while the method says where the jing runs happen. A terse report is + one tab-separated message per line, counted by its fourth field.""" + prj_path = tmp_path / "simple" + shutil.copytree(EXAMPLES_DIR / "projects" / "project_refactor" / "simple", prj_path) + handed_to_core = {} + + def _fake_validate(**kwargs: Any) -> None: + handed_to_core.update(kwargs) + report = Path(kwargs["dest_dir"]) / "main-validation.txt" + report.write_text( + "main.ptx\t/pretext/article[1]\t12\tschema\tnot allowed here\n" + "main.ptx\t/pretext/article[1]/notation[1]\t20\texperimental\tnew markup\n", + encoding="utf-8", + ) + + with utils.working_directory(prj_path): + project = pr.Project.parse() + monkeypatch.setattr(pr.core, "validate", _fake_validate) + result = project.get_target().validate_source( + method="server", report_form="terse" + ) + + assert handed_to_core["method"] == "server" + assert handed_to_core["report_form"] == "terse" + assert result is not None + assert result[:2] == (1, 1) + + def test_executables_deprecated_and_unknown() -> None: """Executables core no longer uses are accepted (older `executables.ptx` files must keep parsing) but withheld from core; genuinely unknown ones @@ -448,27 +514,6 @@ def test_html_build_permissions(tmp_path: Path) -> None: assert (prj_path / "output" / "web").stat().st_mode % 0o1000 >= 0o755 -@pytest.mark.skip(reason="Temporarily disabled") -def test_demo_html_build(tmp_path: Path) -> None: - """Full html build of the demo template in a path with spaces, checking - the CodeChat mapping of the multi-file source. Currently skipped: the - demo build requires sage/asy assets and is expensive; the mapping logic - itself is unit-tested in test_codechat.py.""" - path_with_spaces = "test path with spaces" - project_path = tmp_path / path_with_spaces - shutil.copytree(TEMPLATES_DIR / "demo", project_path) - with utils.working_directory(project_path): - p = pr.Project(ptx_version="2") - t_web = p.new_target("web", "html") - shutil.rmtree(t_web.generated_dir_abspath(), ignore_errors=True) - t_web.build() - assert t_web.output_dir_abspath().exists() - with open(t_web.output_dir_abspath() / ".mapping.json") as mpf: - mapping = json.load(mpf) - # This mapping will vary if the project structure produced by ``pretext new`` changes. Be sure to keep these in sync! - assert mapping == DEMO_MAPPING - - def test_subset_build(tmp_path: Path) -> None: """Building with an xmlid produces output only for that subtree.""" prj_path = tmp_path / "elaborate" diff --git a/uv.lock b/uv.lock index 3ad916d9..c6abe58e 100644 --- a/uv.lock +++ b/uv.lock @@ -9,15 +9,6 @@ resolution-markers = [ "python_full_version < '3.11'", ] -[[package]] -name = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, -] - [[package]] name = "annotated-types" version = "0.7.0" @@ -41,15 +32,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, ] -[[package]] -name = "backports-tarfile" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, -] - [[package]] name = "black" version = "26.5.1" @@ -103,15 +85,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, ] -[[package]] -name = "bottle" -version = "0.13.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7a/71/cca6167c06d00c81375fd668719df245864076d284f7cb46a694cbeb5454/bottle-0.13.4.tar.gz", hash = "sha256:787e78327e12b227938de02248333d788cfe45987edca735f8f88e03472c3f47", size = 98717, upload-time = "2025-06-15T10:08:59.439Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/f6/b55ec74cfe68c6584163faa311503c20b0da4c09883a41e8e00d6726c954/bottle-0.13.4-py2.py3-none-any.whl", hash = "sha256:045684fbd2764eac9cdeb824861d1551d113e8b683d8d26e296898d3dd99a12e", size = 103807, upload-time = "2025-06-15T10:08:57.691Z" }, -] - [[package]] name = "certifi" version = "2026.6.17" @@ -208,35 +181,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, ] -[[package]] -name = "cheroot" -version = "11.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jaraco-functools" }, - { name = "more-itertools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/68/e4/5c2020b60a55aca8d79ed55b62ad1cd7fc47ea44ad6b584e83f5f1bf58b0/cheroot-11.1.2.tar.gz", hash = "sha256:bfb70c49663f63b0440f2b54dbc6b0d1650e56dfe4e2641f59b2c6f727b44aca", size = 185716, upload-time = "2025-11-07T17:26:54.818Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/99/af65511a10c4212438ac52bc5e45e486e7a04d292201ad84dfd9208fe9a8/cheroot-11.1.2-py3-none-any.whl", hash = "sha256:0f6c0ba05c00fbc869fb46b1de4ec2384e1d85418ae963d3bc10ae83b688dbfa", size = 109248, upload-time = "2025-11-07T17:26:53.393Z" }, -] - -[[package]] -name = "cherrypy" -version = "18.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cheroot" }, - { name = "jaraco-collections" }, - { name = "more-itertools" }, - { name = "portend" }, - { name = "zc-lockfile" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/e8/2f7ef142d1962d08a8885c4c9942212abecad6a80ccdd1620fd1f5c993fd/cherrypy-18.10.0.tar.gz", hash = "sha256:6c70e78ee11300e8b21c0767c542ae6b102a49cac5cfd4e3e313d7bb907c5891", size = 633708, upload-time = "2024-06-14T15:25:37.192Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/61/4aba4860c91e66adbc44a62a437ad845abab21cc3dcb0b8e320000d091dd/CherryPy-18.10.0-py3-none-any.whl", hash = "sha256:129e444b9a63cea4e765481b156376f1cfe319e64caaaec2485636532373b298", size = 349804, upload-time = "2024-06-14T15:25:34.812Z" }, -] - [[package]] name = "citeproc-py" version = "0.10.1" @@ -273,43 +217,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756", size = 4273, upload-time = "2022-03-13T11:10:17.594Z" }, ] -[[package]] -name = "codechat" -version = "1.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, - { name = "lxml" }, - { name = "pygments", version = "2.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/67/71/4f422117f793620b426e7ddfc39762eda067763cee43b565470775a34d76/CodeChat-1.9.4.tar.gz", hash = "sha256:f627588d27032728c86396d227a847a9d1cc0fd8da723345bb7510c72726fa61", size = 61498, upload-time = "2023-10-07T03:26:40.183Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/80/ad4ed308106b1d15b347154ed0b2e2b2766d238796d99aa73e20c0751354/CodeChat-1.9.4-py3-none-any.whl", hash = "sha256:5251e1ca343bfb94c5526f1c503cdebbf35dc2d6990a9dd9054cffce72e4b3de", size = 81606, upload-time = "2023-10-07T03:26:38.249Z" }, -] - -[[package]] -name = "codechat-server" -version = "0.2.25" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "bottle" }, - { name = "cherrypy" }, - { name = "codechat" }, - { name = "json-five" }, - { name = "markdown" }, - { name = "psutil" }, - { name = "strictyaml" }, - { name = "thrift" }, - { name = "typer" }, - { name = "watchdog" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9c/25/805f7d31e3a956db9aa39463680e1b993fa4f328763f90b9bfd122eaee6b/codechat_server-0.2.25.tar.gz", hash = "sha256:3baa7fc0149577693bcbd965fa281ca97c3efcda35785a68025ea2f330341c57", size = 114018, upload-time = "2024-11-11T20:57:09.242Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/f0/ac6195bcb935b9d5193876903eca5416e20555de2af1e3b90c5e8fb8f184/CodeChat_Server-0.2.25-py3-none-any.whl", hash = "sha256:e76af715d4cefbdc9621f9f48fc5f71e9ce2288a40b1cff18fa0b85c289ddcd6", size = 135402, upload-time = "2024-11-11T20:57:08.01Z" }, -] - [[package]] name = "coloraide" version = "4.7.2" @@ -630,57 +537,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "jaraco-collections" -version = "5.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jaraco-text" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fa/d2/751000cf702676dbb78f97728f4d52b029e817e2b3c94088dfe5c70ff46d/jaraco_collections-5.2.1.tar.gz", hash = "sha256:dab81970bad6f0ab53b20745f1b01da37926e4c0fcd425046aa45e0d8efa18ed", size = 19729, upload-time = "2025-06-21T20:03:24.138Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/fe/570f6a7b4443a3548ab02ba88c77b64521452a2eed2c80449d13be8fd4d1/jaraco_collections-5.2.1-py3-none-any.whl", hash = "sha256:ea3415ddfc50206b6ba7d09c3deb358b76a5f8c1ddc82be788e8e8bd151ebfa8", size = 11588, upload-time = "2025-06-21T20:03:22.935Z" }, -] - -[[package]] -name = "jaraco-context" -version = "6.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, -] - -[[package]] -name = "jaraco-functools" -version = "4.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "more-itertools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", size = 20272, upload-time = "2026-05-15T21:34:10.025Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", size = 10594, upload-time = "2026-05-15T21:34:08.595Z" }, -] - -[[package]] -name = "jaraco-text" -version = "4.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jaraco-context" }, - { name = "jaraco-functools" }, - { name = "more-itertools" }, - { name = "typer-slim" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f2/20/f071dfb40f06fd0395167a40218c10adb7164635f65ebdafe45e0c714935/jaraco_text-4.2.0.tar.gz", hash = "sha256:194e386aa5b15a6616019df87a6b29c00fd3c9c8b0475731b64633ca7afd495b", size = 20077, upload-time = "2026-02-09T23:30:06.845Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/6d/628f347098059957987596123b3992120c673d17e8ce560185b1d6b88a27/jaraco_text-4.2.0-py3-none-any.whl", hash = "sha256:034408ef073f72de919124e9934a12acd50d10bd139bea47732620fa964b0144", size = 13267, upload-time = "2026-02-09T23:30:05.517Z" }, -] - [[package]] name = "jinja2" version = "3.1.6" @@ -693,19 +549,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] -[[package]] -name = "json-five" -version = "1.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "regex" }, - { name = "sly" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1a/b1/3f9e2feb61fc7d78fa6cf584477416e75ea9c9b4796a62ace787539c9a04/json_five-1.1.2.tar.gz", hash = "sha256:1c5b1bae6039bc44632d009b32338d4b59ab765c596d96577b52cc3dadc936e2", size = 26785, upload-time = "2024-06-11T21:55:32.074Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/6a/5f871b895705576faeb1992f0fb574759237ae4e92b905c3d806d84ceea9/json_five-1.1.2-py3-none-any.whl", hash = "sha256:b10608e6af9730b9e1c1a099e71f86acb905991f830957a6b25f53bd4826fe8f", size = 21444, upload-time = "2024-06-11T21:55:30.537Z" }, -] - [[package]] name = "librt" version = "0.13.0" @@ -1044,15 +887,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "more-itertools" -version = "11.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, -] - [[package]] name = "mypy" version = "1.20.2" @@ -1455,21 +1289,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/95/6b5cb3461ea5673ba0995989746db58eb18b91b54dbf331e72f569540946/pip-26.1.2-py3-none-any.whl", hash = "sha256:382ff9f685ee3bc25864f820aa50505825f10f5458ffff07e30a6d96e5715cab", size = 1813144, upload-time = "2026-05-31T17:33:56.772Z" }, ] -[[package]] -name = "plastex" -version = "3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinja2" }, - { name = "pillow" }, - { name = "typing-extensions" }, - { name = "unidecode" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/59/ce/219d3ad6ab3c821081e2045fcaf68c28a0c244c6275306b8bec5cdab6a28/plasTeX-3.1.tar.gz", hash = "sha256:6a2ee7fbca6561d3f4cbd79fe3f4918b9054757382c5422b9fda324d646ab77d", size = 625646, upload-time = "2024-01-30T20:04:37.323Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/a2/9de5ce466144b6c7ca7c7c67b936cbf3517f120e4acc78e4c099ca8ade70/plasTeX-3.1-py3-none-any.whl", hash = "sha256:b2494c43923fb58d30de0f2576e7b5d2c2f92e15538a4f5e5e1f36972a0b4871", size = 721993, upload-time = "2024-01-30T20:04:35.152Z" }, -] - [[package]] name = "platformdirs" version = "4.10.0" @@ -1507,21 +1326,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "portend" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tempora" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/57/be90f42996fc4f57d5742ef2c95f7f7bb8e9183af2cc11bff8e7df338888/portend-3.2.1.tar.gz", hash = "sha256:aa9d40ab1f9e14bdb7d401f42210df35d017c9b97991baeb18568cedfb8c6489", size = 12243, upload-time = "2025-05-29T20:27:45.091Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/11/b0b19077f80cb8972b44c96af983e8cfcdb1506090bacef137ed8b448af8/portend-3.2.1-py3-none-any.whl", hash = "sha256:bd2bb1cd8585e32f1f986c1b8eae2950c8622c648db163b711a2fc2ef8d8d492", size = 5653, upload-time = "2025-05-29T20:27:43.75Z" }, -] - [[package]] name = "prefig" -version = "0.7.2" +version = "0.7.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1536,9 +1343,9 @@ dependencies = [ { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "shapely" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/80/2e913144944de9f1a5c01636f6c7261fe5b0614643449a2025e22aa11fdf/prefig-0.7.2.tar.gz", hash = "sha256:2f282fdfecf77383b74dee9e96dbf8aaa64695713840c52959c5f801e6fe85fc", size = 149175, upload-time = "2026-08-02T13:31:09.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/3f/2c2f303c7c4fbf221616dc0b03d4caa24b8b1741cff0ae29e542dd066b15/prefig-0.7.4.tar.gz", hash = "sha256:fd23cb3ab0f6d5a2809313830f37e2c50c09d4619efa3f54f2cdd0aaefeab9cb", size = 151235, upload-time = "2026-08-16T21:24:30.27Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/ca/992c6555fe1c4ae3ff0a04339161434ce0d595d961c050379090765a1c37/prefig-0.7.2-py3-none-any.whl", hash = "sha256:5c72a38458979bd16205418056ed833386f597ee72e068428ea2855114447494", size = 175783, upload-time = "2026-08-02T13:31:07.894Z" }, + { url = "https://files.pythonhosted.org/packages/3c/46/3bfc9f4f20c903200446d97d46b329ca4f47d82f089469c80d67c1824258/prefig-0.7.4-py3-none-any.whl", hash = "sha256:839eee3ea4654f0ad3511f2f6cd3d2fec8adc61f9f1d0c9128cbb7dabe9713ec", size = 177798, upload-time = "2026-08-16T21:24:28.887Z" }, ] [package.optional-dependencies] @@ -1560,7 +1367,6 @@ dependencies = [ { name = "jinja2" }, { name = "lxml" }, { name = "pdfcropmargins" }, - { name = "plastex" }, { name = "playwright" }, { name = "psutil" }, { name = "pydantic-xml" }, @@ -1588,7 +1394,6 @@ prefigure = [ [package.dev-dependencies] dev = [ { name = "black" }, - { name = "codechat-server" }, { name = "errorhandler" }, { name = "flake8" }, { name = "lxml-stubs" }, @@ -1615,10 +1420,9 @@ requires-dist = [ { name = "pdfcropmargins", specifier = ">=1.0.9,<1.1" }, { name = "pelican", extras = ["markdown"], marker = "extra == 'all'", specifier = ">=4.10,<5" }, { name = "pelican", extras = ["markdown"], marker = "extra == 'homepage'", specifier = ">=4.10,<5" }, - { name = "plastex", specifier = ">=3,<4" }, { name = "playwright", specifier = ">=1,<2" }, - { name = "prefig", extras = ["text"], marker = "extra == 'all'", specifier = ">=0.7.2,<0.8" }, - { name = "prefig", extras = ["text"], marker = "extra == 'prefigure'", specifier = ">=0.7.2,<0.8" }, + { name = "prefig", extras = ["text"], marker = "extra == 'all'", specifier = ">=0.7.4,<0.8" }, + { name = "prefig", extras = ["text"], marker = "extra == 'prefigure'", specifier = ">=0.7.4,<0.8" }, { name = "psutil", specifier = ">=7,<8" }, { name = "pydantic-xml", specifier = "==2.14.3" }, { name = "pymupdf", specifier = ">=1.24,<2" }, @@ -1632,7 +1436,6 @@ provides-extras = ["homepage", "prefigure", "all"] [package.metadata.requires-dev] dev = [ { name = "black", specifier = ">=24.10,<27.0" }, - { name = "codechat-server", specifier = ">=0,<1" }, { name = "errorhandler", specifier = ">=2.0.1,<3" }, { name = "flake8", specifier = ">=6,<7" }, { name = "lxml-stubs", specifier = ">=0,<1" }, @@ -2056,127 +1859,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/24/79/aaf0c1c7214f2632badb2771d770b1500d3d7cbdf2590ae62e721ec50584/qrcode-7.4.2-py3-none-any.whl", hash = "sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a", size = 46197, upload-time = "2023-02-05T22:11:43.4Z" }, ] -[[package]] -name = "regex" -version = "2026.7.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/37/451aaddbf50922f34d744ad5ca919ae1fcfac112123885d9728f52a484b3/regex-2026.7.10.tar.gz", hash = "sha256:1050fedf0a8a92e843971120c2f57c3a99bea86c0dfa1d63a9fac053fe54b135", size = 416282, upload-time = "2026-07-10T19:49:46.267Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/69/62bb7d63f26698949c905cb7ebe29c7b0659e2a7f2a50c35cc29640b0852/regex-2026.7.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:799a369bdab91dcf0eb424ebd7aa9650897025ce22f729248d8f2c72002c4daa", size = 494652, upload-time = "2026-07-10T19:46:28.394Z" }, - { url = "https://files.pythonhosted.org/packages/3a/f2/eed2ce38cc38def9c366d060ec739ff5f235a33647ceb73ae6be37306d39/regex-2026.7.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f0192e5f1cfc70e3cb35347135dd02e7497b3e7d83e378aa226d8b3e53a93f19", size = 295920, upload-time = "2026-07-10T19:46:30.342Z" }, - { url = "https://files.pythonhosted.org/packages/36/57/4d724eeb1c440d71ccd6400d33b62b911bb62ca05385fe1961556e628319/regex-2026.7.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:221f2771cb780186b94bbf125a151bbeb242fa1a971da6ad59d7b0370f19de9a", size = 290696, upload-time = "2026-07-10T19:46:31.953Z" }, - { url = "https://files.pythonhosted.org/packages/c7/9d/76c6779e424c64740d2a564b7ecb389a62c77b6294127d34f52008c91ea7/regex-2026.7.10-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2fb1f7a2deb4ca3ddebbae6b93905d21480a3b4e11de28d79d9fb0d316fcf8", size = 784833, upload-time = "2026-07-10T19:46:33.145Z" }, - { url = "https://files.pythonhosted.org/packages/54/ec/f777841d88f0c9d46699daf16f86a8086e077e506603be212de2c4584f85/regex-2026.7.10-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f98ef73a13791a387d5c841416ad7f52040ae5caf10bcf46fa12bd2b3d63745", size = 852182, upload-time = "2026-07-10T19:46:34.368Z" }, - { url = "https://files.pythonhosted.org/packages/d1/de/5ba208a0826117851f6c12af9ae7fae5838ccfde69b999b26c5fdc1cedc3/regex-2026.7.10-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9a094ed44a22f9da497453137c3118b531fd783866ab524b0b0fc146e7395e1d", size = 899571, upload-time = "2026-07-10T19:46:35.564Z" }, - { url = "https://files.pythonhosted.org/packages/7f/46/602b7b81d26a53113d3cec6dd845fd664d7b854b0ea45245bfdd6b9dc9ef/regex-2026.7.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53bbbd6c610489700f7110db1d85f3623924c3f7c760f987eca033867360788a", size = 794164, upload-time = "2026-07-10T19:46:36.972Z" }, - { url = "https://files.pythonhosted.org/packages/53/cc/c21ebc520c3e17d93e495eb2de2b1c5ae5f6780ccdb298b2d8ce1e940820/regex-2026.7.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:87b776cf2890e356e4ab104b9df846e169da3eb5b0f110975547091f4e51854e", size = 786304, upload-time = "2026-07-10T19:46:38.238Z" }, - { url = "https://files.pythonhosted.org/packages/65/d8/69ec8c062bbba8d4d153f9eb70ab43564f591035b81fc4ea7eb059fdf71c/regex-2026.7.10-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ab39d2c967aae3b48a412bff9cdbe7cd7559cd1e277599aceaeada7bc82b7200", size = 769958, upload-time = "2026-07-10T19:46:39.541Z" }, - { url = "https://files.pythonhosted.org/packages/af/82/c56db326ac5f852865bd78d49a275757cc367e8114b13bc1015ed2491db1/regex-2026.7.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b56416091bfd7a429f958f69aaf6823c517be9a49cb5bf1daa3767ce8bf8095e", size = 775056, upload-time = "2026-07-10T19:46:40.808Z" }, - { url = "https://files.pythonhosted.org/packages/af/2a/1ba62462f679eb598d7325ff20798a264ddb9aa34a3f5d2ac388d54c6e4b/regex-2026.7.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:617e8f10472e34a8477931f978ff3a88d46ae2ba0e41927e580b933361f60948", size = 848857, upload-time = "2026-07-10T19:46:42.02Z" }, - { url = "https://files.pythonhosted.org/packages/84/5b/37bf2e2fe810540ca90bbfe457a2f61088721c95d442eee8bb1257165ad7/regex-2026.7.10-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:31fa17378b29519bfd0a1b8ba4e9c10cf0baf1cf4099b39b0689429e7dc2c795", size = 757747, upload-time = "2026-07-10T19:46:43.282Z" }, - { url = "https://files.pythonhosted.org/packages/9a/c5/131dd41f73f766af6b08492073b5f28bc4f907b5571230c9f9e895e88302/regex-2026.7.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5c363de7c0339d39341b6181839ed32509820b85ef506deafcf2e7e43baadab4", size = 837183, upload-time = "2026-07-10T19:46:44.91Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ee/00b9332c3c5d7460639f2c10fdc7197a64de6eaafff69478ec3332815335/regex-2026.7.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7c886a2fcbf14493ceaf9579394b33521730c161ebb8dad7db9c3e9fcab1a8", size = 782151, upload-time = "2026-07-10T19:46:46.385Z" }, - { url = "https://files.pythonhosted.org/packages/e5/a7/31ce26ec6465c12e7136ea9efcc716f5c55cac616f7958c33f0bf171781e/regex-2026.7.10-cp310-cp310-win32.whl", hash = "sha256:b04583e8867136ae66353fa274f45121ab3ec3166dc45aaff3655a5db90d9f0e", size = 266770, upload-time = "2026-07-10T19:46:47.608Z" }, - { url = "https://files.pythonhosted.org/packages/71/00/22a554bb83203eef88a40ec2fe7cf9a6e5df8765d57f7a96ebe1af5d60c3/regex-2026.7.10-cp310-cp310-win_amd64.whl", hash = "sha256:e21e888a6b471b2bb1cdd4247e8d86632672232f29be583e7eafaa5f4634d34c", size = 277941, upload-time = "2026-07-10T19:46:48.915Z" }, - { url = "https://files.pythonhosted.org/packages/76/46/596a7084918ddf18cea6fb0cc047af1f00cec8790962e8f2edee9b6ec749/regex-2026.7.10-cp310-cp310-win_arm64.whl", hash = "sha256:081acf191b4d614d573a56cab69f948b6864daa5e3cc69f209ee92e26e454c2f", size = 276923, upload-time = "2026-07-10T19:46:50.829Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/bfd13770be1acd1c05506b93fc6be15c759d6417595d1ba334d355efbf26/regex-2026.7.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:66d2c35587cd601c95965d5c0415058ba5cfd6ffbab7624ce198bd967102b341", size = 494639, upload-time = "2026-07-10T19:46:52.207Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b4/0086215709f0f705661f13ba81516287538886ef0d589c545c12b0484669/regex-2026.7.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28a0973eeffff4292f5a7ee498ab65d5e94ee8cc9cea364239251eb4a260a0f1", size = 295920, upload-time = "2026-07-10T19:46:53.63Z" }, - { url = "https://files.pythonhosted.org/packages/8e/9e/8e07d0eea46d2cf36bf4d3794634bb0a820f016d31bc349dfef008d96b02/regex-2026.7.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8331484450b3894298bef8abecce532171ff6ac60b71f999eed10f2c01941a8a", size = 290673, upload-time = "2026-07-10T19:46:54.863Z" }, - { url = "https://files.pythonhosted.org/packages/b7/56/d83c446de21c70ff49d2f1b2ff2196ac79a4ac6373d2cfe496011a250600/regex-2026.7.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0639b2488b775a0109f55a5a2172deebdedb4b6c5ab0d48c90b43cbf5de58d17", size = 792378, upload-time = "2026-07-10T19:46:56.116Z" }, - { url = "https://files.pythonhosted.org/packages/dc/0e/d265e0cc6da47aea97e90eb896be2d2e8f92d16add13bac04fa46a0fd972/regex-2026.7.10-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:be4223af640d0aa04c05db81d5d96ada3ead9c09187d892fd37f4f97829480be", size = 861790, upload-time = "2026-07-10T19:46:57.611Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a5/62655f6208d1170a3e9188d6a45d4af0a5ae3b9da8b87d474818ac5ff016/regex-2026.7.10-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d3c75d57a00109255e60bc9c623b6ececaf7905eaab845c79f036670ed4750a2", size = 906530, upload-time = "2026-07-10T19:46:59.142Z" }, - { url = "https://files.pythonhosted.org/packages/86/b7/d65aa2e9ffb18677cd0afbcf5990da8519a4e50778deb1bca49f043c5174/regex-2026.7.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:724ee9379568658ec06362cf24325c5315cc5a67f61dfe585bfeff58300a355b", size = 799912, upload-time = "2026-07-10T19:47:00.534Z" }, - { url = "https://files.pythonhosted.org/packages/8f/19/3a5ce23ea2eb1fe36306aef49c79746ce297e4b434aeb981b525c661413a/regex-2026.7.10-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:732c19e5828eb287d01edb83b2eb87f283ba8e5fc3441c732709d3e8cbd14aaa", size = 773675, upload-time = "2026-07-10T19:47:01.999Z" }, - { url = "https://files.pythonhosted.org/packages/fe/76/3c0eaa426700dd2ba14f2335f2b700a4e1484202254192ae440b83b8352a/regex-2026.7.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:982d07727c809b42a3968785354f11c3728414e4e90af0754345b431b2c32561", size = 781711, upload-time = "2026-07-10T19:47:03.425Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a8/a5a3fad84f9a7f897619f0f8e0a2c64946e9709044a186a8f869fb5c332f/regex-2026.7.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4574feca202f8c470bf678aed8b5d89df04aaf8dc677f3b83d92825051301c0f", size = 854539, upload-time = "2026-07-10T19:47:04.999Z" }, - { url = "https://files.pythonhosted.org/packages/f8/c7/47e9b8c8ee77723b9eda74f517b6b25d2f555cf276c063a9eeea35bd86d5/regex-2026.7.10-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:80151ca5bfc6c4524186b3e08b499e97319b2001fc265ed2d4fc12c0d5692cdf", size = 763378, upload-time = "2026-07-10T19:47:06.845Z" }, - { url = "https://files.pythonhosted.org/packages/36/09/e27e42d9d42edf71205c7e6f5b2902bc874ea03c557c80da03b8ed16c9bf/regex-2026.7.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bb52e10e453b5493afe1f7702a2973bc10f4dd8901c0f2ed869ffaa3f8319296", size = 844663, upload-time = "2026-07-10T19:47:08.923Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b5/2423acb98362184ad9c8eebabafa15188d6a177daab919add8f2120fc6cd/regex-2026.7.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37aba1994d73b4944053ab65a15f313bd5c28c885dd7f0d494a11749d89db6e", size = 789236, upload-time = "2026-07-10T19:47:10.303Z" }, - { url = "https://files.pythonhosted.org/packages/60/ed/b387e84c8a3d6aa115dfb56865437a3fbaf28f4a6fb3b76cc6cce38ced70/regex-2026.7.10-cp311-cp311-win32.whl", hash = "sha256:6cbedeb5112f59dbd169385459b9943310bdd241c6966c19c5f6e2295055c93a", size = 266774, upload-time = "2026-07-10T19:47:11.904Z" }, - { url = "https://files.pythonhosted.org/packages/c4/64/f30a163a65ed1f07ad12c53af00a6bd2a7251a5329fba5a08adc6f9e81a3/regex-2026.7.10-cp311-cp311-win_amd64.whl", hash = "sha256:b1963ec5ba4d52788fb0eac6aca6eb8040e8e318c7e47ebbdfc09440c802919c", size = 277959, upload-time = "2026-07-10T19:47:13.231Z" }, - { url = "https://files.pythonhosted.org/packages/2b/de/61c8174171134cebb834ca9f8fe2ff8f49d8a3dd43453b48b537d0fbb49b/regex-2026.7.10-cp311-cp311-win_arm64.whl", hash = "sha256:3750c42d47712e362158a04d0fd80131f73a55e8c715b2885442a0ff6f9fc3fc", size = 276918, upload-time = "2026-07-10T19:47:14.693Z" }, - { url = "https://files.pythonhosted.org/packages/b3/9c/2503d4ccf3452dc323f8baa3cf3ee10406037d52735c76cfced81423f183/regex-2026.7.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7252b48b0c60100095088fbeb281fca9a4fcf678a4e04b1c520c3f8613c952c4", size = 497114, upload-time = "2026-07-10T19:47:16.22Z" }, - { url = "https://files.pythonhosted.org/packages/91/eb/04534f4263a4f658cd20a511e9d6124350044f2214eb24fee2db96acf318/regex-2026.7.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:da6ef4cb8d457aab0482b50120136ae94238aaa421863eaa7d599759742c72d6", size = 297422, upload-time = "2026-07-10T19:47:17.794Z" }, - { url = "https://files.pythonhosted.org/packages/ca/2d/35809de392ab66ba439b58c3187ae3b8b53c883233f284b59961e5725c99/regex-2026.7.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe7ff456c22725c9d9017f7a2a7df2b51af6df77314176760b22e2d05278e181", size = 292110, upload-time = "2026-07-10T19:47:19.188Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1e/5ce0fbe9aab071893ce2b7df020d0f561f7b411ec334124302468d587884/regex-2026.7.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3463a5f26be513a49e4d497debcf1b252a2db7b92c77d89621aa90b83d2dd38", size = 796800, upload-time = "2026-07-10T19:47:20.639Z" }, - { url = "https://files.pythonhosted.org/packages/d4/67/c1ccbada395c10e334763b583e1039b1660b142303ebb941d4269130b22f/regex-2026.7.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:948dfc62683a6947b9b486c4598d8f6e3ecc542478b6767b87d52be68aeb55c6", size = 865509, upload-time = "2026-07-10T19:47:22.135Z" }, - { url = "https://files.pythonhosted.org/packages/0e/06/f0b31afc16c1208f945b66290eb2a9936ab8becdfb23bbcedb91cc5f9d9b/regex-2026.7.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c2cbd385d82f63bb35edb60b09b08abad3619bd0a4a492ae59e55afaf98e1b9d", size = 912395, upload-time = "2026-07-10T19:47:24.128Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1c/8687de3a6c3220f4f872a9bf4bcd8dc249f2a96e7dddfa93de8bd4d16399/regex-2026.7.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6222cafe00e072bb2b8f14142cd969637411fbc4dd3b1d73a90a3b817fa046f", size = 801308, upload-time = "2026-07-10T19:47:25.696Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e3/60a40ec02a2315d826414a125640aceb6f30450574c530c8f352110ece0e/regex-2026.7.10-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:65ee5d1ac3cd541325f5ac92625b1c1505f4d171520dd931bda7952895c5321a", size = 777120, upload-time = "2026-07-10T19:47:27.158Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9a/ec579b4f840ac59bc7c192b56e66abd4cbf385615300d59f7c94bf6863ae/regex-2026.7.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa34473fbcc108fea403074f3f45091461b18b2047d136f16ffaa4c65ad46a68", size = 785164, upload-time = "2026-07-10T19:47:28.732Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1c/60d88afd5f98d4b0fb1f8b8969270628140dc01c7ff93a939f2aa83f31a6/regex-2026.7.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d028d189d8f38d7ff292f22187c0df37f2317f554d2ed9a2908ada330af57c0", size = 860161, upload-time = "2026-07-10T19:47:30.605Z" }, - { url = "https://files.pythonhosted.org/packages/2a/40/08ae3ba45fe79e48c9a888a3389a7ee7e2d8c580d2d996da5ece02dfdcb9/regex-2026.7.10-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:396ea70e4ea1f19571940add3bad9fd3eb6a19dc610d0d01f692bc1ba0c10cb4", size = 765829, upload-time = "2026-07-10T19:47:32.06Z" }, - { url = "https://files.pythonhosted.org/packages/12/e6/e613c6755d19aca9d977cdc3418a1991ffc8f386779752dd8fdfa888ea89/regex-2026.7.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ebbf0d83ed5271991d666e54bb6c90ac2c55fb2ef3a88740c6af85dc85de2402", size = 852170, upload-time = "2026-07-10T19:47:33.567Z" }, - { url = "https://files.pythonhosted.org/packages/03/33/89072f2060e6b844b4916d5bc40ef01e973640c703025707869264ec75ab/regex-2026.7.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58a4571b2a093f6f6ee4fd281faa8ebf645abcf575f758173ea2605c7a1e1ecb", size = 789550, upload-time = "2026-07-10T19:47:35.395Z" }, - { url = "https://files.pythonhosted.org/packages/e3/3c/4bc8be9a155035e63780ccac1da101f36194946fdc3f6fce90c7179fc6df/regex-2026.7.10-cp312-cp312-win32.whl", hash = "sha256:eac1207936555aa691ce32df1432b478f2729d54e6d93a1f4db9215bcd8eb47d", size = 267151, upload-time = "2026-07-10T19:47:37.047Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/9f5aade65bb98cc6e99c336e45a49a658300720c16721f3e687f8d754fec/regex-2026.7.10-cp312-cp312-win_amd64.whl", hash = "sha256:ecae626449d00db8c08f8f1fc00047a32d6d7eb5402b3976f5c3fda2b80a7a4f", size = 277751, upload-time = "2026-07-10T19:47:38.488Z" }, - { url = "https://files.pythonhosted.org/packages/36/6f/d069dd12872ea1d50e17319d342f89e2072cae4b62f4245009a1108c74d8/regex-2026.7.10-cp312-cp312-win_arm64.whl", hash = "sha256:87794549a3f5c1c2bdfba2380c1bf87b931e375f4133d929da44f95e396bf5fe", size = 277063, upload-time = "2026-07-10T19:47:40.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/88/0c977b9f3ba9b08645516eca236388c340f56f7a87054d41a187a04e134c/regex-2026.7.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4db009b4fc533d79af3e841d6c8538730423f82ea8508e353a3713725de7901c", size = 496868, upload-time = "2026-07-10T19:47:41.675Z" }, - { url = "https://files.pythonhosted.org/packages/f6/51/600882cd5d9a3cf083fd66a4064f5b7f243ba2a7de2437d42823e286edaf/regex-2026.7.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b96341cb29a3faa5db05aff29c77d141d827414f145330e5d8846892119351c1", size = 297306, upload-time = "2026-07-10T19:47:43.521Z" }, - { url = "https://files.pythonhosted.org/packages/52/6f/48a912054ffcb756e374207bb8f4430c5c3e0ffa9627b3c7b6661844b30a/regex-2026.7.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14d27f6bd04beb01f6a25a1153d73e58c290fd45d92ba56af1bb44199fd1010d", size = 291950, upload-time = "2026-07-10T19:47:45.267Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c8/8e1c3c86ebcee7effccbd1f7fc54fe3af22aa0e9204503e2baea4a6ff001/regex-2026.7.10-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6b6a11bf898cca3ce7bfaa17b646901107f3975677fbd5097f36e5eb5641983", size = 796817, upload-time = "2026-07-10T19:47:48.054Z" }, - { url = "https://files.pythonhosted.org/packages/65/39/3e49d9ff0e0737eb8180a00569b47aabb59b84611f48392eba4d998d91a0/regex-2026.7.10-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:234f8e0d65cf1df9becadae98648f74030ee85a8f12edcb5eb0f60a22a602197", size = 865513, upload-time = "2026-07-10T19:47:49.855Z" }, - { url = "https://files.pythonhosted.org/packages/70/57/6511ad809bb3122c65bbeeffa5b750652bb03d273d29f3acb0754109b183/regex-2026.7.10-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:91b916d495db3e1b473c7c8e68733beec4dce8e487442db61764fff94f59740e", size = 912391, upload-time = "2026-07-10T19:47:51.776Z" }, - { url = "https://files.pythonhosted.org/packages/cc/29/a1b0c109c9e878cb04b931bfe4c54332d692b93c322e127b5ae9f25b0d9e/regex-2026.7.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f0d4ccf70b1d13711242de0ba78967db5c35d12ac408378c70e06295c3f6644", size = 801338, upload-time = "2026-07-10T19:47:53.38Z" }, - { url = "https://files.pythonhosted.org/packages/33/be/171c3dad4d77000e1befeff2883ca88734696dfd97b2951e5e074f32e4dd/regex-2026.7.10-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c622f4c638a725c39abcb2e680b1bd592663c83b672a4ed350a17f806d75618e", size = 777149, upload-time = "2026-07-10T19:47:54.944Z" }, - { url = "https://files.pythonhosted.org/packages/33/61/41ab0de0e4574da1071c151f67d1eb9db3d92c43e31d64d2e6863c3d89bf/regex-2026.7.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41a47c2b28d9421e2509a4583a22510dc31d83212fcf38e1508a7013140f71a8", size = 785216, upload-time = "2026-07-10T19:47:56.56Z" }, - { url = "https://files.pythonhosted.org/packages/66/28/372859ea693736f07cf7023247c7eca8f221d9c6df8697ff9f93371cca08/regex-2026.7.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:13fba679fe035037e9d5286620f88bbfd105df4d5fcd975942edd282ab986775", size = 860229, upload-time = "2026-07-10T19:47:58.278Z" }, - { url = "https://files.pythonhosted.org/packages/50/b1/e1d32cd944b599534ae655d35e8640d0ec790c0fa12e1fb29bf434d50f55/regex-2026.7.10-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8e26a075fa9945b9e44a3d02cc83d776c3b76bb1ff4b133bbfa620d5650131da", size = 765797, upload-time = "2026-07-10T19:48:00.291Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/79a2cd9556a3329351e370929743ef4f0ccc0aaff6b3dc414ae5fa4a1302/regex-2026.7.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d0834c84ae8750ae1c4cede59b0afd4d2f775be958e11b18a3eea24ed9d0d9f1", size = 852130, upload-time = "2026-07-10T19:48:01.972Z" }, - { url = "https://files.pythonhosted.org/packages/66/58/76fec29898cf5d359ab63face50f9d4f7135cc2eca3477139227b1d09952/regex-2026.7.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64722a5031aeace7f6c8d5ea9a9b22d9368af0d6e8fa532585da8158549ea963", size = 789644, upload-time = "2026-07-10T19:48:03.748Z" }, - { url = "https://files.pythonhosted.org/packages/f6/06/3c7cec7817bda293e13c8f88aed227bbcf8b37e5990936ff6442a8fdf11a/regex-2026.7.10-cp313-cp313-win32.whl", hash = "sha256:74ae61d8573ecd51b5eeee7be2218e4c56e99c14fa8fcf97cf7519611d4be92e", size = 267130, upload-time = "2026-07-10T19:48:05.677Z" }, - { url = "https://files.pythonhosted.org/packages/88/6c/e2a6f9a6a905f923cfc912298a5949737e9504b1ca24f29eda8d04d05ece/regex-2026.7.10-cp313-cp313-win_amd64.whl", hash = "sha256:5e792367e5f9b4ffb8cad93f1beaa91837056b94da98aa5c65a0db0c1b474927", size = 277722, upload-time = "2026-07-10T19:48:07.318Z" }, - { url = "https://files.pythonhosted.org/packages/00/a6/9d8935aaa940c388496aa1a0c82669cc4b5d06291c2712d595e3f0cf16d3/regex-2026.7.10-cp313-cp313-win_arm64.whl", hash = "sha256:82ab8330e7e2e416c2d42fcec67f02c242393b8681014750d4b70b3f158e1f08", size = 277059, upload-time = "2026-07-10T19:48:08.977Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e9/26decfd3e85c09e42ff7b0d23a6f51085ca4c268db15f084928ca33459c6/regex-2026.7.10-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2b93eafd92c4128bab2f93500e8912cc9ecb3d3765f6685b902c6820d0909b6b", size = 501508, upload-time = "2026-07-10T19:48:10.668Z" }, - { url = "https://files.pythonhosted.org/packages/38/a5/5b167cebde101945690219bf34361481c9f07e858a4f46d9996b80ec1490/regex-2026.7.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3f03b92fb6ec739df042e45b06423fc717ecf0063e07ffe2897f7b2d5735e1e8", size = 299705, upload-time = "2026-07-10T19:48:12.544Z" }, - { url = "https://files.pythonhosted.org/packages/f6/20/7909be4b9f449f8c282c14b6762d59aa722aeaeebe7ee4f9bb623eeaa5e0/regex-2026.7.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bb5aab464a0c5e03a97abad5bdf54517061ebbf72340d576e99ff661a42575cc", size = 294605, upload-time = "2026-07-10T19:48:14.495Z" }, - { url = "https://files.pythonhosted.org/packages/82/88/e52550185d6fda68f549b01239698697de47320fd599f5e880b1986b7673/regex-2026.7.10-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fadb07dbe36a541283ff454b1a268afd54b077d917043f2e1e5615372cb5f200", size = 811747, upload-time = "2026-07-10T19:48:16.197Z" }, - { url = "https://files.pythonhosted.org/packages/06/98/16c255c909714de1ee04da6ae30f3ee04170f300cdc0dcf57a314ee4816a/regex-2026.7.10-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:21150500b970b12202879dfd82e7fd809d8e853140fff84d08e57a90cf1e154e", size = 871203, upload-time = "2026-07-10T19:48:18.12Z" }, - { url = "https://files.pythonhosted.org/packages/3b/32/423ed27c9bae2092a453e853da2b6628a658d08bb5a6117db8d591183d85/regex-2026.7.10-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a68b637451d64ba30ed8ae125c973fa834cc2d37dfa7f154c2b479015d477ba8", size = 917334, upload-time = "2026-07-10T19:48:19.952Z" }, - { url = "https://files.pythonhosted.org/packages/73/87/74dac8efb500db31cb000fda6bae2be45fc2fbf1fa9412f445fbb8acbe37/regex-2026.7.10-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e23458d8903e33e7d27196d7a311523dc4e2f4137a5f34e4dbd30c8d37ff33e", size = 816379, upload-time = "2026-07-10T19:48:21.616Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/1859403654e3e030b288f06d49233c6a4f889d62b84c4ef3f3a28653173d/regex-2026.7.10-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae27622c094558e519abf3242cf4272db961d12c5c9a9ffb7a1b44b2627d5c6", size = 785563, upload-time = "2026-07-10T19:48:23.643Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d8/35d30d6bdf1ef6a5430e8982607b3a6db4df1ddedbe001e43435585d88ba/regex-2026.7.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ee877b6d78f9dff1da94fef51ae8cf9cce0967e043fdcc864c40b85cf293c192", size = 801415, upload-time = "2026-07-10T19:48:25.499Z" }, - { url = "https://files.pythonhosted.org/packages/f7/22/630f31f5ea4826167b2b064d9cac2093a5b3222af380aa432cfe1a5dabcd/regex-2026.7.10-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:2c66a8a1969cfd506d1e203c0005fd0fc3fe6efc83c945606566b6f9611d4851", size = 866560, upload-time = "2026-07-10T19:48:27.789Z" }, - { url = "https://files.pythonhosted.org/packages/8d/14/f5914a6d9c5bc63b9bed8c9a1169fb0be35dbe05cdc460e17d953031a366/regex-2026.7.10-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:2bc350e1c5fa250f30ab0c3e38e5cfdffcd82cb8af224df69955cab4e3003812", size = 772877, upload-time = "2026-07-10T19:48:29.563Z" }, - { url = "https://files.pythonhosted.org/packages/c1/0f/7c13999eef3e4186f7c79d4950fa56f041bf4de107682fb82c80db605ff9/regex-2026.7.10-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:53f54993b462f3f91fea0f2076b46deb6619a5f45d70dbd1f543f789d8b900ef", size = 856648, upload-time = "2026-07-10T19:48:31.282Z" }, - { url = "https://files.pythonhosted.org/packages/a4/71/a48e43909b6450fb48fa94e783bef2d9a37179258bc32ef2283955df7be7/regex-2026.7.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cfcec18f7da682c4e2d82112829ce906569cb8d69fa6c26f3a50dfbed5ceb682", size = 803520, upload-time = "2026-07-10T19:48:33.275Z" }, - { url = "https://files.pythonhosted.org/packages/e0/b8/f037d1bf2c133cb24ceb6e7d81d08417080390eddab6ddfd701aa7091874/regex-2026.7.10-cp313-cp313t-win32.whl", hash = "sha256:a2d6d30be35ddd70ce0f8ee259a4c25f24d6d689a45a5ac440f03e6bcc5a21d1", size = 269168, upload-time = "2026-07-10T19:48:35.353Z" }, - { url = "https://files.pythonhosted.org/packages/b6/9c/eaac34f8452a838956e7e89852ad049678cdc1af5d14f72d3b3b658b1ea5/regex-2026.7.10-cp313-cp313t-win_amd64.whl", hash = "sha256:c57b6ad3f7a1bdd101b2966f29dc161adf49727b1e8d3e1e89db2eda8a75c344", size = 280004, upload-time = "2026-07-10T19:48:37.106Z" }, - { url = "https://files.pythonhosted.org/packages/cd/a9/e22e997587bc1d588b0b2cd0572027d39dd3a006216e40bbf0361688c51c/regex-2026.7.10-cp313-cp313t-win_arm64.whl", hash = "sha256:3d8ef9df02c8083c7b4b855e3cb87c8e0ebbcfea088d98c7a886aaefdf88d837", size = 279308, upload-time = "2026-07-10T19:48:38.907Z" }, - { url = "https://files.pythonhosted.org/packages/6a/4a/a7fa3ada9bd2d2ce20d56dfceec6b2a51afeed9bf3d8286355ceec5f0628/regex-2026.7.10-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:39f81d1fdf594446495f2f4edd8e62d8eda0f7a802c77ac596dc8448ad4cc5ca", size = 497087, upload-time = "2026-07-10T19:48:40.543Z" }, - { url = "https://files.pythonhosted.org/packages/0f/7e/ca0b1a87192e5828dbc16f16ae6caca9b67f25bf729a3348468a5ff52755/regex-2026.7.10-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:441edc66a54063f8269d1494fc8474d06605e71e8a918f4bcfd079ebda4ce042", size = 297307, upload-time = "2026-07-10T19:48:42.213Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/fb40bb34275d3cd4d7a376d5fb2ea1f0f4a96fd884fa83c0c4ae869001bf/regex-2026.7.10-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cfeb11990f59e59a0df26c648f0adfcbf27be77241250636f5769eb08db662be", size = 292163, upload-time = "2026-07-10T19:48:43.929Z" }, - { url = "https://files.pythonhosted.org/packages/18/0b/34cbea16c8fea9a18475a7e8f5837c70af451e738bfeb4eb5b029b7dc07a/regex-2026.7.10-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:460176b2db044a292baaee6891106566739657877af89a251cded228689015a6", size = 797064, upload-time = "2026-07-10T19:48:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/87/77/f6805d97f15f5a710bdfd56a768f3468c978239daf9e1b15efd8935e1967/regex-2026.7.10-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9dc55698737aca028848bde418d6c51d74f2a5fd44872d3c8b56b626729adb89", size = 866155, upload-time = "2026-07-10T19:48:47.589Z" }, - { url = "https://files.pythonhosted.org/packages/a2/e3/a2a905807bba3bcd90d6ebbb67d27af2adf7d41708175cbc6b956a0c75f1/regex-2026.7.10-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d3e10779f60c000213a5b53f518824bd07b3dc119333b26d70c6be1c27b5c794", size = 911596, upload-time = "2026-07-10T19:48:49.473Z" }, - { url = "https://files.pythonhosted.org/packages/a2/ca/a3126888b2c6f33c7e29144fedf85f6d5a52a400024fa045ad8fc0550ef1/regex-2026.7.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:38a5926601aaccf379512746b86eb0ac1d29121f6c776dac6ac5b31077432f2c", size = 800713, upload-time = "2026-07-10T19:48:51.452Z" }, - { url = "https://files.pythonhosted.org/packages/66/19/9d252fd969f726c8b56b4bacf910811cc70495a110907b3a7ccb96cd9cad/regex-2026.7.10-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a72ecf5bfd3fc8d57927f7e3ded2487e144472f39010c3acaec3f6f3ff53f361", size = 777286, upload-time = "2026-07-10T19:48:53.443Z" }, - { url = "https://files.pythonhosted.org/packages/40/7a/5f1bf433fa446ecb3aab87bb402603dc9e171ef8052c1bb8690bb4e255a3/regex-2026.7.10-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d50714405845c1010c871098558cfe5718fe39d2a2fab5f95c8863caeb7a82b3", size = 785826, upload-time = "2026-07-10T19:48:55.381Z" }, - { url = "https://files.pythonhosted.org/packages/99/ca/69f3a7281d86f1b592338007f3e535cc219d771448e2b61c0b56e4f9d05b/regex-2026.7.10-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ec1c44cf9bd22079aac37a07cb49a29ced9050ab5bddf24e50aba298f1e34d90", size = 860957, upload-time = "2026-07-10T19:48:57.962Z" }, - { url = "https://files.pythonhosted.org/packages/bc/11/487ff55c8d515ec9dd60d7ba3c129eeaa9e527358ed9e8a054a9e9430f81/regex-2026.7.10-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:9e9aaef25a40d1f1e1bbb1d0eb0190c4a64a7a1750f7eb67b8399bed6f4fd2a6", size = 765959, upload-time = "2026-07-10T19:49:00.27Z" }, - { url = "https://files.pythonhosted.org/packages/73/e1/fa034e6fa8896a09bd0d5e19c81fdc024411ab37980950a0401dccee8f6d/regex-2026.7.10-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:e54e088dc64dd2766014e7cfe5f8bc45399400fd486816e494f93e3f0f55da06", size = 851447, upload-time = "2026-07-10T19:49:02.128Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a5/b9427ed53b0e14c540dc436d56aaf57a19fb9183c6e7abd66f4b4368fbad/regex-2026.7.10-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:834271b1ff2cfa1f67fcd65a48bf11d11e9ab837e21bf79ce554efb648599ae8", size = 789418, upload-time = "2026-07-10T19:49:03.949Z" }, - { url = "https://files.pythonhosted.org/packages/ba/52/aab92420c8aa845c7bcbe68dc65023d4a9e9ea785abf0beb2198f0de5ba1/regex-2026.7.10-cp314-cp314-win32.whl", hash = "sha256:f988a1cec68058f71a38471813fba9e87dffe855582682e8a10e40ece12567a2", size = 272538, upload-time = "2026-07-10T19:49:05.833Z" }, - { url = "https://files.pythonhosted.org/packages/99/16/5c7050e0ef7dd8889441924ff0a2c33b7f0587c0ccb0953fe7ca997d673b/regex-2026.7.10-cp314-cp314-win_amd64.whl", hash = "sha256:2129e4a5e86f26926982d883dff815056f2e98220fdf630e59f961b578a26c43", size = 280796, upload-time = "2026-07-10T19:49:07.593Z" }, - { url = "https://files.pythonhosted.org/packages/e8/1a/4f6099d2ba271502fdb97e697bae2ed0213c0d87f2273fe7d21e2e401d12/regex-2026.7.10-cp314-cp314-win_arm64.whl", hash = "sha256:9cd5b6805396157b4cf993a6940cbb8663161f29b4df2458c1c9991f099299c5", size = 281017, upload-time = "2026-07-10T19:49:09.767Z" }, - { url = "https://files.pythonhosted.org/packages/19/02/4061fc71f64703e0df61e782c2894c3fbc089d277767eff6e16099581c73/regex-2026.7.10-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:103e8f3acc3dcede88c0331c8612766bdcfc47c9250c5477f0e10e0550b9da49", size = 501467, upload-time = "2026-07-10T19:49:11.952Z" }, - { url = "https://files.pythonhosted.org/packages/73/a5/8d42b2f3fd672908a05582effd0f88438bf9bb4e8e02d69a62c723e23601/regex-2026.7.10-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:538ddb143f5ca085e372def17ef3ed9d74b50ad7fc431bd85dc50a9af1a7076f", size = 299700, upload-time = "2026-07-10T19:49:14.067Z" }, - { url = "https://files.pythonhosted.org/packages/65/70/36fa4b46f73d268c0dbe77c40e62da2cd4833ee206d3b2e438c2034e1f36/regex-2026.7.10-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e3448e86b05ce87d4eb50f9c680860830f3b32493660b39f43957d6263e2eba", size = 294590, upload-time = "2026-07-10T19:49:15.883Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a7/b6db1823f3a233c2a46f854fdc986f4fd424a84ed557b7751f2998efb266/regex-2026.7.10-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5eab9d3f981c423afd1a61db055cfe83553c3f6455949e334db04722469dd0a2", size = 811925, upload-time = "2026-07-10T19:49:17.97Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7d/f8bee4c210c42c7e8b952bb9fb7099dd7fb2f4bd0f33d0d65a8ab08aafc0/regex-2026.7.10-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:177f930af3ad72e1045f8877540e0c43a38f7d328cf05f31963d0bd5f7ecf067", size = 871257, upload-time = "2026-07-10T19:49:19.943Z" }, - { url = "https://files.pythonhosted.org/packages/5d/78/22adf72e614ba0216b996e9aaef5712c23699e360ea127bb3d5ee1a7666f/regex-2026.7.10-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dd3b6d97beb39afb412f2c79522b9e099463c31f4c49ab8347c5a2ca3531c478", size = 917551, upload-time = "2026-07-10T19:49:22.069Z" }, - { url = "https://files.pythonhosted.org/packages/03/f7/ebc15a39e81e6b58da5f913b91fc293a25c6700d353c14d5cd25fc85712a/regex-2026.7.10-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8679f0652a183d93da646fcec8da8228db0be40d1595da37e6d74c2dc8c4713c", size = 816436, upload-time = "2026-07-10T19:49:24.131Z" }, - { url = "https://files.pythonhosted.org/packages/5c/33/20bc2bdd57f7e0fcc51be37e4c4d1bca7f0b4af8dc0a148c23220e689da8/regex-2026.7.10-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:494b19a5805438aeb582de99f9d97603d8fd48e6f4cc74d0088bb292b4da3b70", size = 785935, upload-time = "2026-07-10T19:49:26.265Z" }, - { url = "https://files.pythonhosted.org/packages/b4/51/87ff99c849b56309c40214a72b54b0eef320d0516a8a516970cc8be1b725/regex-2026.7.10-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0911e34151a5429d0325dae538ba9851ec0b62426bdfd613060cda8f1c36ec7f", size = 801494, upload-time = "2026-07-10T19:49:28.493Z" }, - { url = "https://files.pythonhosted.org/packages/16/11/fde67d49083fef489b7e0f841e2e5736516795b166c9867f05956c1e494b/regex-2026.7.10-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b862572b7a5f5ed47d2ba5921e63bf8d9e3b682f859d8f11e0e5ca46f7e82173", size = 866549, upload-time = "2026-07-10T19:49:30.592Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b5/31a156c36acf10181d88f55a66c688d5454a344e53ccc03d49f4a48a2297/regex-2026.7.10-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:3f361215e000d68a4aff375106637b83c80be36091d83ee5107ad3b32bd73f48", size = 773089, upload-time = "2026-07-10T19:49:32.661Z" }, - { url = "https://files.pythonhosted.org/packages/27/bb/734e978c904726664df47ae36ce5eca5065de5141185ae46efec063476a2/regex-2026.7.10-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:4533af6099543db32ef26abc2b2f824781d4eebb309ab9296150fd1a0c7eb07d", size = 856710, upload-time = "2026-07-10T19:49:35.289Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e5/dc35cea074dbdcb9776c4b0542a3bc326ff08454af0768ef35f3fc66e7fa/regex-2026.7.10-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:668ab85105361d0200e3545bec198a1acfc6b0aeb5fff8897647a826e5a171be", size = 803621, upload-time = "2026-07-10T19:49:37.704Z" }, - { url = "https://files.pythonhosted.org/packages/a6/b2/124564af46bc0b592785610b3985315610af0a07f4cf21fa36e06c2398dd/regex-2026.7.10-cp314-cp314t-win32.whl", hash = "sha256:dd7715817a187edd7e2a2390908757f7ba42148e59cad755fb8ee1160c628eca", size = 274558, upload-time = "2026-07-10T19:49:39.926Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9c/cd813ce9f3404c0443915175c1e339c5afd8fcda04310102eaf233015eef/regex-2026.7.10-cp314-cp314t-win_amd64.whl", hash = "sha256:78712d4954234df5ca24fdadb65a2ab034213f0cdfde376c272f9fc5e09866bb", size = 283687, upload-time = "2026-07-10T19:49:41.872Z" }, - { url = "https://files.pythonhosted.org/packages/1b/d3/3dae6a6ce46144940e64425e32b8573a393a009aeaf75fa6752a35399056/regex-2026.7.10-cp314-cp314t-win_arm64.whl", hash = "sha256:749b92640e1970e881fdf22a411d74bf9d049b154f4ef7232eeb9a90dd8be7f3", size = 283377, upload-time = "2026-07-10T19:49:43.985Z" }, -] - [[package]] name = "requests" version = "2.34.2" @@ -2395,15 +2077,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/19/969dc072906c84dd0a3b05dcf57ea750936087d7873549e408b35cfc3f97/scipy-1.18.0-cp314-cp314t-win_arm64.whl", hash = "sha256:368e0a705903c466aa5f08eefb39e6b1b6b2d659e7352a31fd9e2438365be0f8", size = 25279661, upload-time = "2026-06-19T15:01:40.817Z" }, ] -[[package]] -name = "setuptools" -version = "83.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, -] - [[package]] name = "shapely" version = "2.1.2" @@ -2472,15 +2145,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/f6/f09272a71976dfc138129b8faf435d064a811ae2f708cb147dccdf7aacdb/shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9", size = 1796682, upload-time = "2025-09-24T13:51:39.233Z" }, ] -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, -] - [[package]] name = "single-version" version = "1.6.0" @@ -2499,15 +2163,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] -[[package]] -name = "sly" -version = "0.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/8a/59e943f7b27904c7756a7b565ffbd55f3841f5cd3d2da2b2b0713c49e488/sly-0.5.tar.gz", hash = "sha256:251d42015e8507158aec2164f06035df4a82b0314ce6450f457d7125e7649024", size = 66702, upload-time = "2022-10-25T14:35:30.592Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/4d/c96d807295183f2360329cd8d8bf5e8072c53d664125b3858c04153f026e/sly-0.5-py3-none-any.whl", hash = "sha256:20485483259eec7f6ba85ff4d2e96a4e50c6621902667fc2695cc8bc2a3e5133", size = 28864, upload-time = "2022-10-25T14:35:28.054Z" }, -] - [[package]] name = "smmap" version = "5.0.3" @@ -2517,40 +2172,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, ] -[[package]] -name = "strictyaml" -version = "1.7.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/08/efd28d49162ce89c2ad61a88bd80e11fb77bc9f6c145402589112d38f8af/strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407", size = 115206, upload-time = "2023-03-10T12:50:27.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/7c/a81ef5ef10978dd073a854e0fa93b5d8021d0594b639cc8f6453c3c78a1d/strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7", size = 123917, upload-time = "2023-03-10T12:50:17.242Z" }, -] - -[[package]] -name = "tempora" -version = "5.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jaraco-collections" }, - { name = "jaraco-context" }, - { name = "jaraco-functools" }, - { name = "more-itertools" }, - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5a/e8/20e489ba55092e0d737dc54a5c43424a7762d38f59efce54ed86f4fc51bc/tempora-5.9.0.tar.gz", hash = "sha256:66e6ddee320c38f4b253a7d8039337424c699916451b9271e0ccce770a4e8f62", size = 24490, upload-time = "2026-05-06T00:07:18.308Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/5e/9326e8ec4418ea59c6c290f4f3209d61f790f0737bfc5afcb588cad3fd9f/tempora-5.9.0-py3-none-any.whl", hash = "sha256:5aa96ab2b8a2be795bd4c78a4299c0196365a91976972f8852b19e1d363ccd29", size = 15394, upload-time = "2026-05-06T00:07:17.302Z" }, -] - -[[package]] -name = "thrift" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/fd/6766a2a1a2532dbcb0fa8e31fd9a22de78b7338c7a07b5e5a6ef4e8913f1/thrift-0.23.0.tar.gz", hash = "sha256:5f43448a92c36ed6a450048355d10e231a1787e4c28965f08fabac0eb978914c", size = 66440, upload-time = "2026-05-14T08:35:49.196Z" } - [[package]] name = "toml" version = "0.10.2" @@ -2614,33 +2235,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] -[[package]] -name = "typer" -version = "0.26.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-doc" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "rich" }, - { name = "shellingham" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/f7/68adc395201b20b872d68e975386832e8005ffeacedd43a1d837a32815be/typer-0.26.8.tar.gz", hash = "sha256:c244a6bd558886fe3f8780efb6bdd28bb9aff005a94eedebaa5cb32926fe2f7e", size = 202097, upload-time = "2026-06-26T09:22:45.705Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/87/b9fd69c92c6102a066e1b86a35243f53e70bd4c709f2a26d9f4fee4f4dc0/typer-0.26.8-py3-none-any.whl", hash = "sha256:3512ca79ac5c11113414b36e80281b872884477722440691c89d1112e321a49c", size = 122564, upload-time = "2026-06-26T09:22:44.72Z" }, -] - -[[package]] -name = "typer-slim" -version = "0.24.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/a7/e6aecc4b4eb59598829a3b5076a93aff291b4fdaa2ded25efc4e1f4d219c/typer_slim-0.24.0.tar.gz", hash = "sha256:f0ed36127183f52ae6ced2ecb2521789995992c521a46083bfcdbb652d22ad34", size = 4776, upload-time = "2026-02-16T22:08:51.2Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/24/5480c20380dfd18cf33d14784096dca45a24eae6102e91d49a718d3b6855/typer_slim-0.24.0-py3-none-any.whl", hash = "sha256:d5d7ee1ee2834d5020c7c616ed5e0d0f29b9a4b1dd283bdebae198ec09778d0e", size = 3394, upload-time = "2026-02-16T22:08:49.92Z" }, -] - [[package]] name = "typing-extensions" version = "4.16.0" @@ -2689,38 +2283,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] -[[package]] -name = "watchdog" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, - { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, - { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, - { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, -] - [[package]] name = "watchfiles" version = "1.2.0" @@ -2838,122 +2400,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" }, ] -[[package]] -name = "websockets" -version = "16.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/02/b9a097e1e16fee4e2fd1ec8c39f6a9c5d6257bae8fa12640caf869f54436/websockets-16.1.tar.gz", hash = "sha256:299468cbe42e2b9981134c7c51d99387d8a7bf562b00183b3eec53f882846dad", size = 182530, upload-time = "2026-07-10T06:32:57.734Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/31/cd11d2796b95c93645bac8e396b0f4bac0896a07a7b87d473bfc359f02c3/websockets-16.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de72a9c611178b15557d98eabd3101c9663c4d68938510478a6d162f99afd213", size = 179772, upload-time = "2026-07-10T06:30:22.983Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9b/34306d802f9b599eab041688a2086318037560cfae616a860234cca575b6/websockets-16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:37b0e4d726ffea3776670092d3d13e1cb605076f036a695fd1259de0d9b9fe02", size = 177457, upload-time = "2026-07-10T06:30:24.636Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/36ebbb978a7af70ff952afe5b22561264967164e9ad68b6734cae94efeb4/websockets-16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:00d50c0a27098fcb7ab47b3d99a1b1159b534dbcd959fbf05113ebc37e5f927b", size = 177737, upload-time = "2026-07-10T06:30:25.954Z" }, - { url = "https://files.pythonhosted.org/packages/17/d7/944f341d0d3c0450ffd3d171479531df1818cb1df1623af4065113999c44/websockets-16.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1acb698bff1da1782b31aebd8d7a24d7d05453964abcd7d03dbf6e25893908e8", size = 186244, upload-time = "2026-07-10T06:30:27.235Z" }, - { url = "https://files.pythonhosted.org/packages/32/e5/a9b98fc49ef0214718a9c839c6c63856a921877256ec46f371be32decfa8/websockets-16.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc2c453f3b5f99c56b16e233aad5299860558487d26adb2ed27a00c14ca24b8c", size = 187484, upload-time = "2026-07-10T06:30:28.615Z" }, - { url = "https://files.pythonhosted.org/packages/ad/7a/a575b52ca090b1976ffbe4b5f0762d03f399dfcb48eab883101331be71a9/websockets-16.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1a9f08a0728b0835f1c6abe1d9b746ab3de49b7336a0e1919cf96be1e76273eb", size = 190143, upload-time = "2026-07-10T06:30:29.91Z" }, - { url = "https://files.pythonhosted.org/packages/7c/40/705fbbd5677242fd36f724e9a94103e6bbdcb7d71e8f4498bfc1a8a7d413/websockets-16.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a089979d6173b27af18026c8d8b0077f83669a9169174482c4651e9f5739a5b6", size = 188004, upload-time = "2026-07-10T06:30:31.357Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0c/58227c8d66b1c4060c53bac8e066fb4fe2603060408e934f48660a448d72/websockets-16.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3c18dba232ec2b92a68579c9fed8ff5a18f853d1e09fc0b6ca3159e94f689fe", size = 186689, upload-time = "2026-07-10T06:30:32.712Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d0/5c1314782594aa347e0f18808ee277a61986a2a2f9f470df9893183995bd/websockets-16.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c1eb7df4170d5068892a8834fb5c07b9552353deb0dbeb0bff3820481ae4792", size = 184559, upload-time = "2026-07-10T06:30:34.127Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e6/109c6f16850fd674b7e3d0e58b8987f05d3881abaa25f42a9faf5e85f097/websockets-16.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c522bd48e625b6d557aa228967258d6d3da031c4cc21d3352fb302479aa9ba0a", size = 186997, upload-time = "2026-07-10T06:30:35.397Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ec/6afa1aebc59426438b85cf7a3868c53a89005e2250a648c99e99943b90a4/websockets-16.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d106396927a7f00b0f3a69215c3357f87bf0bca6844247121f7e8291e826a3b1", size = 185621, upload-time = "2026-07-10T06:30:36.88Z" }, - { url = "https://files.pythonhosted.org/packages/27/24/c038fe8682e9345bfa422d2cc5cc68b0491ab942c92e176bf8dfa6e8331f/websockets-16.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d71bed12909b8039955536e192867d02d76cd3797cedfd0facf822e7668636c3", size = 187384, upload-time = "2026-07-10T06:30:38.096Z" }, - { url = "https://files.pythonhosted.org/packages/30/ca/dc0ef2be39c67394e24bc982a0af59cd6249bf2f4e4272813c5c505d0da9/websockets-16.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:9c1cf6f9a936b030b5bed0e800c5ee32069338129084546baf5ff5014dc62fa9", size = 185258, upload-time = "2026-07-10T06:30:39.579Z" }, - { url = "https://files.pythonhosted.org/packages/17/6b/3ffecd83ca3404b41fbdf8e9b178e55b529cd59bf64ea08b5a37b616b568/websockets-16.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3fd3e6a7af2c8fcdcf4ffbeaf7f54a567b91a83267204187797f31faaa2a4efa", size = 186050, upload-time = "2026-07-10T06:30:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/75/26/2e068497c78f31591a610ab7ef6d8d383ecadbe98f9121e1ebda77ef6d2b/websockets-16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dddd27175bf640acae5561fa79b77e8ec71fc445816200523e5c19b6a556fb72", size = 186273, upload-time = "2026-07-10T06:30:42.309Z" }, - { url = "https://files.pythonhosted.org/packages/44/ab/4dc049cb2c9e1be3a2c6fef77118f9c5049979e99cd56a97759d2f40f980/websockets-16.1-cp310-cp310-win32.whl", hash = "sha256:cce36c80b3f2fede7942f1756d3d885fa6fa086766c8c1bcf00695ab80f0d51a", size = 180157, upload-time = "2026-07-10T06:30:43.565Z" }, - { url = "https://files.pythonhosted.org/packages/6d/4f/5e010ce5f66a8e5df380843f704ada508195a021c0c8a0f933639c9ee1c0/websockets-16.1-cp310-cp310-win_amd64.whl", hash = "sha256:115fc4695b94bb855995b23fb1abcb66099a5995575d3d5bc5605a616c58d0eb", size = 180458, upload-time = "2026-07-10T06:30:45.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/13/d47429afcc2c28616c32640009c84ea3f95660dab805766345b9682468e0/websockets-16.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9b1d7a63cba8e6b9b77e499a81eab29d31100298d090ad4507d1048c0b9cae0", size = 179770, upload-time = "2026-07-10T06:30:46.308Z" }, - { url = "https://files.pythonhosted.org/packages/6f/c7/2f0a722039a1e0107be73ed672ba604449b4956e48733e8e6b8a005aea42/websockets-16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bedbc5efeb96621aa2921d2d92608246691399418cac22acba427eb11877ea1f", size = 177455, upload-time = "2026-07-10T06:30:47.601Z" }, - { url = "https://files.pythonhosted.org/packages/43/6a/c26b0ae449e93d256ce5cdd50d5fe97b575a63e8dcd311a1faa972fd6bc6/websockets-16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd847ab82133015afe65d778e7966ab42dba16bd7ad2e5b8a7918db6539f3f94", size = 177731, upload-time = "2026-07-10T06:30:49.102Z" }, - { url = "https://files.pythonhosted.org/packages/cc/3f/381550b344a02f0d2f84cda25e79b54575291bc7022128a41163fe8ba5b0/websockets-16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2fb33ccb16ee40a95cc676d7b0ff451a9a2632f11a0dbc2e666326892b2e1de", size = 187066, upload-time = "2026-07-10T06:30:50.505Z" }, - { url = "https://files.pythonhosted.org/packages/4a/87/5ab1ec2086910f23cfb9ec0c1c29fbcc24a9d190b5198b1557c00ce4a47e/websockets-16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f15b6d9ea9c2eaf6ccab964a082b09bfa6634a495bb0c2e9e7ee6943f58976", size = 188301, upload-time = "2026-07-10T06:30:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/75/4b/bbbb8e6fac4cfc53d7aaa69a3d531bf10799354b0021f4b58914aced8c1a/websockets-16.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:638cf57c48b4ad8ac1ff1e453f4f97db2426b690ddc111e6da96b27b4a340bc3", size = 191594, upload-time = "2026-07-10T06:30:53.229Z" }, - { url = "https://files.pythonhosted.org/packages/5c/da/6c0c349443d6e999f481e3d9a0e57e7ac2956d75d6391bec24b92af3fe13/websockets-16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c1c85f61bc9d5eac57ce705d848dc2d2ce3680638300bf4e1da7d749e2cf4ce", size = 188862, upload-time = "2026-07-10T06:30:54.744Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ea/a368d37c010425a5451f42052fe804e754e23333e8448aef5d55c8a8d64f/websockets-16.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:eeab6d27f51c7e579023c971f5e6dff200deadf01faf6831beaecd32052dfaef", size = 187633, upload-time = "2026-07-10T06:30:56.055Z" }, - { url = "https://files.pythonhosted.org/packages/0d/4e/2ecd59add10d0855ec03dbdedfcdacdbd1aaabcd44b7dcbeda27538662e9/websockets-16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ed64e5a97b0b97a0b66e18bfe281317a75fbbd5afe692f939ea8d14a4292f2c", size = 185089, upload-time = "2026-07-10T06:30:57.444Z" }, - { url = "https://files.pythonhosted.org/packages/6f/eb/c6c3dcd7a01097bb0d42f4e9ef21a2c2a491d36b77cd0870ab59f9e8e77f/websockets-16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b3b021d0ed4bc16eea9775f62c9fa71acdacba0fc790b38581754dedf29ca60", size = 187790, upload-time = "2026-07-10T06:30:58.731Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3e/775d36885d5e48ab8020aaf377de0ff5fbeb8bc2682a7e46419e4a14521c/websockets-16.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6eb604a4167f0a0d53c2243dfc667a29f0b43c3436057184e070bb82a1000fa2", size = 186381, upload-time = "2026-07-10T06:31:00.355Z" }, - { url = "https://files.pythonhosted.org/packages/ad/90/6305c00812a92e47d0582604c02bd759db0118bbafc13f707d712dbcf898/websockets-16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9a3f125e44c3e34d61d111652e608e0f5b85ce08c225c8d56ad0eb822fa40030", size = 188193, upload-time = "2026-07-10T06:31:01.677Z" }, - { url = "https://files.pythonhosted.org/packages/f6/32/96bf8302c81d961585b4d34a2ddd3f229782f9b8c57bc78bbf98f1b1a4ac/websockets-16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8fdf0b00d0d1f30d1f06a92cab46fe542eec3eb302a7aee7163f142d0780f216", size = 185771, upload-time = "2026-07-10T06:31:03.062Z" }, - { url = "https://files.pythonhosted.org/packages/e8/1f/e8fe44b1d2dc417d740d9959d28fd2a846f268e7df38a686c04ac7dfe947/websockets-16.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:67b56828712f5fa7852de4c0265c28827311a657a4d275b7312ed0d1a918bee4", size = 186803, upload-time = "2026-07-10T06:31:04.34Z" }, - { url = "https://files.pythonhosted.org/packages/a5/29/b07d3a4e1eb2ab03e94e7f53f0c7a628e85fde6ad86011f7afd08f27b985/websockets-16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39c7e7730be33b8f0cd6f0aa8e8c82f9cdd1813f159765e073b2ece65f4824b5", size = 187041, upload-time = "2026-07-10T06:31:05.567Z" }, - { url = "https://files.pythonhosted.org/packages/a6/fd/e0abb8acc435642ac4a671490f6cf781c882f3fe682cdced9080ea455ab5/websockets-16.1-cp311-cp311-win32.whl", hash = "sha256:c54fe94fb2f11e11b48920c5f971e298cec73ac35db56efe57a49db63dfc95d4", size = 180158, upload-time = "2026-07-10T06:31:06.929Z" }, - { url = "https://files.pythonhosted.org/packages/81/06/85574d9458d3b913090087b817df0cc47b68e9a01dd0ab6ac04b77f49b0a/websockets-16.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9f4fb9ae8b802e55609685db98382d48fd3feb1397804e1e774968dea0f28c7", size = 180456, upload-time = "2026-07-10T06:31:08.247Z" }, - { url = "https://files.pythonhosted.org/packages/a1/52/748c014f07f4e0e170c8932de7e647a1511d5ab3049cd978797136aee577/websockets-16.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6aa3f7ad345cf3862c21f4fbf2ef5e14d911348476c2845e137c091fe3a3f0b", size = 179798, upload-time = "2026-07-10T06:31:09.664Z" }, - { url = "https://files.pythonhosted.org/packages/8b/5e/2a2e64d977d084e49d37c187c26c056daaff41965be7300cd5dbde6f8b07/websockets-16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b43fcfb521ac2f34ba80b7b8ea16303e4ad82dd8af667bf40839ad3a5d37b164", size = 177478, upload-time = "2026-07-10T06:31:11.072Z" }, - { url = "https://files.pythonhosted.org/packages/aa/12/5b85b4e75d697e548a94962ce5c036b05dd21cb9545759d555c5586422fc/websockets-16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bd3e12cd9afbe2baedae0b1eeade8ba64329b60fe2f9abdc966bd10fd2c2ef5", size = 177746, upload-time = "2026-07-10T06:31:12.386Z" }, - { url = "https://files.pythonhosted.org/packages/9d/62/79b1c8f0cee0da648b4899e1c5b0dbd3aa59846985136a54854db6827ab4/websockets-16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f41979c8623df9bd30d949d82010a8fda5c56ff12cd8508a5b7272b6d4b53a", size = 187345, upload-time = "2026-07-10T06:31:13.754Z" }, - { url = "https://files.pythonhosted.org/packages/25/34/b7c5c52c2f24280e1c017acb7ad491a566750a5cceca7f3cf999373bba21/websockets-16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24d1f35aef07d794a16c853c688e74956c50239bec37b4f2de080056046419b", size = 188581, upload-time = "2026-07-10T06:31:15.075Z" }, - { url = "https://files.pythonhosted.org/packages/bc/37/604193bebcbeffe96fdf795960b83a15d600880c64dc17ec9c31c5b3427d/websockets-16.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c64c024ddf7a35331b21fcddb562a039c275d2c82e8c2d12939e7da23997270", size = 191362, upload-time = "2026-07-10T06:31:16.395Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b4/5ee27575b367d7110d4d13945e2a9de067ec84dc71e54b87f01e38550d9a/websockets-16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e99757f5baafe20fc598e202ea6f5b0b265186ad38d0a17bd8beca16296955", size = 189216, upload-time = "2026-07-10T06:31:17.776Z" }, - { url = "https://files.pythonhosted.org/packages/7e/22/3e2dcc78d85fc5d9d814895ce6d07d0dfacc0f6aaa1d151f2b8c8d772299/websockets-16.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353f3bc6e058ac1ccab4b3588e8598837a8c04cfc8351233e6d523be675d844c", size = 187971, upload-time = "2026-07-10T06:31:19.152Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2f/cd271717b93d5ee19626cb5e38a85baab745c86e33db7c31a3ac729b31b8/websockets-16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0352f5b38b40e857b6428d468fa21dbb4dd4a567d933c26d9831b4efe1b92f43", size = 185381, upload-time = "2026-07-10T06:31:20.665Z" }, - { url = "https://files.pythonhosted.org/packages/78/91/6ad6f2f1426317b5001bd490534208c7360636b35bac1dec2e0c22bfc40e/websockets-16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70bd789afab579602968c39f21cb925466505f3edff22f0ae852bca54978a4f9", size = 188015, upload-time = "2026-07-10T06:31:22.024Z" }, - { url = "https://files.pythonhosted.org/packages/c7/6d/533733132ab4c07540efd4a8f0b9a435d3a5059b2f26cc476ace1abf7f45/websockets-16.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d0fb4b46f121eccd539353baebd1083a8767a9a351109453d1d1caecd1ba40c2", size = 186619, upload-time = "2026-07-10T06:31:23.376Z" }, - { url = "https://files.pythonhosted.org/packages/08/73/16c059f3d73b3331eba10793704afa4faa9939234fb08ef7dca35794e8f0/websockets-16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c14b6634af01541e4efe2954fd8f263386f7aa6d37c01e55dd8109fd17661452", size = 188497, upload-time = "2026-07-10T06:31:25.024Z" }, - { url = "https://files.pythonhosted.org/packages/4d/89/9a8fae7dd2acdcfb1a8844c29fe42b518a04b64fce38a0923b6290e452f1/websockets-16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a58532c49a851bcb481e58c1be23b315c17fe2fbbed509d75aeea12f543d2c15", size = 186051, upload-time = "2026-07-10T06:31:26.291Z" }, - { url = "https://files.pythonhosted.org/packages/f6/40/b240c7dd6a0e0c59c1f68377cc3015263521080c327c15f5e753c1f6d378/websockets-16.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4e969170c3b08e1d8dabd990fef1fa702c4233aeaabec33f871806e444f6a0e4", size = 187029, upload-time = "2026-07-10T06:31:27.605Z" }, - { url = "https://files.pythonhosted.org/packages/50/35/524e3fac40e47d6fdcf6c4b2c95ef1bc8a97e01593c90eff86621df7b716/websockets-16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff9b000064b88787ba9f7a3cb2af2b68a658ca5aad76458a46469e7124b678a0", size = 187308, upload-time = "2026-07-10T06:31:28.927Z" }, - { url = "https://files.pythonhosted.org/packages/00/13/56840cf62c8859af6ba22b9529da937332468c80f32b598753e8a66d3990/websockets-16.1-cp312-cp312-win32.whl", hash = "sha256:b9f5d83f80f4d7c4bba6d97f3755ac05850c784dce0fd2ab371c4e41172f53ff", size = 180161, upload-time = "2026-07-10T06:31:30.316Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ff/87eb9eb44cb62424a8d729834f2b0515a47e2669fabec29820268f4d50a1/websockets-16.1-cp312-cp312-win_amd64.whl", hash = "sha256:6852c9f653966c16109d3b6f31181fd734f7914927e3f0fa1117af7a18c9aa21", size = 180462, upload-time = "2026-07-10T06:31:31.708Z" }, - { url = "https://files.pythonhosted.org/packages/d9/63/df158b155420b566f025e75613424ad9649a24bcb0e9f259321ab3d58bea/websockets-16.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b0232ed141cec3df2af5a3959a071c51f40036336b0d37e17faf9ef52fc73e47", size = 179791, upload-time = "2026-07-10T06:31:33.108Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/00fe9414dfeafa6fe54eae9f5716c8c8e9ac59d192be3b893c096d395846/websockets-16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a71b73d143991714144e159f767b698f03c4a70b8a65ae1733b650cff488045b", size = 177472, upload-time = "2026-07-10T06:31:34.522Z" }, - { url = "https://files.pythonhosted.org/packages/8b/76/b10633424d40681b4e892ffd08ca5226322b2426e62d4ab71eae484c3a32/websockets-16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:187323204c3b2fc465e8fc2609e60437c521790cb9c1acb49c4c452a33e57f37", size = 177737, upload-time = "2026-07-10T06:31:35.964Z" }, - { url = "https://files.pythonhosted.org/packages/dc/61/d3bb03b2229bb1afd72008742d586cf1ea240dce64dd48c71c8c7fd3294c/websockets-16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dba74233c8c3ce368850818c98354dad2570f57231b3fd3bd00d7aa57628881", size = 187403, upload-time = "2026-07-10T06:31:37.496Z" }, - { url = "https://files.pythonhosted.org/packages/26/16/cc2e80478f688fc3c39c67dc1fac6a0783858058914ebc2489917462cb42/websockets-16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63339bc8c63c86a463177775cb7c677691f5bcfac7b3b2f01b286d42acd41600", size = 188639, upload-time = "2026-07-10T06:31:38.86Z" }, - { url = "https://files.pythonhosted.org/packages/15/d6/ad87b2507e57de1cbf897a56c963f2925962ed5e85fbe06aaa83ced27acd/websockets-16.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23e545ea8ae4263e37cdfd4e22a217f519e48e432728bc461185bbf585f38a83", size = 190078, upload-time = "2026-07-10T06:31:40.218Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1a/5b37b3fd335d5811f29fc829f2646a3e6d1463a4bf09c3100708684c766e/websockets-16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2237081454846fb40403a80ba86d82e2038b9c45865ab96af0abe7d002a91045", size = 189267, upload-time = "2026-07-10T06:31:41.523Z" }, - { url = "https://files.pythonhosted.org/packages/42/98/06afc33e9450d4230f94c664db78875d90f5f6a5fb77f0bc6ec15ae74e1c/websockets-16.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f5218de1ed047385ca53744caba9435d65f75d008364970a3fae95a05812cf9", size = 188022, upload-time = "2026-07-10T06:31:42.838Z" }, - { url = "https://files.pythonhosted.org/packages/8c/bf/42fef5d5887c18cf2d148b02debf56cecb9cfbffc68027cde9b12c8f432c/websockets-16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75c98e3920039d0edff03b74478ada504b7ce3a1bc406db2cabfca84320f7baf", size = 185435, upload-time = "2026-07-10T06:31:44.219Z" }, - { url = "https://files.pythonhosted.org/packages/a0/9b/8021c133add5fe40ed40312553a6cd1408c069d7efe3444ad483d4973ed3/websockets-16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1facd189d8190af30487a55b4c3688484dd50801628a3b5b2ccd26db08e67057", size = 188080, upload-time = "2026-07-10T06:31:45.986Z" }, - { url = "https://files.pythonhosted.org/packages/69/54/1e37384f395eaa127383aab15c1c45e200890a7d7b99db5c312233d193e0/websockets-16.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cc0c6a6eef613c7da32d4fb068f82ef834b58134f6a16b54e6c1e5bf9529ab3d", size = 186678, upload-time = "2026-07-10T06:31:47.449Z" }, - { url = "https://files.pythonhosted.org/packages/68/79/1caeacab5bc2081e4519288d248bc8bd2de30652e6eaa94be6be09a1fe5b/websockets-16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ad9411eded8988b879be6038206698bf7106c85a78f642c004485bcb95be17eb", size = 188554, upload-time = "2026-07-10T06:31:48.886Z" }, - { url = "https://files.pythonhosted.org/packages/ee/83/b3dca5fad71487b726e31cb0acf56f226792c1cc34e6ab18cbf146bd2d74/websockets-16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cd68f0914f3b64694895bc5e9b14e8b447e41d7bf5ffaf989bb8dcb5e2dfdce7", size = 186109, upload-time = "2026-07-10T06:31:50.508Z" }, - { url = "https://files.pythonhosted.org/packages/5b/0b/8f246c3712f07f207b52ea5fb47f3b2b66fafec7303162644c74aed51c6a/websockets-16.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fef2debfe7f7ebdda12176f26166f95b7af17af05ba06150fcf889032e0213e9", size = 187061, upload-time = "2026-07-10T06:31:51.861Z" }, - { url = "https://files.pythonhosted.org/packages/47/eb/27d6c92a01696b6495386af4fc941d7d0a13f2eab2bf9c336111d7321491/websockets-16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd6c9b798218798f4bb7b2e71c38f0e744bb94ca537b13376f88019d46384d", size = 187347, upload-time = "2026-07-10T06:31:53.246Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d5/eeee439921f55d5eaeabcea18d0f7ce32cdc39cb8fc1e185431a094c5c7b/websockets-16.1-cp313-cp313-win32.whl", hash = "sha256:84c170c6869633536921e4474b1cce7254c0c9b0053ef5725f966cee47e718e4", size = 180149, upload-time = "2026-07-10T06:31:55.058Z" }, - { url = "https://files.pythonhosted.org/packages/a3/03/971e98d4a4864cf263f9e94c5b2b7c9a9b7682d77bfbba4e732c55ee85a9/websockets-16.1-cp313-cp313-win_amd64.whl", hash = "sha256:bef52d327d70fa75dad93ee61ea2cb1d1489aca9f35c188833563f5a3b4df0a5", size = 180458, upload-time = "2026-07-10T06:31:56.767Z" }, - { url = "https://files.pythonhosted.org/packages/8d/e6/da1dc11507f8118145a81c751fe0c77e5e1c11b8554496addb39389e2dc2/websockets-16.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f881fca0a45dd6789939bd6637cd98169b92f1c3fdc78262f2cb9ec2cb1f324e", size = 179833, upload-time = "2026-07-10T06:31:58.19Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ac/c0d46f62e31e232487b2c123bc3cfd9a4e45684ca7dc0c37f0987f29baae/websockets-16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c379d5b207d3a7f0ba4c2e4602a895b0bcc63fb5f5371a4ae7fbddb03b672b", size = 177524, upload-time = "2026-07-10T06:31:59.563Z" }, - { url = "https://files.pythonhosted.org/packages/4a/33/abd966074b34a51e4f134e0aaed80f5a4a0a35163ea5ac58a1bc5a076d23/websockets-16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98ab58a4faa72b46da0127ccc1931dcbfc0985b0778892300a092185910c4cbe", size = 177743, upload-time = "2026-07-10T06:32:00.959Z" }, - { url = "https://files.pythonhosted.org/packages/ea/30/646e47b8a8dff04e227bdab512e6dde60663a647eeac7bbd6edddd92bbc5/websockets-16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e9c4e369fc181b2d41a99e01477215cecdc8546a39f7d41a59cc0a7065a0b09", size = 187474, upload-time = "2026-07-10T06:32:02.54Z" }, - { url = "https://files.pythonhosted.org/packages/d2/72/890ab9d77494af93ea65268230bfbc0a90ba789401ed7a44356a44785644/websockets-16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0704df094b2d5fa7f6f410925a594c2a5c9a09167731a76292e5410934208209", size = 188717, upload-time = "2026-07-10T06:32:04.156Z" }, - { url = "https://files.pythonhosted.org/packages/d5/aa/baedbbaa6bf9ed6029617ed5e8976535bd805f483ca9b3484e7ad9ee08bf/websockets-16.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b22b1f4950f6ab7126623329c3b47b3b90a14c05db517f2db2a026ad6c928352", size = 190090, upload-time = "2026-07-10T06:32:05.822Z" }, - { url = "https://files.pythonhosted.org/packages/52/4f/d813ec94e18002571ef4959d87a630eff6e01b72a51bcb0832b75ae8c51a/websockets-16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1ae4a686a662964a6671069f84f7f908cc3475e782227726b0c622c715962105", size = 189320, upload-time = "2026-07-10T06:32:07.223Z" }, - { url = "https://files.pythonhosted.org/packages/b8/3c/8ec52a6662f3df64090fba28cd521d405d54759268d8e820477037e8c80d/websockets-16.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:856bdd638f8277f86465057bfdd4da097c73058fb0f9d2bd5baea29e2bf2d367", size = 188068, upload-time = "2026-07-10T06:32:08.586Z" }, - { url = "https://files.pythonhosted.org/packages/96/7f/f0ae6042b14f86fa5f996c6563ea4cf107adc036ccbedc9d4f418d0095f9/websockets-16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9003a1fde1c21a322a3ca3fa0c4bda8c639da81dbc925162766086643b05ba87", size = 185493, upload-time = "2026-07-10T06:32:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/89/ad/5ffc53af9939c49fd653d147fa5b8f78ced1f6bce6c49a7446860945b0ce/websockets-16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e947b1f5fdab045174306e3916785bf3ed537648acc1549827c08c33b10953", size = 188141, upload-time = "2026-07-10T06:32:11.434Z" }, - { url = "https://files.pythonhosted.org/packages/67/62/729206c0ee577a4db8eae6dd06e0eef725a1287c6df11b2ef831d003df31/websockets-16.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5dd0e666b5931c0509cf65714686a1c5126771e663a79ac5d40da4f58b1f9502", size = 186653, upload-time = "2026-07-10T06:32:12.845Z" }, - { url = "https://files.pythonhosted.org/packages/1b/86/e8806a99ec4589914f255e6b658853fe537bf359c05e6ba5762ad9c27917/websockets-16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a0285df7925657ad65a65fb8dc330808bce082827538fd50ef45fa12d1fc5bca", size = 188614, upload-time = "2026-07-10T06:32:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/89/38/ac554e2fc6ff0b8deeff9798b92e7abd8f99e2bd9731532e7033de208220/websockets-16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:82d1c2cab3c133e9d059b3a5420bed9376bd30e21c185c63dda4ddadf6ddda47", size = 186165, upload-time = "2026-07-10T06:32:15.626Z" }, - { url = "https://files.pythonhosted.org/packages/6c/c5/4ef4d8e53342f94f3c49e1ae089b32c1e8b3878e15e0022c7708c647f351/websockets-16.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c39907f1eaf11f6277def65aa02d68f30576b693d0c1ca332aafa3caa723ac6d", size = 187119, upload-time = "2026-07-10T06:32:17.114Z" }, - { url = "https://files.pythonhosted.org/packages/3a/33/4788b1dd417bd97eeb2698af3b9df6775ac656f96e9987da0419a067602f/websockets-16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:45c5ea55446171949eb99fd34b771ceddd511ca21958d40d0197ced33159e5ee", size = 187411, upload-time = "2026-07-10T06:32:18.629Z" }, - { url = "https://files.pythonhosted.org/packages/30/38/00d37aad6dc3244ce349e2864815362e50b3cfc00cac28d216db20efe40f/websockets-16.1-cp314-cp314-win32.whl", hash = "sha256:b8ef8b1c8d6bd029a475ac432e730fba2dfd456715d26c473e2a82291024b99c", size = 179822, upload-time = "2026-07-10T06:32:20.233Z" }, - { url = "https://files.pythonhosted.org/packages/9d/37/2a8cb0eaddee5eaebda47a90a3ba0898d1ce3d866b02a4857fea17d82e5b/websockets-16.1-cp314-cp314-win_amd64.whl", hash = "sha256:7358ff21632b5d062707f73e859c824f1c3807e73d8ca25e71caca7c4cdcf145", size = 180167, upload-time = "2026-07-10T06:32:21.749Z" }, - { url = "https://files.pythonhosted.org/packages/07/5a/262ad5fcaef4198997b165060f09a63f861e76939b1786ab546ccc3f8120/websockets-16.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f38f4c3e9b359e257c339c2cc1967ccaeedb102e57c1c986bdce4bf4f32268", size = 180166, upload-time = "2026-07-10T06:32:23.278Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c7/36377db690f4292826e4501a6dec2801dc55fd1cf0405923b04937e478df/websockets-16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3c3d2cbd1602593bad49bd86fa3fbb25407d87a3b4bf8857c0ac5ac4914e1901", size = 177697, upload-time = "2026-07-10T06:32:25.164Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c7/07171abce1e39799a76f473608580fe98bd43a1230f5146159622c02bccf/websockets-16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:36069b74671e7e667f48a7484249f84c45a825a134c8b1bdc01875d0daa10d79", size = 177902, upload-time = "2026-07-10T06:32:26.564Z" }, - { url = "https://files.pythonhosted.org/packages/14/17/c831f48e250bc4749f57c00dcce73337c41cd32f6d59a64567b84e782601/websockets-16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:587f83c2ce8a5d628e166384d77fa7f0ac69b9007d515ab442123e6615aa8da3", size = 187766, upload-time = "2026-07-10T06:32:27.981Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2e/4dfe63e245b0ecfaf470cf082d25c6ce35808159135fd88c82653a6b11ab/websockets-16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6db7972d52bc1b66cefe2246902e256cbaebc9ba8a45eac09343d7eb6671b2", size = 188939, upload-time = "2026-07-10T06:32:29.365Z" }, - { url = "https://files.pythonhosted.org/packages/ba/e5/5faf65aebd9562f6b4bc473d24ce38cc56f84eb5f5bee66ed9b86733f93c/websockets-16.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e7d6014888a0632e1ed7a4095248bb3095232999447f2d83bfb1900987dd9ed9", size = 191081, upload-time = "2026-07-10T06:32:30.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/cd/2634f2f2c0556c1aae6501ed6840019cc569dd6fdbcac6494378daea4dc0/websockets-16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cb074d150e4ad2a77aa8a332c2be85f3f64f2681519d2570c1225c12c9821ff", size = 189513, upload-time = "2026-07-10T06:32:32.399Z" }, - { url = "https://files.pythonhosted.org/packages/59/bb/2c700b51196104f09715b326b1f092ed25326bdf79a03e00a4842e503743/websockets-16.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d19c9067e1fe9490f974bffbc0e443b80a7674c5efb4980c429cc00771f07c5a", size = 188240, upload-time = "2026-07-10T06:32:33.897Z" }, - { url = "https://files.pythonhosted.org/packages/f1/20/86283636e499a1a357fa9441f690ba34f255e731f2fea174132b3b762b57/websockets-16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d440ff0c6c7469ad59c0a412c383c235935b43635e89425e3f6a0c36de90c31b", size = 185955, upload-time = "2026-07-10T06:32:35.279Z" }, - { url = "https://files.pythonhosted.org/packages/91/23/d7fb734b0095d43bc7f1c9f68afd50adb4176e7e513403e8c70ad7daa4fa/websockets-16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8613129a2533f08de24505e69a3e403cedaadae49abdb043c4d170ca71b7e4bd", size = 188491, upload-time = "2026-07-10T06:32:36.673Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5e/168a192689db468405ecf3b8e4a2c18811936b0724d017ad7e6d252734f0/websockets-16.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a5bf9c23f197b4ec88290fd5463f33db67362a1bb10f85fc2e8e7627f0ddab97", size = 186983, upload-time = "2026-07-10T06:32:38.207Z" }, - { url = "https://files.pythonhosted.org/packages/7e/9b/66795fa91ebe49019ebe4fa910282172252e37046b80e08fc52e0c365150/websockets-16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:520b0fd0395f075febb283c76755af724ab9fd19dffa4f3bfd18cb4e622790a3", size = 188890, upload-time = "2026-07-10T06:32:39.545Z" }, - { url = "https://files.pythonhosted.org/packages/5a/32/126bbc844be5afb3613fd43211dac10a9645f4cf39741d04acaa2ec7030c/websockets-16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7143aa09a67e1c013be44e81a88dfe90fc6244198ab86c7edd064152cf619805", size = 186583, upload-time = "2026-07-10T06:32:41.038Z" }, - { url = "https://files.pythonhosted.org/packages/22/b9/0b5db9cbcf6e4970db4496893244a8d92e07f71a8ef27cf34b08aa02fef1/websockets-16.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:7acb811fad08e611755800d1560e395c67e11a6bd563598ea6abb319afb86938", size = 187353, upload-time = "2026-07-10T06:32:42.501Z" }, - { url = "https://files.pythonhosted.org/packages/99/2e/254b2131a10d831b76e2c18dfe7add9729c6292c674a8085bf8de01ad151/websockets-16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c5cf88e3faa2f7931bc6baeee7599c97656a3f6ac7f831f4fccba233e141783a", size = 187784, upload-time = "2026-07-10T06:32:43.929Z" }, - { url = "https://files.pythonhosted.org/packages/21/dc/e7288aa8e3ac5a88a0924619984d663c1abf2a87d0ea98290c66fdaee0ec/websockets-16.1-cp314-cp314t-win32.whl", hash = "sha256:589f8842521c8307684ce0b40ce4ad70c5e0aa46484c6f1225a94ef4b8970341", size = 179947, upload-time = "2026-07-10T06:32:45.495Z" }, - { url = "https://files.pythonhosted.org/packages/d3/de/37edf1260ff0fbbd2f82433489c4cfbe799ac2ff21355331609879329fe6/websockets-16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c0e0857c30bbbc2bb5c30687508f0b7ec19aa026cd9f2ff8424d0fee42dcc07", size = 180291, upload-time = "2026-07-10T06:32:47.119Z" }, - { url = "https://files.pythonhosted.org/packages/4d/f4/84ef884775bbe77c46cce79bc7d705ea3bc6574cc00acf81af89754c077d/websockets-16.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7289d899c79e763e6221c8dcb8959361cb43274418538d7c7ad16a43b01d12f9", size = 177387, upload-time = "2026-07-10T06:32:48.574Z" }, - { url = "https://files.pythonhosted.org/packages/d3/d9/6831ec6f65e1eeac770375f4f4b604f23df9bafaa1b47004bc5f9488d513/websockets-16.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e22e9e3719f5131bd62da4db63c8da63eb8c91cc99e16c1cbd122f130e1ae07a", size = 177663, upload-time = "2026-07-10T06:32:50.043Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d4/21d4922fa7fe855813a8b38f181a0ecf02a586e16c1f095fd05471f78cc2/websockets-16.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:83bdabafef431247e6b11a9aab8a0893fd8e82e1ed95b32e0373625b03ffce4a", size = 178501, upload-time = "2026-07-10T06:32:51.439Z" }, - { url = "https://files.pythonhosted.org/packages/91/87/7a0320df854dacd09507ca972cb04a4dc5aae279583cc5b80ad5f5819533/websockets-16.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b8d13ceabc5c60995f201b5211d76876e17e68706ebf5d3bc666b32eefff1a6", size = 179397, upload-time = "2026-07-10T06:32:52.892Z" }, - { url = "https://files.pythonhosted.org/packages/31/6a/0da1eb8c8da2ace7b578c8523d32618af85e62a9ebad56051d4a14a38a1c/websockets-16.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81495f9c0085361c582efbc3207fb877174cfe03370f17d9cd70624404aa526f", size = 180546, upload-time = "2026-07-10T06:32:54.619Z" }, - { url = "https://files.pythonhosted.org/packages/66/58/bd83247f39ddc26ffc2c24eb05087a3b749e00cb4509fc6d19daa23c8495/websockets-16.1-py3-none-any.whl", hash = "sha256:c5149dfe490ec7e5ee5dbf624c642fb725f93a5575c7f00ab594ca9eddb8dd81", size = 174031, upload-time = "2026-07-10T06:32:56.079Z" }, -] - [[package]] name = "wheel" version = "0.47.0" @@ -2965,15 +2411,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c4 wheels = [ { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, ] - -[[package]] -name = "zc-lockfile" -version = "4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/9a/2fef89272d98b799e4daa50201c5582ec76bdd4e92a1a7e3deb74c52b7fa/zc_lockfile-4.0.tar.gz", hash = "sha256:d3ab0f53974296a806db3219b9191ba0e6d5cbbd1daa2e0d17208cb9b29d2102", size = 10956, upload-time = "2025-09-18T07:32:34.412Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/7f/3a614b65bc4b181578b1d50a78663ee02d5d2d3b859712f3d3597c8afe6f/zc_lockfile-4.0-py3-none-any.whl", hash = "sha256:aa3aa295257bebaa09ea9ad5cb288bf9f98f88de6932f96b6659f62715d83581", size = 9143, upload-time = "2025-09-18T07:32:33.517Z" }, -]