diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2afc445..4decdb6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: -vv \ --tb=short \ --durations=5 \ - --cov=src/splitme_ai \ + --cov=src/splitme \ --cov-branch \ --cov-fail-under=0 \ --cov-report=term-missing:skip-covered \ @@ -153,7 +153,7 @@ jobs: if: success() && startsWith(github.ref, 'refs/tags/v') environment: name: pypi - url: https://pypi.org/p/splitme-ai + url: https://pypi.org/p/splitme permissions: id-token: write diff --git a/.gitignore b/.gitignore index 8bbcac3..edfd8b7 100644 --- a/.gitignore +++ b/.gitignore @@ -31,13 +31,14 @@ ENV/ .mypy_cache/ .pytest_cache/ .ruff_cache/ -.splitme-ai/ .reports/ notebooks/ site/ +.continuerules -# wip +# Splitme +.splitme/ +docs/*.md +docs/features/ docs/integrations/ -docs/notes.md -docs/roadmap.md -tests/data/readme-ai.html +src/splitme/ai/ diff --git a/LICENSE b/LICENSE index dddc018..2cf9fa2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Eli Salamie +Copyright (c) 2024 to present Splitme and individual contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile index 79b9578..bdd6567 100644 --- a/Makefile +++ b/Makefile @@ -5,13 +5,15 @@ SHELL := /bin/bash MAKEFLAGS += --warn-undefined-variables MAKEFLAGS += --no-builtin-rules +PYPROJECT_TOML := pyproject.toml +PYPI_VERSION := 0.1.11 PYTHON_VERSION := 3.11 -PYPROJECT := pyproject.toml -TARGET := splitme_ai tests +TARGET := splitme tests TARGET_TEST := tests -# -- Clean Up ------------------------------------------------------------------ +# -- Clean --------------------------- + .PHONY: clean clean: ## Clean build and virtual environment directories @@ -21,17 +23,18 @@ clean: ## Clean build and virtual environment directories -find . -name "*.pyc" -type f -exec rm -f {} + -# -- Dependencies ------------------------------------------------------------ +# -- Dev --------------------------- + .PHONY: build-hatch build-hatch: ## Build the distribution package using hatch hatch build - pip show splitme-ai + pip show splitme .PHONY: build build: ## Build the distribution package using uv uv build - uv pip install dist/splitme_ai-0.1.0-py3-none-any.whl + uv pip install dist/splitme-$(PYPI_VERSION)-py3-none-any.whl .PHONY: install install: ## Install all dependencies from pyproject.toml @@ -39,12 +42,12 @@ install: ## Install all dependencies from pyproject.toml .PHONY: lock lock: ## Lock dependencies declared in pyproject.toml - uv pip compile pyproject.toml --all-extras + uv pip compile $(PYPROJECT_TOML) --all-extras .PHONY: requirements requirements: ## Generate requirements files from pyproject.toml - uv pip compile pyproject.toml -o requirements.txtiu - uv pip compile pyproject.toml --all-extras -o requirements-dev.txt + uv pip compile $(PYPROJECT_TOML) -o requirements.txtiu + uv pip compile $(PYPROJECT_TOML) --all-extras -o requirements-dev.txt .PHONY: sync sync: ## Sync environment with pyproject.toml @@ -59,16 +62,15 @@ venv: ## Create a virtual environment uv venv --python $(PYTHON_VERSION) -# -- Documentation -------------------------------------------------------------- +# -- Docs --------------------------- .PHONY: docs docs: ## Build documentation site using mkdocs - cd docs && \ uv run mkdocs build --clean uv run mkdocs serve -# -- Linting --------------------------------------------------------------- +# -- Lint --------------------------- .PHONY: format-toml format-toml: ## Format TOML files using pyproject-fmt @@ -96,26 +98,28 @@ typecheck-pyright: ## Type-check Python files using Pyright uv run pyright $(TARGET) -# -- Testing ------------------------------------------------------------------- +# -- Tests ---------------------------- + .PHONY: test test: ## Run test suite using Pytest - poetry run pytest $(TARGET_TEST) --config-file $(PYPROJECT) + uv run pytest $(TARGET_TEST) --config-file $(PYPROJECT_TOML) + +# -- Utils --------------------------- -# -- Utilities ------------------------------------------------------------------ .PHONY: run-pypi run-pypi: - uvx --isolated splitme-ai --split.i tests/data/readme-ai.md --split.settings.o .splitme-ai/pypi-h2/ --split.settings.hl "##" - uvx --isolated splitme-ai --split.i tests/data/readme-ai.md --split.settings.o .splitme-ai/pypi-h3/ --split.settings.hl "###" - uvx --isolated splitme-ai --split.i tests/data/readme-ai.md --split.settings.o .splitme-ai/pypi-h4/ --split.settings.hl "####" + uvx --isolated splitme --split.i tests/data/markdown/readme-ai.md --split.o .splitme/pypi-h2/ --split.level "##" + uvx --isolated splitme --split.i tests/data/markdown/readme-ai.md --split.o .splitme/pypi-h3/ --split.level "###" + uvx --isolated splitme --split.i tests/data/markdown/readme-ai.md --split.o .splitme/pypi-h4/ --split.level "####" .PHONY: run-splitter run-splitter: ## Run the main application - uv run splitme-ai --split.i tests/data/readme-ai.md --s.settings.o .splitme-ai/test-docs-h2/ --s.settings.hl "##" --s.settings.mkdocs - uv run splitme-ai --split.i tests/data/readme-ai.md --s.settings.o .splitme-ai/test-docs-h3/ --s.settings.hl "###" - uv run splitme-ai --split.i tests/data/readme-ai.md --s.settings.o .splitme-ai/test-docs-h4/ --s.settings.hl "####" + uv run splitme --split.i tests/data/markdown/readme-ai.md --split.o docs/examples/split-sections-h2 --split.level "##" --mkdocs.dir docs/examples/split-sections-h2 + uv run splitme --split.i tests/data/markdown/readme-ai.md --split.o docs/examples/split-sections-h3/ --split.level "###" + uv run splitme --split.i tests/data/markdown/readme-ai.md --split.o docs/examples/split-sections-h4/ --split.level "####" .PHONY: help help: ## Display this help diff --git a/README.md b/README.md index 21c94fc..f4c5c81 100644 --- a/README.md +++ b/README.md @@ -2,61 +2,57 @@ - - - SplitMe-AI Logo + + + splitme Logo

- Break down your docs. Build up your knowledge. + Powerful markdown tools for modern documentation

- A Markdown text splitter for modular docs and maximum flexibility. + Build, manage, and scale your documentation workflows.

- - GitHub Actions + + GitHub Actions - - Coverage + + Coverage - - PyPI Version + + PyPI Version - - Python Version + + Python Version - MIT License + MIT License

- separator + separator
+ -## What is SplitmeAI? +## What is Splitme? -SplitmeAI is a Python module that addresses challenges in managing large Markdown files, particularly when creating and maintaining structured static documentation sites such as [Mkdocs][mkdocs]. +Splitme is a comprehensive Python toolkit designed to streamline your Markdown workflow. Whether you're managing documentation, writing technical content, or maintaining a knowledge base, Splitme provides essential utilities to make working with Markdown files easier and more efficient. -__Key Features:__ +__Core Features:__ -- **Section Splitting:** Breaks down large Markdown files into smaller, manageable sections based on specified heading levels. -- **Hierarchy Preservation:** Maintains parent heading context within each split file. -- **Filename Sanitization:** Generates clean, unique filenames for each section, ensuring compatibility and readability. -- **Reference Link Management:** Extracts and appends reference-style links used within each section. -- **Reference Link Conversion:** Convert all inline links to reference-style links for improved readability and maintainability. -- **Link Validation:** Checks and validates all links within a Markdown file for accuracy and integrity. -- **Thematic Break Handling:** Recognizes and handles line breaks (`---`, `***`, `___`) for intelligent content segmentation. -- **MkDocs Integration:** Automatically generates an `mkdocs.yml` configuration file based on the split sections. -- **CLI Support:** Provides a user-friendly Command-Line Interface for seamless operation. +- **Text Splitting:** Break down large Markdown files into manageable sections based on headings or custom rules. +- **Link Management:** Convert between inline and reference-style links, validate URLs, and identify broken links. +- **Content Analysis:** Analyze document structure, extract metadata, and ensure consistent formatting. +- **Documentation Tools:** Generate configurations for static site generators like [MkDocs][mkdocs] and maintain organized documentation. --- @@ -64,14 +60,14 @@ __Key Features:__ ### Installation -Install from [PyPI][pypi] using your preferred package manager listed below. +Install from [PyPI][pypi] using your preferred package manager. ####  pip Use [pip][pip] (recommended for most users): ```sh -pip install -U splitme-ai +pip install -U splitme ``` ####  pipx @@ -79,7 +75,7 @@ pip install -U splitme-ai Install in an isolated environment with [pipx][pipx]: ```sh -❯ pipx install splitme-ai +❯ pipx install splitme ``` ####  uv @@ -87,90 +83,74 @@ Install in an isolated environment with [pipx][pipx]: For the fastest installation use [uv][uv]: ```sh -❯ uv tool install splitme-ai +❯ uv tool install splitme ``` -### Usage +### Using the CLI -#### Using the CLI +#### Text Splitting -Let's take a look at some examples of how to use the `splitme-ai` CLI. - -##### Splitting a Markdown File - -__Example 1:__ Split a Markdown file on heading level 2 (default setting): +Split large Markdown files into smaller, organized sections: ```sh -splitme-ai \ - --split.i docs/examples/data/README-AI.md \ - --split.settings.o docs/examples/output-h2 +splitme \ + --split.i tests/data/markdown/readme-ai.md \ + --split.o docs/examples/split-sections-h2 ``` -__Example 2:__ Split on heading level 2 and generate an [mkdocs.yml] configuration file: - -```sh -splitme-ai \ - --split.i docs/examples/data/README-AI.md \ - --split.settings.o docs/examples/output-h2 \ - --split.settings.mkdocs -``` +#### Link Validation -__Example 3:__ Split on heading level 3: +Check for broken links in your documentation: ```sh -splitme-ai \ - --split.i docs/examples/data/README-AI.md \ - --split.settings.o docs/examples/output-h3 \ - --split.settings.hl "###" +splitme --check-links.input tests/data/markdown/pydantic.md ``` -__Example 4:__ Split on heading level 4: +You will see a summary of the broken links in your terminal: -```sh -splitme-ai \ - --split.i docs/examples/data/README-AI.md \ - --split.settings.o docs/examples/output-h4 \ - --split.settings.hl "####" +```console + +Markdown Link Check Results + +┏━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓ +┃ Status ┃ Line ┃ Link ┃ Error ┃ +┡━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩ +│ ✓ │ 2 │ https://img.shields.io/github/actions/workflow/status/pydantic/pydantic/ci.yml?b… │ │ +│ ✓ │ 3 │ https://coverage-badge.samuelcolvin.workers.dev/pydantic/pydantic.svg │ │ +│ ✓ │ 4 │ https://img.shields.io/pypi/v/pydantic.svg │ │ +│ ✓ │ 5 │ https://img.shields.io/conda/v/conda-forge/pydantic.svg │ │ +│ ✓ │ 6 │ https://static.pepy.tech/badge/pydantic/month │ │ +│ ✓ │ 7 │ https://img.shields.io/pypi/pyversions/pydantic.svg │ │ +│ ✓ │ 8 │ https://img.shields.io/github/license/pydantic/pydantic.svg │ │ +│ ✓ │ 9 │ https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/p… │ │ +│ ✓ │ 18 │ https://pydantic.dev/articles/logfire-announcement │ │ +│ ✓ │ 24 │ https://docs.pydantic.dev/ │ │ +│ ✓ │ 24 │ https://github.com/pydantic/pydantic/tree/1.10.X-fixes │ │ +│ ✓ │ 28 │ https://docs.pydantic.dev/ │ │ +│ 𝗫 │ 34 │ https://docs.pydantic.dev/install/invalid-link │ HTTP 404 │ +└────────┴──────┴───────────────────────────────────────────────────────────────────────────────────┴──────────┘ + +Summary: 1 broken links out of 13 total links. ``` -##### Converting Reference Links +#### Reference Link Conversion -__Example 5:__ Convert inline links to reference-style links: +Convert inline links to reference-style for better maintainability: ```sh -splitme-ai --reflinks.i tests/data/pydantic.md --reflinks.o with_reflinks.md +splitme --reflinks.input tests/data/markdown/pydantic.md --reflinks.output with_refs.md ``` -##### Validating Links +#### Static Site Documentation Generation -__Example 6:__ Validate all links in a Markdown file: +Generate a MkDocs configuration [mkdocs.yml] file from a Markdown document: ```sh -splitme-ai --validate-links.i tests/data/pydantic.md -``` - -The output will display the results of whether the links are valid or broken. - -```console -Scanning markdown file tests/data/pydantic.md for broken links... - -Markdown Link Check Results: --------------------------------------------------------------------------------- -✓ Line 2: [![CI](https://img.shields.io/github/actions/workflow/status/pydantic/pydantic/ci.yml?branch=main&logo=github&label=CI) -✓ Line 3: [![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/pydantic.svg) -✓ Line 4: [![pypi](https://img.shields.io/pypi/v/pydantic.svg) -✓ Line 5: [![CondaForge](https://img.shields.io/conda/v/conda-forge/pydantic.svg) -✓ Line 6: [![downloads](https://static.pepy.tech/badge/pydantic/month) -✓ Line 7: [![versions](https://img.shields.io/pypi/pyversions/pydantic.svg) -✓ Line 8: [![license](https://img.shields.io/github/license/pydantic/pydantic.svg) -✓ Line 9: [![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json) -✓ Line 18: [Learn more](https://pydantic.dev/articles/logfire-announcement) -✓ Line 24: [pydantic V1.10 Documentation](https://docs.pydantic.dev/) -✓ Line 24: [`1.10.X-fixes` git branch](https://github.com/pydantic/pydantic/tree/1.10.X-fixes) -✓ Line 28: [documentation](https://docs.pydantic.dev/) -✓ Line 34: [Install](https://docs.pydantic.dev/install/) - -Summary: 0 broken links out of 13 total links. +splitme \ + --split.i tests/data/markdown/readme-ai.md \ + --split.o docs/examples/split-sections-h2 \ + --mkdocs.dir docs/examples/split-sections-h2 \ + --mkdocs.site-name "MyDocs" ``` View the output of all examples above [here][examples]. @@ -180,47 +160,139 @@ View the output of all examples above [here][examples]. --- + + ## Roadmap -- [X] Implement reference link conversion and management. -- [ ] Enhance CLI usability and user experience. -- [ ] Integrate AI-powered content analysis and segmentation. -- [ ] Add robust chunking and splitting algorithms for LLM applications. -- [ ] Add support for additional static site generators. -- [ ] Add support for additional input and output formats. +- [ ] Support for additional documentation formats (e.g., reStructuredText, HTML) +- [ ] Add more intuitive CLI commands and options. +- [ ] Integration with more static site generators +- [ ] Plugin system for custom utilities +- [ ] Enhanced content analysis features --- ## Contributing -Contributions are welcome! For bug reports, feature requests, or questions, please [open an issue][github-issues] or submit a [pull request][github-pulls] on GitHub. +Contributions are welcome! Whether it's bug reports, feature requests, or code contributions, please feel free to: + +1. Open an [issue][github-issues] +2. Submit a [pull request][github-pulls] +3. Improve documentation +4. Share your ideas --- ## License -Copyright © 2024-2025 [splitme-ai][splitme-ai].
+ + +Splitme is released under the [MIT license][mit-license] +Copyright © 2024-2025 [Splitme][splitme]
- Return to Top + Return to Top
- separator + separator
+ -[pypi]: https://pypi.org/project/splitme-ai/ -[splitme-ai]: https://github.com/eli64s/splitme-ai -[github-issues]: https://github.com/eli64s/splitme-ai/issues -[github-pulls]: https://github.com/eli64s/splitme-ai/pulls -[mit-license]: https://github.com/eli64s/splitme-ai/blob/main/LICENSE -[examples]: https://github.com/eli64s/splitme-ai/tree/main/docs/examples +[pypi]: https://pypi.org/project/splitme/ +[splitme]: https://github.com/eli64s/splitme +[github-issues]: https://github.com/eli64s/splitme/issues +[github-pulls]: https://github.com/eli64s/splitme/pulls +[mit-license]: https://github.com/eli64s/splitme/blob/main/LICENSE +[examples]: https://github.com/eli64s/splitme/tree/main/docs/examples [python]: https://www.python.org/ diff --git a/docs/assets/button.svg b/docs/assets/buttons/rectangle.svg similarity index 100% rename from docs/assets/button.svg rename to docs/assets/buttons/rectangle.svg diff --git a/docs/assets/button-circles.svg b/docs/assets/buttons/vesica-piscis.svg similarity index 100% rename from docs/assets/button-circles.svg rename to docs/assets/buttons/vesica-piscis.svg diff --git a/docs/assets/callouts/designs.svg b/docs/assets/callouts/designs.svg new file mode 100644 index 0000000..cad5602 --- /dev/null +++ b/docs/assets/callouts/designs.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + i + + Information Note + + + General information and helpful details about the topic. + + + + + + + + + + + + Warning Alert + + + Important warning message that requires attention. + + + + + + + + + + Success Message + + + Operation completed successfully with desired outcome. + + + + + + + + + + Code Example + + + Technical implementation details and code snippets. + + + diff --git a/docs/assets/callouts/info.svg b/docs/assets/callouts/info.svg new file mode 100644 index 0000000..2ce7d72 --- /dev/null +++ b/docs/assets/callouts/info.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + i + + Important Information + This is a helpful note about your documentation or code. + + + + diff --git a/docs/assets/logo-box.svg b/docs/assets/logo-box.svg index 4cd4009..9d905a3 100644 --- a/docs/assets/logo-box.svg +++ b/docs/assets/logo-box.svg @@ -2,51 +2,40 @@ - - - - + + + + - - + - - - + + - - + + - - - + + - - - + + + - - - SPLITME-AI + + splitme diff --git a/docs/assets/logo-dark.svg b/docs/assets/logo-dark.svg index cd87ce5..315c65a 100644 --- a/docs/assets/logo-dark.svg +++ b/docs/assets/logo-dark.svg @@ -45,7 +45,7 @@ - SPLITME-AI + SPLITME diff --git a/docs/assets/logo-light.svg b/docs/assets/logo-light.svg index ff420a7..833b196 100644 --- a/docs/assets/logo-light.svg +++ b/docs/assets/logo-light.svg @@ -45,7 +45,7 @@ - SPLITME-AI + SPLITME diff --git a/docs/assets/logo.svg b/docs/assets/logo.svg index 7ffa6cc..4d61779 100644 --- a/docs/assets/logo.svg +++ b/docs/assets/logo.svg @@ -42,7 +42,7 @@ - SPLITME-AI + SPLITME diff --git a/docs/assets/splitme-circle-dark.svg b/docs/assets/splitme-circle-dark.svg new file mode 100644 index 0000000..5cbf495 --- /dev/null +++ b/docs/assets/splitme-circle-dark.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPLITME + + + + SPLITME + + + + + + + + + + + + diff --git a/docs/assets/splitme-circle-light.svg b/docs/assets/splitme-circle-light.svg new file mode 100644 index 0000000..d99b416 --- /dev/null +++ b/docs/assets/splitme-circle-light.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SPLITME + + + + SPLITME + + + + + + + + + + + + diff --git a/docs/examples/reflinks-converter/input.md b/docs/examples/convert-to-reference-links/input.md similarity index 100% rename from docs/examples/reflinks-converter/input.md rename to docs/examples/convert-to-reference-links/input.md diff --git a/docs/examples/reflinks-converter/output_with_reflinks.md b/docs/examples/convert-to-reference-links/output_with_reflinks.md similarity index 100% rename from docs/examples/reflinks-converter/output_with_reflinks.md rename to docs/examples/convert-to-reference-links/output_with_reflinks.md diff --git a/docs/examples/input-file/README-AI.md b/docs/examples/input-file/README-AI.md deleted file mode 100644 index 0194edd..0000000 --- a/docs/examples/input-file/README-AI.md +++ /dev/null @@ -1,907 +0,0 @@ -
- -

- readme-ai -

- -

- Designed for simplicity, customization, and developer productivity. -

- -

- - Github Actions - - - Test Coverage - - - PyPI Version - - - Total Downloads - - - MIT License - -

- -
- -line break - -## Quick Links - -- [Intro](#introduction) -- [Demo](#demo) -- [Features](#features) -- [Quickstart](#getting-started) -- [Configuration](#configuration) -- [Examples](#examples) -- [Contributing](#contributing) - -> [!IMPORTANT] -> Visit the [Official Documentation][docs] for detailed guides and tutorials. - -line break - -## Introduction - -ReadmeAI is a developer tool that automatically generates README files using a robust repository processing engine and advanced language models. Simply provide a URL or path to your codebase, and a well-structured and detailed README will be generated. - -**Why Use ReadmeAI?** - -This project aims to streamline the process of creating and maintaining documentation across all technical disciplines and experience levels. The core principles include: - -- **🔵 Automate:** Generate detailed and structured README files with a single command. -- **⚫️ Customize:** Select from a variety of templates, styles, badges, and much more. -- **🟣 Flexible:** Switch between `OpenAI`, `Ollama`, `Anthropic`, and `Gemini` anytime. -- **🟠 Language Agnostic:** Compatible with a wide range of languages and frameworks. -- **🟡 Best Practices:** Ensure clean and consistent documentation across all projects. -- **✨ Offline Mode:** Create README files offline, without using a LLM API service. - -## Demo - -**Run from your terminal:** - -[readmeai-cli-demo][cli-demo] - - - -line break - -## Features - -Let's begin by exploring various customization options and styles supported by ReadmeAI: - -
- -
Header Styles & Themes
- - - - - - - -
- custom-dragon-project-logo -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai-streamlit \
-         --logo custom \
-         --badge-color FF4B4B \
-         --badge-style flat-square \
-         --header-style classic
-        
-
- docker-go-readme-example -

CLI Command:

-
$ readme --repository https://github.com/olliefr/docker-gs-ping \
-         --badge-color 00ADD8 \
-         --badge-style for-the-badge \
-         --header-style modern \
-         --navigation-style roman
-        
-
- - -

Banner Styles

- - - - - - - -
- ascii-readme-header-style -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai \
-         --header-style ascii
-
- svg-banner -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai-streamlit \
-         --badge-style for-the-badge \
-         --header-style svg
-
- - -

And More!

- - - - -
- cloud-logo -

CLI Command:

-
$ readme --repository https://github.com/jwills/buenavista \
-           --align left \
-           --badge-style flat-square \
-           --logo cloud
-
- - - - - - -
- balloon-logo -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai-streamlit \
-           --badge-style flat \
-           --logo custom
-
$ Provide an image file path or URL: \
-           https://www.svgrepo.com/show/395851/balloon.svg
-
- skill-icons -

CLI Command:

-
$ readme --repository https://github.com/FerrariDG/async-ml-inference \
-           --badge-style skills-light \
-           --logo grey
-
- - - - - - -
- compact-header -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai \
-           --logo cloud \
-           --header-style compact \
-           --navigation-style fold
-
- modern-style -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai \
-           -i custom \
-           -bc BA0098 \
-           -bs flat-square \
-           -hs modern \
-           -ns fold
-
-
- -> [!IMPORTANT] -> See the [Official Documentation][docs] for a complete list of customization options and examples. - -Explore additional content sections supported by ReadmeAI: - -
- 🔹 Overview
- - - - - - - -
- Overview
-

◎ The Overview section provides a high-level summary of the project, including its use case, benefits, and differentiating features. -

-
readme-overview-section -
-
- -
- 🔸 Features
- - - - - - - -
Features Table
-

◎ Generated markdown table that highlights the key technical features and components of the codebase. This table is generated using a structured prompt template. -

-
readme-features-section -
-
- -
- 🔶 Module Analysis
- - - - - - - - - - - - -
Directory Tree
-

◎ The project's directory structure is generated using pure Python and embedded in the README. See readmeai.generators.tree. for more details. -

-
- directory-tree -
- File Summaries
-

◎ Summarizes key modules of the project, which are also used as context for downstream prompts. -

-
- file-summaries -
-
- -
- 🔺 Quickstart Guides -
- - - - - - - - - - - -
Getting Started
-

◎ Prerequisites and system requirements are extracted from the codebase during preprocessing. The parsers handles the majority of this logic currently. -

-
getting-started-section-prerequisites -
Installation Guide
-

Installation, Usage, and Testing guides are generated based on the project's dependency files and codebase configuration. -

-
getting-started-section-usage-and-testing -
-
- -
- 🔻 Contributing Guidelines -
- - - - - - - - - - - - - -
Contributing Guide
-

◎ Dropdown section that outlines general process for contributing to your project.

-

◎ Provides links to your contributing guidelines, issues page, and more resources.

-

◎ Graph of contributors is also included.

-

-
contributing-guidelines-section -
Additional Sections
-

Roadmap, Contributing Guidelines, License, and acknowledgment are included by default. -

-
footer-readme-section
-
- -line break - -## Getting Started - -### Prerequisites - -ReadmeAI requires Python 3.9 or higher, plus one installation method of your choice: - -| Requirement | Details | -|--------------------------------------|----------------------------------| -| • [Python][python-link] ≥3.9 | Core runtime | -| **Installation Method** (choose one) | | -| • [pip][pip-link] | Default Python package manager | -| • [pipx][pipx-link] | Isolated environment installer | -| • [uv][uv-link] | High-performance package manager | -| • [docker][docker-link] | Containerized environment | - -### Supported Repository Platforms - -ReadmeAI needs access to your repository to generate a README file. Current supported platforms include: - -| Platform | Details | -|----------------------------|---------------------------| -| [File System][file-system] | Local repository access | -| [GitHub][github] | Industry-standard hosting | -| [GitLab][gitlab] | Full DevOps integration | -| [Bitbucket][bitbucket] | Atlassian ecosystem | - -### Supported LLM API Services - -ReadmeAI is model agnostic, with support for the following LLM API services: - -| Provider | Best For | Details | -|------------------------------|-----------------|--------------------------| -| [OpenAI][openai] | General use | Industry-leading models | -| [Anthropic][anthropic] | Advanced tasks | Claude language models | -| [Google Gemini][gemini] | Multimodal AI | Latest Google technology | -| [Ollama][ollama] | Open source | No API key needed | -| [Offline Mode][offline-mode] | Local operation | No internet required | - ---- - -### Installation - -ReadmeAI is available on [PyPI][pypi-link] as readmeai and can be installed as follows: - - - -#### ![pip][python-svg]{ width="2%" } Pip - -Install with pip (recommended for most users): - -```sh -❯ pip install -U readmeai -``` - - - -#### ![pipx][pipx-svg]{ width="2%" } Pipx - -With `pipx`, readmeai will be installed in an isolated environment: - -```sh -❯ pipx install readmeai -``` - -#### ![uv][uv-svg]{ width="2%" } Uv - -The fastest way to install readmeai is with [uv][uv-link]: - -```sh -❯ uv tool install readmeai -``` - - - -#### ![docker][docker-svg]{ width="2%" } Docker - -To run `readmeai` in a containerized environment, pull the latest image from [Docker Hub][dockerhub-link]: - -```sh -❯ docker pull zeroxeli/readme-ai:latest -``` - -#### ![build-from-source][git-svg]{ width="2%" } From source - -
Click to build readmeai from source - -1. **Clone the repository:** - - ```sh - ❯ git clone https://github.com/eli64s/readme-ai - ``` - -2. **Navigate to the project directory:** - - ```sh - ❯ cd readme-ai - ``` - -3. **Install dependencies:** - - ```sh - ❯ pip install -r setup/requirements.txt - ``` - -Alternatively, use the [setup script][setup-script] to install dependencies: - -#### ![bash][bash-svg]{ width="2%" } Bash - -1. **Run the setup script:** - - ```sh - ❯ bash setup/setup.sh - ``` - -Or, use `poetry` to build and install project dependencies: - -#### ![poetry][poetry-svg]{ width="2%" } Poetry - -1. **Install dependencies with poetry:** - - ```sh - ❯ poetry install - ``` - -
-
- -### Additional Optional Dependencies - -> [!IMPORTANT] -> To use the **Anthropic** and **Google Gemini** clients, extra dependencies are required. Install the package with the following extras: -> -> - **Anthropic:** -> ```sh -> ❯ pip install "readmeai[anthropic]" -> ``` -> - **Google Gemini:** -> ```sh -> ❯ pip install "readmeai[google-generativeai]" -> ``` -> -> - **Install Multiple Clients:** -> ```sh -> ❯ pip install "readmeai[anthropic,google-generativeai]" -> ``` - -### Usage - -#### Set your API key - -When running `readmeai` with a third-party service, you must provide a valid API key. For example, the `OpenAI` client is set as follows: - -```sh -❯ export OPENAI_API_KEY= - -# For Windows users: -❯ set OPENAI_API_KEY= -``` - -
Click to view environment variables for - Ollama, Anthropic, Google Gemini -
-
Ollama -
- -Refer to the [Ollama documentation][ollama] for more information on setting up the Ollama server. - -To start, follow these steps: - -1. Pull your model of choice from the Ollama repository: - - ```sh - ❯ ollama pull llama3.2:latest - ``` - -2. Start the Ollama server and set the `OLLAMA_HOST` environment variable: - - ```sh - ❯ export OLLAMA_HOST=127.0.0.1 && ollama serve - ``` - -
-
Anthropic - -1. Export your Anthropic API key: - - ```sh - ❯ export ANTHROPIC_API_KEY= - ``` - -
-
Google Gemini - -1. Export your Google Gemini API key: - - ```sh - ❯ export GOOGLE_API_KEY= -
- -#### Using the CLI - -##### Running with a LLM API service - -Below is the minimal command required to run `readmeai` using the `OpenAI` client: - -```sh -❯ readmeai --api openai -o readmeai-openai.md -r https://github.com/eli64s/readme-ai -``` - -> [!IMPORTANT] -> The default model set is `gpt-3.5-turbo`, offering the best balance between cost and performance.When using any model from the `gpt-4` series and up, please monitor your costs and usage to avoid unexpected charges. - -ReadmeAI can easily switch between API providers and models. We can run the same command as above with the `Anthropic` client: -```sh -❯ readmeai --api anthropic -m claude-3-5-sonnet-20240620 -o readmeai-anthropic.md -r https://github.com/eli64s/readme-ai -``` - -And finally, with the `Google Gemini` client: - -```sh -❯ readmeai --api gemini -m gemini-1.5-flash -o readmeai-gemini.md -r https://github.com/eli64s/readme-ai -``` - -##### Running with local models - -We can also run `readmeai` with free and open-source locally hosted models using the Ollama: - -```sh -❯ readmeai --api ollama --model llama3.2 -r https://github.com/eli64s/readme-ai -``` - -##### Running on a local codebase - -To generate a README file from a local codebase, simply provide the full path to the project: - -```sh -❯ readmeai --repository /users/username/projects/myproject --api openai -``` - -Adding more customization options: - -```sh -❯ readmeai --repository https://github.com/eli64s/readme-ai \ - --output readmeai.md \ - --api openai \ - --model gpt-4 \ - --badge-color A931EC \ - --badge-style flat-square \ - --header-style compact \ - --navigation-style fold \ - --temperature 0.9 \ - --tree-depth 2 - --logo LLM \ - --emojis solar -``` - -##### Running in offline mode - -ReadmeAI supports `offline mode`, allowing you to generate README files without using a LLM API service. - -```sh -❯ readmeai --api offline -o readmeai-offline.md -r https://github.com/eli64s/readme-ai -``` - -#### ![docker][docker-svg]{ width="2%" } Docker - -Run the `readmeai` CLI in a Docker container: - -```sh -❯ docker run -it --rm \ - -e OPENAI_API_KEY=$OPENAI_API_KEY \ - -v "$(pwd)":/app zeroxeli/readme-ai:latest \ - --repository https://github.com/eli64s/readme-ai \ - --api openai -``` - -#### ![streamlit][streamlit-svg]{ width="2%" } Streamlit - -Try readme-ai directly in your browser on Streamlit Cloud, no installation required. - -[][streamlit] - -See the [readme-ai-streamlit][readme-ai-streamlit] repository on GitHub for more details about the application. - -> [!WARNING] -> The readme-ai Streamlit web app may not always be up-to-date with the latest features. Please use the command-line interface (CLI) for the most recent functionality. - -#### ![build-from-source][git-svg]{ width="2%" } From source - -
Click to run readmeai from source - -#### ![bash][bash-svg]{ width="2%" } Bash - -If you installed the project from source with the bash script, run the following command: - -1. Activate the virtual environment: - - ```sh - ❯ conda activate readmeai - ``` - -2. Run the CLI: - - ```sh - ❯ python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai - ``` - -#### ![poetry][poetry-svg]{ width="2%" } Poetry - -1. Activate the virtual environment: - - ```sh - ❯ poetry shell - ``` - -2. Run the CLI: - - ```sh - ❯ poetry run python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai - ``` - -
- -line break - -### Testing - - - -The [pytest][pytest-link] and [nox][nox-link] frameworks are used for development and testing. - -Install the dependencies with uv: - -```sh -❯ uv pip install -r pyproject.toml --all-extras -``` - -Run the unit test suite using Pytest: - -```sh -❯ make test -``` - -Using nox, test the app against Python versions `3.9`, `3.10`, `3.11`, and `3.12`: - -```sh -❯ make test-nox -``` - -> [!TIP] -> Nox is an automation tool for testing applications in multiple environments. This helps ensure your project is compatible with across Python versions and environments. - -line break - -## Configuration - -Customize your README generation with a variety of options and style settings supported such as: - -| Option | Description | Default | -|-------------------|-----------------------------------------------|-------------------| -| `--align` | Text alignment in header | `center` | -| `--api` | LLM API service provider | `offline` | -| `--badge-color` | Badge color name or hex code | `0080ff` | -| `--badge-style` | Badge icon style type | `flat` | -| `--header-style` | Header template style | `classic` | -| `--navigation-style` | Table of contents style | `bullet` | -| `--emojis` | Emoji theme packs prefixed to section titles | `None` | -| `--logo` | Project logo image | `blue` | -| `--logo-size` | Logo image size | `30%` | -| `--model` | Specific LLM model to use | `gpt-3.5-turbo` | -| `--output` | Output filename | `readme-ai.md` | -| `--repository` | Repository URL or local directory path | `None` | -| `--temperature` | Creativity level for content generation | `0.1` | -| `--tree-depth` | Maximum depth of the directory tree structure | `2` | - -Run the following command to view all available options: - -```sh -❯ readmeai --help -``` - - - -Visit the [Official Documentation][docs] for a complete guide on configuring and customizing README files. - - -line break - -## Examples - -Explore a variety of README examples generated by `readmeai`: - -| Tech | Output | Source | Description | -|------------|---------------|------------|-------------| -| Readme-ai | [readme-ai.md][default] | [readme-ai][readme-ai] | Readme-ai project | -| Apache Flink | [readme-pyflink.md][modern-header] | [pyflink-poc][pyflink] | Pyflink project | -| Streamlit | [readme-streamlit.md][svg-banner] | [readme-ai-streamlit][streamlit] | Streamlit web app | -| Vercel & NPM | [readme-vercel.md][dalle-logo] | [github-readme-quotes][vercel] | Vercel deployment | -| Go & Docker | [readme-docker-go.md][for-the-badge] | [docker-gs-ping][docker-golang] | Dockerized Go app | -| FastAPI & Redis | [readme-fastapi-redis.md][fastapi-redis] | [async-ml-inference][fastapi] | Async ML inference service | -| Java | [readme-java.md][compact-header] | [Minimal-Todo][java] | Minimalist todo Java app | -| PostgreSQL & DuckDB | [readme-postgres.md][classic-header] | [Buenavista][postgres] | Postgres proxy server | -| Kotlin | [readme-kotlin.md][readme-kotlin] | [android-client][kotlin] | Android client app | -| Offline Mode | [offline-mode.md][offline-mode] | [litellm][litellm] | LLM API service | - - - -Find additional README.md file examples in our [examples directory][examples-directory]. - - - -line break - -## Roadmap - -* [ ] Release `readmeai 1.0.0` with enhanced documentation management features. -* [ ] Develop `Vscode Extension` to generate README files directly in the editor. -* [ ] Develop `GitHub Actions` to automate documentation updates. -* [ ] Add `badge packs` to provide additional badge styles and options. - + [ ] Code coverage, CI/CD status, project version, and more. - -## Contributing - -Contributions are welcome! Please read the [Contributing Guide][contributing] to get started. - -- **💡 [Contributing Guide][contributing]**: Learn about our contribution process and coding standards. -- **🐛 [Report an Issue][github-issues]**: Found a bug? Let us know! -- **💬 [Start a Discussion][github-discussions]**: Have ideas or suggestions? We'd love to hear from you. - -
- -

- - - -

- -## Acknowledgments - -A big shoutout to the projects below for their awesome work and open-source contributions: - - - -line break - -## 🎗 License - -Copyright © 2023 [readme-ai][readme-ai].
-Released under the [MIT][license] license. - -
- -[![][to-the-top]](#top) - -
- - - - -[readme-ai]: https://github.com/eli64s/readme-ai -[readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit -[actions]: https://github.com/eli64s/readme-ai/actions -[codecov]: https://app.codecov.io/gh/eli64s/readme-ai -[docs]: https://eli64s.github.io/readme-ai -[github-discussions]: https://github.com/eli64s/readme-ai/discussions -[github-issues]: https://github.com/eli64s/readme-ai/issues -[github-pulls]: https://github.com/eli64s/readme-ai/pulls -[mit]: https://opensource.org/license/mit -[pepy]: https://www.pepy.tech/projects/readmeai -[contributing]: https://github.com/eli64s/readme-ai/blob/main/CONTRIBUTING.md -[license]: https://github.com/eli64s/readme-ai/blob/main/LICENSE -[to-the-top]: https://img.shields.io/badge/Return-5D4ED3?style=flat&logo=ReadMe&logoColor=white - - -[cli-demo]: https://github.com/user-attachments/assets/e1198922-5233-4a44-a5a8-15fa1cc4e2d7 -[streamlit-demo]: https://github.com/user-attachments/assets/c3f60665-4768-4baa-8e31-6b6e8c4c9248 - - -[docker-shield]: https://img.shields.io/badge/Docker-2496ED.svg?style=flat&logo=Docker&logoColor=white -[docker-link]: https://hub.docker.com/r/zeroxeli/readme-ai -[python-link]: https://www.python.org/ -[pip-link]: https://pip.pypa.io/en/stable/ -[pypi-shield]: https://img.shields.io/badge/PyPI-3775A9.svg?style=flat&logo=PyPI&logoColor=white -[pypi-link]: https://pypi.org/project/readmeai/ -[pipx-shield]: https://img.shields.io/badge/pipx-2CFFAA.svg?style=flat&logo=pipx&logoColor=black -[pipx-link]: https://pipx.pypa.io/stable/ -[uv-link]: https://docs.astral.sh/uv/ -[pytest-shield]: https://img.shields.io/badge/Pytest-0A9EDC.svg?style=flat&logo=Pytest&logoColor=white -[pytest-link]: https://docs.pytest.org/en/7.1.x/contents.html -[nox-link]: https://nox.thea.codes/en/stable/ -[streamlit-link]: https://readme-ai.streamlit.app/ - - -[shieldsio]: https://shields.io/ -[simple-icons]: https://simpleicons.org/ -[skill-icons]: https://github.com/tandpfun/skill-icons -[github-profile-badges]: https://github.com/Aveek-Saha/GitHub-Profile-Badges -[markdown-badges]: https://github.com/Ileriayo/markdown-badges -[css-icons]: https://github.com/astrit/css.gg - -[python-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/python.svg -[pipx-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/pipx.svg -[uv-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/astral.svg -[docker-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/3052baaca03db99d00808acfec43a44e81ecbf7f/docs/docs/assets/svg/docker.svg -[git-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/git.svg -[bash-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/gnubash.svg -[poetry-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/poetry.svg -[streamlit-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/streamlit.svg - - -[file-system]: https://en.wikipedia.org/wiki/File_system -[github]: https://github.com/ -[gitlab]: https://gitlab.com/ -[bitbucket]: https://bitbucket.org/ - - -[anthropic]: https://docs.anthropic.com/en/home -[gemini]: https://ai.google.dev/tutorials/python_quickstart -[ollama]: https://github.com/ollama/ollama -[openai]: https://platform.openai.com/docs/quickstart/account-setup: - - -[readme-ai]: https://github.com/eli64s/readme-ai -[pyflink]: https://github.com/eli64s/pyflink-poc -[postgres]: https://github.com/jwills/buenavista -[java]: https://github.com/avjinder/Minimal-Todo -[kotlin]: https://github.com/rumaan/file.io-Android-Client -[docker-golang]: https://github.com/olliefr/docker-gs-ping -[vercel]: https://github.com/PiyushSuthar/github-readme-quotes -[streamlit]: https://github.com/eli64s/readme-ai-streamlit -[fastapi]: https://github.com/FerrariDG/async-ml-inference -[litellm]: https://github.com/BerriAI/litellm - - -[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples -[default]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-ai.md -[ascii-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/ascii.md -[classic-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/classic.md -[compact-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/compact.md -[modern-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/modern.md -[svg-banner]: https://github.com/eli64s/readme-ai/blob/main/examples/banners/svg-banner.md -[dalle-logo]: https://github.com/eli64s/readme-ai/blob/main/examples/logos/dalle.md -[readme-kotlin]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-kotlin.md -[for-the-badge]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-docker-go.md -[fastapi-redis]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-fastapi-redis.md -[offline-mode]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md diff --git a/docs/examples/output-h2/configuration.md b/docs/examples/output-h2/configuration.md deleted file mode 100644 index a53a913..0000000 --- a/docs/examples/output-h2/configuration.md +++ /dev/null @@ -1,38 +0,0 @@ -## Configuration - -Customize your README generation with a variety of options and style settings supported such as: - -| Option | Description | Default | -|-------------------|-----------------------------------------------|-------------------| -| `--align` | Text alignment in header | `center` | -| `--api` | LLM API service provider | `offline` | -| `--badge-color` | Badge color name or hex code | `0080ff` | -| `--badge-style` | Badge icon style type | `flat` | -| `--header-style` | Header template style | `classic` | -| `--navigation-style` | Table of contents style | `bullet` | -| `--emojis` | Emoji theme packs prefixed to section titles | `None` | -| `--logo` | Project logo image | `blue` | -| `--logo-size` | Logo image size | `30%` | -| `--model` | Specific LLM model to use | `gpt-3.5-turbo` | -| `--output` | Output filename | `readme-ai.md` | -| `--repository` | Repository URL or local directory path | `None` | -| `--temperature` | Creativity level for content generation | `0.1` | -| `--tree-depth` | Maximum depth of the directory tree structure | `2` | - -Run the following command to view all available options: - -```sh -❯ readmeai --help -``` - - - -Visit the [Official Documentation][docs] for a complete guide on configuring and customizing README files. - - -line break - ---- - - -[docs]: https://eli64s.github.io/readme-ai diff --git a/docs/examples/output-h2/examples.md b/docs/examples/output-h2/examples.md deleted file mode 100644 index 35ad1d1..0000000 --- a/docs/examples/output-h2/examples.md +++ /dev/null @@ -1,50 +0,0 @@ -## Examples - -Explore a variety of README examples generated by `readmeai`: - -| Tech | Output | Source | Description | -|------------|---------------|------------|-------------| -| Readme-ai | [readme-ai.md][default] | [readme-ai][readme-ai] | Readme-ai project | -| Apache Flink | [readme-pyflink.md][modern-header] | [pyflink-poc][pyflink] | Pyflink project | -| Streamlit | [readme-streamlit.md][svg-banner] | [readme-ai-streamlit][streamlit] | Streamlit web app | -| Vercel & NPM | [readme-vercel.md][dalle-logo] | [github-readme-quotes][vercel] | Vercel deployment | -| Go & Docker | [readme-docker-go.md][for-the-badge] | [docker-gs-ping][docker-golang] | Dockerized Go app | -| FastAPI & Redis | [readme-fastapi-redis.md][fastapi-redis] | [async-ml-inference][fastapi] | Async ML inference service | -| Java | [readme-java.md][compact-header] | [Minimal-Todo][java] | Minimalist todo Java app | -| PostgreSQL & DuckDB | [readme-postgres.md][classic-header] | [Buenavista][postgres] | Postgres proxy server | -| Kotlin | [readme-kotlin.md][readme-kotlin] | [android-client][kotlin] | Android client app | -| Offline Mode | [offline-mode.md][offline-mode] | [litellm][litellm] | LLM API service | - - - -Find additional README.md file examples in our [examples directory][examples-directory]. - - - -line break - ---- - - -[classic-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/classic.md -[compact-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/compact.md -[dalle-logo]: https://github.com/eli64s/readme-ai/blob/main/examples/logos/dalle.md -[default]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-ai.md -[docker-golang]: https://github.com/olliefr/docker-gs-ping -[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples -[fastapi]: https://github.com/FerrariDG/async-ml-inference -[fastapi-redis]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-fastapi-redis.md -[for-the-badge]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-docker-go.md -[java]: https://github.com/avjinder/Minimal-Todo -[kotlin]: https://github.com/rumaan/file.io-Android-Client -[litellm]: https://github.com/BerriAI/litellm -[modern-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/modern.md -[offline-mode]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md -[postgres]: https://github.com/jwills/buenavista -[pyflink]: https://github.com/eli64s/pyflink-poc -[readme-ai]: https://github.com/eli64s/readme-ai -[readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit -[readme-kotlin]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-kotlin.md -[streamlit]: https://github.com/eli64s/readme-ai-streamlit -[svg-banner]: https://github.com/eli64s/readme-ai/blob/main/examples/banners/svg-banner.md -[vercel]: https://github.com/PiyushSuthar/github-readme-quotes diff --git a/docs/examples/output-h2/features.md b/docs/examples/output-h2/features.md deleted file mode 100644 index 0769516..0000000 --- a/docs/examples/output-h2/features.md +++ /dev/null @@ -1,268 +0,0 @@ -## Features - -Let's begin by exploring various customization options and styles supported by ReadmeAI: - -
- -
Header Styles & Themes
- - - - - - - -
- custom-dragon-project-logo -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai-streamlit \
-         --logo custom \
-         --badge-color FF4B4B \
-         --badge-style flat-square \
-         --header-style classic
-        
-
- docker-go-readme-example -

CLI Command:

-
$ readme --repository https://github.com/olliefr/docker-gs-ping \
-         --badge-color 00ADD8 \
-         --badge-style for-the-badge \
-         --header-style modern \
-         --navigation-style roman
-        
-
- - -

Banner Styles

- - - - - - - -
- ascii-readme-header-style -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai \
-         --header-style ascii
-
- svg-banner -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai-streamlit \
-         --badge-style for-the-badge \
-         --header-style svg
-
- - -

And More!

- - - - -
- cloud-logo -

CLI Command:

-
$ readme --repository https://github.com/jwills/buenavista \
-           --align left \
-           --badge-style flat-square \
-           --logo cloud
-
- - - - - - -
- balloon-logo -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai-streamlit \
-           --badge-style flat \
-           --logo custom
-
$ Provide an image file path or URL: \
-           https://www.svgrepo.com/show/395851/balloon.svg
-
- skill-icons -

CLI Command:

-
$ readme --repository https://github.com/FerrariDG/async-ml-inference \
-           --badge-style skills-light \
-           --logo grey
-
- - - - - - -
- compact-header -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai \
-           --logo cloud \
-           --header-style compact \
-           --navigation-style fold
-
- modern-style -

CLI Command:

-
$ readme --repository https://github.com/eli64s/readme-ai \
-           -i custom \
-           -bc BA0098 \
-           -bs flat-square \
-           -hs modern \
-           -ns fold
-
-
- -> [!IMPORTANT] -> See the [Official Documentation][docs] for a complete list of customization options and examples. - -Explore additional content sections supported by ReadmeAI: - -
- 🔹 Overview
- - - - - - - -
- Overview
-

◎ The Overview section provides a high-level summary of the project, including its use case, benefits, and differentiating features. -

-
readme-overview-section -
-
- -
- 🔸 Features
- - - - - - - -
Features Table
-

◎ Generated markdown table that highlights the key technical features and components of the codebase. This table is generated using a structured prompt template. -

-
readme-features-section -
-
- -
- 🔶 Module Analysis
- - - - - - - - - - - - -
Directory Tree
-

◎ The project's directory structure is generated using pure Python and embedded in the README. See readmeai.generators.tree. for more details. -

-
- directory-tree -
- File Summaries
-

◎ Summarizes key modules of the project, which are also used as context for downstream prompts. -

-
- file-summaries -
-
- -
- 🔺 Quickstart Guides -
- - - - - - - - - - - -
Getting Started
-

◎ Prerequisites and system requirements are extracted from the codebase during preprocessing. The parsers handles the majority of this logic currently. -

-
getting-started-section-prerequisites -
Installation Guide
-

Installation, Usage, and Testing guides are generated based on the project's dependency files and codebase configuration. -

-
getting-started-section-usage-and-testing -
-
- -
- 🔻 Contributing Guidelines -
- - - - - - - - - - - - - -
Contributing Guide
-

◎ Dropdown section that outlines general process for contributing to your project.

-

◎ Provides links to your contributing guidelines, issues page, and more resources.

-

◎ Graph of contributors is also included.

-

-
contributing-guidelines-section -
Additional Sections
-

Roadmap, Contributing Guidelines, License, and acknowledgment are included by default. -

-
footer-readme-section
-
- -line break - ---- - - -[docs]: https://eli64s.github.io/readme-ai diff --git a/docs/examples/output-h2/license.md b/docs/examples/output-h2/license.md deleted file mode 100644 index bd2b35e..0000000 --- a/docs/examples/output-h2/license.md +++ /dev/null @@ -1,108 +0,0 @@ -## 🎗 License - -Copyright © 2023 [readme-ai][readme-ai].
-Released under the [MIT][license] license. - -
- -[![][to-the-top]](#top) - -
- - - - -[readme-ai]: https://github.com/eli64s/readme-ai -[readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit -[actions]: https://github.com/eli64s/readme-ai/actions -[codecov]: https://app.codecov.io/gh/eli64s/readme-ai -[docs]: https://eli64s.github.io/readme-ai -[github-discussions]: https://github.com/eli64s/readme-ai/discussions -[github-issues]: https://github.com/eli64s/readme-ai/issues -[github-pulls]: https://github.com/eli64s/readme-ai/pulls -[mit]: https://opensource.org/license/mit -[pepy]: https://www.pepy.tech/projects/readmeai -[contributing]: https://github.com/eli64s/readme-ai/blob/main/CONTRIBUTING.md -[license]: https://github.com/eli64s/readme-ai/blob/main/LICENSE -[to-the-top]: https://img.shields.io/badge/Return-5D4ED3?style=flat&logo=ReadMe&logoColor=white - - -[cli-demo]: https://github.com/user-attachments/assets/e1198922-5233-4a44-a5a8-15fa1cc4e2d7 -[streamlit-demo]: https://github.com/user-attachments/assets/c3f60665-4768-4baa-8e31-6b6e8c4c9248 - - -[docker-shield]: https://img.shields.io/badge/Docker-2496ED.svg?style=flat&logo=Docker&logoColor=white -[docker-link]: https://hub.docker.com/r/zeroxeli/readme-ai -[python-link]: https://www.python.org/ -[pip-link]: https://pip.pypa.io/en/stable/ -[pypi-shield]: https://img.shields.io/badge/PyPI-3775A9.svg?style=flat&logo=PyPI&logoColor=white -[pypi-link]: https://pypi.org/project/readmeai/ -[pipx-shield]: https://img.shields.io/badge/pipx-2CFFAA.svg?style=flat&logo=pipx&logoColor=black -[pipx-link]: https://pipx.pypa.io/stable/ -[uv-link]: https://docs.astral.sh/uv/ -[pytest-shield]: https://img.shields.io/badge/Pytest-0A9EDC.svg?style=flat&logo=Pytest&logoColor=white -[pytest-link]: https://docs.pytest.org/en/7.1.x/contents.html -[nox-link]: https://nox.thea.codes/en/stable/ -[streamlit-link]: https://readme-ai.streamlit.app/ - - -[shieldsio]: https://shields.io/ -[simple-icons]: https://simpleicons.org/ -[skill-icons]: https://github.com/tandpfun/skill-icons -[github-profile-badges]: https://github.com/Aveek-Saha/GitHub-Profile-Badges -[markdown-badges]: https://github.com/Ileriayo/markdown-badges -[css-icons]: https://github.com/astrit/css.gg - -[python-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/python.svg -[pipx-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/pipx.svg -[uv-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/astral.svg -[docker-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/3052baaca03db99d00808acfec43a44e81ecbf7f/docs/docs/assets/svg/docker.svg -[git-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/git.svg -[bash-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/gnubash.svg -[poetry-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/poetry.svg -[streamlit-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/streamlit.svg - - -[file-system]: https://en.wikipedia.org/wiki/File_system -[github]: https://github.com/ -[gitlab]: https://gitlab.com/ -[bitbucket]: https://bitbucket.org/ - - -[anthropic]: https://docs.anthropic.com/en/home -[gemini]: https://ai.google.dev/tutorials/python_quickstart -[ollama]: https://github.com/ollama/ollama -[openai]: https://platform.openai.com/docs/quickstart/account-setup: - - -[readme-ai]: https://github.com/eli64s/readme-ai -[pyflink]: https://github.com/eli64s/pyflink-poc -[postgres]: https://github.com/jwills/buenavista -[java]: https://github.com/avjinder/Minimal-Todo -[kotlin]: https://github.com/rumaan/file.io-Android-Client -[docker-golang]: https://github.com/olliefr/docker-gs-ping -[vercel]: https://github.com/PiyushSuthar/github-readme-quotes -[streamlit]: https://github.com/eli64s/readme-ai-streamlit -[fastapi]: https://github.com/FerrariDG/async-ml-inference -[litellm]: https://github.com/BerriAI/litellm - - -[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples -[default]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-ai.md -[ascii-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/ascii.md -[classic-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/classic.md -[compact-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/compact.md -[modern-header]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/modern.md -[svg-banner]: https://github.com/eli64s/readme-ai/blob/main/examples/banners/svg-banner.md -[dalle-logo]: https://github.com/eli64s/readme-ai/blob/main/examples/logos/dalle.md -[readme-kotlin]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-kotlin.md -[for-the-badge]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-docker-go.md -[fastapi-redis]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-fastapi-redis.md -[offline-mode]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md - ---- - - -[license]: https://github.com/eli64s/readme-ai/blob/main/LICENSE -[readme-ai]: https://github.com/eli64s/readme-ai -[to-the-top]: https://img.shields.io/badge/Return-5D4ED3?style=flat&logo=ReadMe&logoColor=white diff --git a/docs/examples/output-h2/quick-links.md b/docs/examples/output-h2/quick-links.md deleted file mode 100644 index c364adf..0000000 --- a/docs/examples/output-h2/quick-links.md +++ /dev/null @@ -1,19 +0,0 @@ -## Quick Links - -- [Intro](#introduction) -- [Demo](#demo) -- [Features](#features) -- [Quickstart](#getting-started) -- [Configuration](#configuration) -- [Examples](#examples) -- [Contributing](#contributing) - -> [!IMPORTANT] -> Visit the [Official Documentation][docs] for detailed guides and tutorials. - -line break - ---- - - -[docs]: https://eli64s.github.io/readme-ai diff --git a/docs/examples/output-h3/supported-llm-api-services.md b/docs/examples/output-h3/supported-llm-api-services.md deleted file mode 100644 index c9c3843..0000000 --- a/docs/examples/output-h3/supported-llm-api-services.md +++ /dev/null @@ -1,20 +0,0 @@ -### Supported LLM API Services - -ReadmeAI is model agnostic, with support for the following LLM API services: - -| Provider | Best For | Details | -|------------------------------|-----------------|--------------------------| -| [OpenAI][openai] | General use | Industry-leading models | -| [Anthropic][anthropic] | Advanced tasks | Claude language models | -| [Google Gemini][gemini] | Multimodal AI | Latest Google technology | -| [Ollama][ollama] | Open source | No API key needed | -| [Offline Mode][offline-mode] | Local operation | No internet required | - ---- - - -[anthropic]: https://docs.anthropic.com/en/home -[gemini]: https://ai.google.dev/tutorials/python_quickstart -[offline-mode]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md -[ollama]: https://github.com/ollama/ollama -[openai]: https://platform.openai.com/docs/quickstart/account-setup: diff --git a/docs/examples/output-h4/bash-bash.md b/docs/examples/output-h4/bash-bash.md deleted file mode 100644 index 79c9d5b..0000000 --- a/docs/examples/output-h4/bash-bash.md +++ /dev/null @@ -1,20 +0,0 @@ -#### ![bash][bash-svg]{ width="2%" } Bash - -If you installed the project from source with the bash script, run the following command: - -1. Activate the virtual environment: - - ```sh - ❯ conda activate readmeai - ``` - -2. Run the CLI: - - ```sh - ❯ python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai - ``` - ---- - - -[bash-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/gnubash.svg diff --git a/docs/examples/output-h4/build-from-source-from-source.md b/docs/examples/output-h4/build-from-source-from-source.md deleted file mode 100644 index 0dfe350..0000000 --- a/docs/examples/output-h4/build-from-source-from-source.md +++ /dev/null @@ -1,8 +0,0 @@ -#### ![build-from-source][git-svg]{ width="2%" } From source - -
Click to run readmeai from source - ---- - - -[git-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/git.svg diff --git a/docs/examples/output-h4/pipx-pipx.md b/docs/examples/output-h4/pipx-pipx.md deleted file mode 100644 index cad2004..0000000 --- a/docs/examples/output-h4/pipx-pipx.md +++ /dev/null @@ -1,12 +0,0 @@ -#### ![pipx][pipx-svg]{ width="2%" } Pipx - -With `pipx`, readmeai will be installed in an isolated environment: - -```sh -❯ pipx install readmeai -``` - ---- - - -[pipx-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/pipx.svg diff --git a/docs/examples/output-h4/poetry-poetry.md b/docs/examples/output-h4/poetry-poetry.md deleted file mode 100644 index 1fc25aa..0000000 --- a/docs/examples/output-h4/poetry-poetry.md +++ /dev/null @@ -1,22 +0,0 @@ -#### ![poetry][poetry-svg]{ width="2%" } Poetry - -1. Activate the virtual environment: - - ```sh - ❯ poetry shell - ``` - -2. Run the CLI: - - ```sh - ❯ poetry run python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai - ``` - -
- -line break - ---- - - -[poetry-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/poetry.svg diff --git a/docs/examples/output-h2/acknowledgments.md b/docs/examples/split-sections-h2/acknowledgments.md similarity index 92% rename from docs/examples/output-h2/acknowledgments.md rename to docs/examples/split-sections-h2/acknowledgments.md index 8f36950..0b77d69 100644 --- a/docs/examples/output-h2/acknowledgments.md +++ b/docs/examples/split-sections-h2/acknowledgments.md @@ -23,6 +23,4 @@ A big shoutout to the projects below for their awesome work and open-source cont -line break - --- diff --git a/docs/examples/split-sections-h2/configuration.md b/docs/examples/split-sections-h2/configuration.md new file mode 100644 index 0000000..a03f190 --- /dev/null +++ b/docs/examples/split-sections-h2/configuration.md @@ -0,0 +1,39 @@ +## Configuration + +Customize your README generation with a variety of options and style settings supported such as: + +| Option | Description | Default | +|----------------------|-----------------------------------------------|-----------------| +| `--align` | Text alignment in header | `center` | +| `--api` | LLM API service provider | `offline` | +| `--badge-color` | Badge color name or hex code | `0080ff` | +| `--badge-style` | Badge icon style type | `flat` | +| `--header-style` | Header template style | `classic` | +| `--navigation-style` | Table of contents style | `bullet` | +| `--emojis` | Emoji theme packs prefixed to section titles | `None` | +| `--logo` | Project logo image | `blue` | +| `--logo-size` | Logo image size | `30%` | +| `--model` | Specific LLM model to use | `gpt-3.5-turbo` | +| `--output` | Output filename | `readme-ai.md` | +| `--repository` | Repository URL or local directory path | `None` | +| `--temperature` | Creativity level for content generation | `0.1` | +| `--tree-max-depth` | Maximum depth of the directory tree structure | `2` | + +Run the following command to view all available options: + +```sh +❯ readmeai --help +``` + + + +Visit the [Official Documentation][docs] for a complete guide on configuring and customizing README files. + + + +line break + +--- + + +[docs]: https://eli64s.github.io/readme-ai diff --git a/docs/examples/output-h2/contributing.md b/docs/examples/split-sections-h2/contributing.md similarity index 100% rename from docs/examples/output-h2/contributing.md rename to docs/examples/split-sections-h2/contributing.md diff --git a/docs/examples/output-h2/demo.md b/docs/examples/split-sections-h2/demo.md similarity index 66% rename from docs/examples/output-h2/demo.md rename to docs/examples/split-sections-h2/demo.md index 6dec6af..1c815c9 100644 --- a/docs/examples/output-h2/demo.md +++ b/docs/examples/split-sections-h2/demo.md @@ -10,7 +10,7 @@ [readmeai-streamlit-demo][streamlit-demo] --> -line break +line break --- diff --git a/docs/examples/split-sections-h2/example-gallery.md b/docs/examples/split-sections-h2/example-gallery.md new file mode 100644 index 0000000..fc74511 --- /dev/null +++ b/docs/examples/split-sections-h2/example-gallery.md @@ -0,0 +1,56 @@ +## Example Gallery + +This gallery showcases a diverse collection of README examples generated across various programming languages, frameworks, and project types. + +| Tech | Repository | README | Project Description | +|:--------------------|:------------------------|:-----------------------|:---------------------------| +| Python | [README-Python.md] | [readmeai] | ReadmeAI's core project | +| Apache Flink | [README-Flink.md] | [pyflink-poc] | PyFlink proof of concept | +| Streamlit | [README-Streamlit.md] | [readmeai-streamlit] | Web application interface | +| Vercel & NPM | [README-Vercel.md] | [github-readme-quotes] | Deployment showcase | +| Go & Docker | [README-DockerGo.md] | [docker-gs-ping] | Containerized Golang app | +| FastAPI & Redis | [README-FastAPI.md] | [async-ml-inference] | ML inference service | +| Java | [README-Java.md] | [minimal-todo] | Minimalist To-Do app | +| PostgreSQL & DuckDB | [README-PostgreSQL.md] | [buenavista] | Database proxy server | +| Kotlin | [README-Kotlin.md] | [android-client] | Mobile client application | +| Offline Mode | [README-Offline.md] | [litellm] | Offline functionality demo | + +### Community Contribution + +#### Share Your README Files + +We invite developers to share their generated README files in our [Show & Tell][show-and-tell] discussion category. Your contributions help: + +- Showcase diverse documentation styles +- Provide real-world examples +- Help improve the ReadmeAI tool + +Find additional README examples in our [examples directory][examples-directory] on GitHub. + +line break + +--- + + +[README-DockerGo.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-docker-go.md +[README-FastAPI.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-fastapi-redis.md +[README-Flink.md]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/modern.md +[README-Java.md]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/compact.md +[README-Kotlin.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-kotlin.md +[README-Offline.md]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md +[README-PostgreSQL.md]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/classic.md +[README-Python.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-ai.md +[README-Streamlit.md]: https://github.com/eli64s/readme-ai/blob/main/examples/banners/svg-banner.md +[README-Vercel.md]: https://github.com/eli64s/readme-ai/blob/main/examples/logos/dalle.md +[android-client]: https://github.com/rumaan/file.io-Android-Client +[async-ml-inference]: https://github.com/FerrariDG/async-ml-inference +[buenavista]: https://github.com/jwills/buenavista +[docker-gs-ping]: https://github.com/olliefr/docker-gs-ping +[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples +[github-readme-quotes]: https://github.com/PiyushSuthar/github-readme-quotes +[litellm]: https://github.com/BerriAI/litellm +[minimal-todo]: https://github.com/avjinder/Minimal-Todo +[pyflink-poc]: https://github.com/eli64s/pyflink-poc +[readmeai]: https://github.com/eli64s/readme-ai +[readmeai-streamlit]: https://github.com/eli64s/readme-ai-streamlit +[show-and-tell]: https://github.com/eli64s/readme-ai/discussions/categories/show-and-tell diff --git a/docs/examples/split-sections-h2/features.md b/docs/examples/split-sections-h2/features.md new file mode 100644 index 0000000..af1e5d1 --- /dev/null +++ b/docs/examples/split-sections-h2/features.md @@ -0,0 +1,254 @@ +## Features + +### Customize Your README + +Let's begin by exploring various customization options and styles supported by ReadmeAI: + +
+
Header Styles
+ + + + + + + + + + + + + +
+ Classic Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/eli64s/readme-ai-streamlit \
+           --logo custom \
+           --badge-color FF4B4B \
+           --badge-style flat-square \
+           --header-style classic
+          
+        
+
+ Modern Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/olliefr/docker-gs-ping \
+           --badge-color 00ADD8 \
+           --badge-style for-the-badge \
+           --header-style modern \
+           --navigation-style roman
+          
+        
+
+ Compact Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/rumaan/file.io-Android-Client \
+           --badge-style plastic \
+           --badge-color blueviolet \
+           --logo PURPLE \
+           --header-style COMPACT \
+           --navigation-style NUMBER \
+           --emojis solar
+          
+        
+
+ + +

Banner Styles

+ + + + + + + + +
+ Console Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/emcf/thepipe \
+           --badge-style flat-square \
+           --badge-color 8a2be2 \
+           --header-style console \
+           --navigation-style accordion \
+           --emojis water
+          
+        
+
+ SVG Banner +

CLI Command:

+
+          $ readmeai --repository https://github.com/FerrariDG/async-ml-inference \
+           --badge-style plastic \
+           --badge-color 43a047 \
+           --header-style BANNER
+          
+        
+
+ + +

And More!

+ + + + + + + + +
+ Project Overview +

CLI Command:

+
+          $ readmeai --repository 'https://github.com/eli64sreadme-ai-streamlit' \
+           --badge-style FLAT-SQUARE \
+           --badge-color E92063 \
+           --header-style COMPACT \
+           --navigation-style ACCORDION \
+           --emojis RAINBOW \
+           --logo ICE
+          
+        
+
+ Custom Logo +

CLI Command:

+
+          $ readmeai --repository https://github.com/jwills/buenavista \
+           --align LEFT \
+           --badge-style FLAT-SQUARE \
+           --logo CUSTOM
+          
+        
+
+ + + +
+ +### Generated Sections & Content + +
꩜ Expand to view more!
+ +|

Project Introduction

  • This section captures your project's essence and value proposition.
  • The prompt template used to generate this section can be viewed [here][prompts.toml].
| +| :--- | +| ![][project-overview] | + +|

Features Table

  • Detailed feature breakdown and technical capabilities.
  • The prompt template used to generate this section can be viewed [here][prompts.toml].
| +| :--- | +| ![][features-table] | + +|

Project Structure

  • Visual representation of your project's directory structure.
  • The tree is generated using [pure Python][tree.py] and embedded in a code block.
| +| :--- | +| ![][project-structure] | +|

Project Index

  • Summarizes key modules of the project, which are also used as context for downstream [prompts.toml][prompts.toml].
| +| ![][project-index] | + +|

Getting Started Guides

  • Dependencies and system requirements are extracted from the codebase during preprocessing.
  • The [parsers][readmeai.parsers] handle most of the heavy lifting here.
| +| :--- | +| ![][installation-steps] | +|

Installation, Usage, & Testing

  • Setup instructions and usage guides are automatically created based on data extracted from the codebase.
| +| ![][usage-guides] | + +|

Community & Support

  • Development roadmap, contribution guidelines, license information, and community resources.
  • A return button is also included for easy navigation.
| +| :--- | +| ![][community-and-support] | +|

Contribution Guides

  • Instructions for contributing to the project, including resource links and a basic contribution guide.
  • Graph of contributors is also included for open-source projects.
| +| ![][contributing-guidelines] | + +
+ +line break + +--- + + +[community-and-support]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/community/community-and-support.png?raw=true +[contributing-guidelines]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/community/contributing-guidelines.png?raw=true +[features-table]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/features/features.png?raw=true +[installation-steps]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/getting-started/installation-steps.png?raw=true +[project-index]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-structure/project-index.png?raw=true +[project-overview]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-overview/introduction.png?raw=true +[project-structure]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-structure/project-structure.png?raw=true +[prompts.toml]: https://github.com/eli64s/readme-ai/blob/main/readmeai/config/settings/prompts.toml +[readmeai.parsers]: https://github.com/eli64s/readme-ai/tree/main/readmeai/parsers +[tree.py]: https://github.com/eli64s/readme-ai/blob/main/readmeai/generators/tree.py +[usage-guides]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/getting-started/usage-guides.png?raw=true diff --git a/docs/examples/output-h2/getting-started.md b/docs/examples/split-sections-h2/getting-started.md similarity index 72% rename from docs/examples/output-h2/getting-started.md rename to docs/examples/split-sections-h2/getting-started.md index e2b0218..15119b7 100644 --- a/docs/examples/output-h2/getting-started.md +++ b/docs/examples/split-sections-h2/getting-started.md @@ -2,7 +2,7 @@ ### Prerequisites -ReadmeAI requires Python 3.9 or higher, plus one installation method of your choice: +ReadmeAI requires Python 3.9 or higher, and one of the following installation methods: | Requirement | Details | |--------------------------------------|----------------------------------| @@ -15,7 +15,7 @@ ReadmeAI requires Python 3.9 or higher, plus one installation method of your cho ### Supported Repository Platforms -ReadmeAI needs access to your repository to generate a README file. Current supported platforms include: +To generate a README file, provide the source repository. ReadmeAI supports these platforms: | Platform | Details | |----------------------------|---------------------------| @@ -28,13 +28,13 @@ ReadmeAI needs access to your repository to generate a README file. Current supp ReadmeAI is model agnostic, with support for the following LLM API services: -| Provider | Best For | Details | -|------------------------------|-----------------|--------------------------| -| [OpenAI][openai] | General use | Industry-leading models | -| [Anthropic][anthropic] | Advanced tasks | Claude language models | -| [Google Gemini][gemini] | Multimodal AI | Latest Google technology | -| [Ollama][ollama] | Open source | No API key needed | -| [Offline Mode][offline-mode] | Local operation | No internet required | +| Provider | Best For | Details | +|-----------------------------------|-----------------|--------------------------| +| [OpenAI][openai] | General use | Industry-leading models | +| [Anthropic][anthropic] | Advanced tasks | Claude language models | +| [Google Gemini][gemini] | Multimodal AI | Latest Google technology | +| [Ollama][ollama] | Open source | No API key needed | +| [Offline Mode][README-Offline.md] | Local operation | No internet required | --- @@ -43,8 +43,8 @@ ReadmeAI is model agnostic, with support for the following LLM API services: ReadmeAI is available on [PyPI][pypi-link] as readmeai and can be installed as follows: - -#### ![pip][python-svg]{ width="2%" } Pip + +####  Pip Install with pip (recommended for most users): @@ -53,8 +53,8 @@ Install with pip (recommended for most users): ``` - -#### ![pipx][pipx-svg]{ width="2%" } Pipx + +####  Pipx With `pipx`, readmeai will be installed in an isolated environment: @@ -62,7 +62,8 @@ With `pipx`, readmeai will be installed in an isolated environment: ❯ pipx install readmeai ``` -#### ![uv][uv-svg]{ width="2%" } Uv + +####  Uv The fastest way to install readmeai is with [uv][uv-link]: @@ -71,8 +72,8 @@ The fastest way to install readmeai is with [uv][uv-link]: ``` - -#### ![docker][docker-svg]{ width="2%" } Docker + +####  Docker To run `readmeai` in a containerized environment, pull the latest image from [Docker Hub][dockerhub-link]: @@ -80,7 +81,8 @@ To run `readmeai` in a containerized environment, pull the latest image from [Do ❯ docker pull zeroxeli/readme-ai:latest ``` -#### ![build-from-source][git-svg]{ width="2%" } From source + +####  From source
Click to build readmeai from source @@ -104,7 +106,8 @@ To run `readmeai` in a containerized environment, pull the latest image from [Do Alternatively, use the [setup script][setup-script] to install dependencies: -#### ![bash][bash-svg]{ width="2%" } Bash + +#####  Bash 1. **Run the setup script:** @@ -114,7 +117,8 @@ Alternatively, use the [setup script][setup-script] to install dependencies: Or, use `poetry` to build and install project dependencies: -#### ![poetry][poetry-svg]{ width="2%" } Poetry + +#####  Poetry 1. **Install dependencies with poetry:** @@ -264,7 +268,8 @@ ReadmeAI supports `offline mode`, allowing you to generate README files without ❯ readmeai --api offline -o readmeai-offline.md -r https://github.com/eli64s/readme-ai ``` -#### ![docker][docker-svg]{ width="2%" } Docker + +####  Docker Run the `readmeai` CLI in a Docker container: @@ -276,22 +281,25 @@ Run the `readmeai` CLI in a Docker container: --api openai ``` -#### ![streamlit][streamlit-svg]{ width="2%" } Streamlit + +####  Streamlit Try readme-ai directly in your browser on Streamlit Cloud, no installation required. -[][streamlit] +[](https://readme-ai.streamlit.app/) See the [readme-ai-streamlit][readme-ai-streamlit] repository on GitHub for more details about the application. > [!WARNING] > The readme-ai Streamlit web app may not always be up-to-date with the latest features. Please use the command-line interface (CLI) for the most recent functionality. -#### ![build-from-source][git-svg]{ width="2%" } From source + +####  From source
Click to run readmeai from source -#### ![bash][bash-svg]{ width="2%" } Bash + +#####  Bash If you installed the project from source with the bash script, run the following command: @@ -307,7 +315,8 @@ If you installed the project from source with the bash script, run the following ❯ python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai ``` -#### ![poetry][poetry-svg]{ width="2%" } Poetry + +#####  Poetry 1. Activate the virtual environment: @@ -323,7 +332,7 @@ If you installed the project from source with the bash script, run the following
-line break +line break ### Testing @@ -334,7 +343,7 @@ The [pytest][pytest-link] and [nox][nox-link] frameworks are used for developmen Install the dependencies with uv: ```sh -❯ uv pip install -r pyproject.toml --all-extras +❯ uv pip install --dev --group test --all-extras ``` Run the unit test suite using Pytest: @@ -352,39 +361,38 @@ Using nox, test the app against Python versions `3.9`, `3.10`, `3.11`, and `3.12 > [!TIP] > Nox is an automation tool for testing applications in multiple environments. This helps ensure your project is compatible with across Python versions and environments. -line break +line break --- +[README-Offline.md]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md [anthropic]: https://docs.anthropic.com/en/home -[bash-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/gnubash.svg +[bash-svg]: https://simpleicons.org/icons/gnubash.svg [bitbucket]: https://bitbucket.org/ [docker-link]: https://hub.docker.com/r/zeroxeli/readme-ai [docker-shield]: https://img.shields.io/badge/Docker-2496ED.svg?style=flat&logo=Docker&logoColor=white -[docker-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/3052baaca03db99d00808acfec43a44e81ecbf7f/docs/docs/assets/svg/docker.svg +[docker-svg]: https://simpleicons.org/icons/docker.svg [file-system]: https://en.wikipedia.org/wiki/File_system [gemini]: https://ai.google.dev/tutorials/python_quickstart -[git-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/git.svg +[git-svg]: https://simpleicons.org/icons/git.svg [github]: https://github.com/ [gitlab]: https://gitlab.com/ [nox-link]: https://nox.thea.codes/en/stable/ -[offline-mode]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md [ollama]: https://github.com/ollama/ollama [openai]: https://platform.openai.com/docs/quickstart/account-setup: [pip-link]: https://pip.pypa.io/en/stable/ [pipx-link]: https://pipx.pypa.io/stable/ [pipx-shield]: https://img.shields.io/badge/pipx-2CFFAA.svg?style=flat&logo=pipx&logoColor=black -[pipx-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/pipx.svg -[poetry-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/poetry.svg +[pipx-svg]: https://simpleicons.org/icons/pipx.svg +[poetry-svg]: https://simpleicons.org/icons/poetry.svg [pypi-link]: https://pypi.org/project/readmeai/ [pypi-shield]: https://img.shields.io/badge/PyPI-3775A9.svg?style=flat&logo=PyPI&logoColor=white [pytest-link]: https://docs.pytest.org/en/7.1.x/contents.html [pytest-shield]: https://img.shields.io/badge/Pytest-0A9EDC.svg?style=flat&logo=Pytest&logoColor=white [python-link]: https://www.python.org/ -[python-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/python.svg +[python-svg]: https://simpleicons.org/icons/python.svg [readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit -[streamlit]: https://github.com/eli64s/readme-ai-streamlit -[streamlit-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/streamlit.svg +[streamlit-svg]: https://simpleicons.org/icons/streamlit.svg [uv-link]: https://docs.astral.sh/uv/ -[uv-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/astral.svg +[uv-svg]: https://simpleicons.org/icons/astral.svg diff --git a/docs/examples/output-h2/introduction.md b/docs/examples/split-sections-h2/introduction.md similarity index 100% rename from docs/examples/output-h2/introduction.md rename to docs/examples/split-sections-h2/introduction.md diff --git a/docs/examples/split-sections-h2/license.md b/docs/examples/split-sections-h2/license.md new file mode 100644 index 0000000..83e13f7 --- /dev/null +++ b/docs/examples/split-sections-h2/license.md @@ -0,0 +1,126 @@ +## 🎗 License + +Copyright © 2023-2025 [readme-ai][readme-ai].
+Released under the [MIT][license] license. + +
+ +[![][to-the-top]](#top) + +
+ +line break + + + +[readme-ai]: https://github.com/eli64s/readme-ai +[readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit +[actions]: https://github.com/eli64s/readme-ai/actions +[codecov]: https://app.codecov.io/gh/eli64s/readme-ai +[docs]: https://eli64s.github.io/readme-ai +[github-discussions]: https://github.com/eli64s/readme-ai/discussions +[github-issues]: https://github.com/eli64s/readme-ai/issues +[github-pulls]: https://github.com/eli64s/readme-ai/pulls +[mit]: https://opensource.org/license/mit +[pepy]: https://www.pepy.tech/projects/readmeai +[contributing]: https://github.com/eli64s/readme-ai/blob/main/CONTRIBUTING.md +[license]: https://github.com/eli64s/readme-ai/blob/main/LICENSE +[to-the-top]: https://img.shields.io/badge/Return-5D4ED3?style=flat&logo=ReadMe&logoColor=white + + +[cli-demo]: https://github.com/user-attachments/assets/e1198922-5233-4a44-a5a8-15fa1cc4e2d7 +[streamlit-demo]: https://github.com/user-attachments/assets/c3f60665-4768-4baa-8e31-6b6e8c4c9248 + + +[docker-shield]: https://img.shields.io/badge/Docker-2496ED.svg?style=flat&logo=Docker&logoColor=white +[docker-link]: https://hub.docker.com/r/zeroxeli/readme-ai +[python-link]: https://www.python.org/ +[pip-link]: https://pip.pypa.io/en/stable/ +[pypi-shield]: https://img.shields.io/badge/PyPI-3775A9.svg?style=flat&logo=PyPI&logoColor=white +[pypi-link]: https://pypi.org/project/readmeai/ +[pipx-shield]: https://img.shields.io/badge/pipx-2CFFAA.svg?style=flat&logo=pipx&logoColor=black +[pipx-link]: https://pipx.pypa.io/stable/ +[uv-link]: https://docs.astral.sh/uv/ +[pytest-shield]: https://img.shields.io/badge/Pytest-0A9EDC.svg?style=flat&logo=Pytest&logoColor=white +[pytest-link]: https://docs.pytest.org/en/7.1.x/contents.html +[nox-link]: https://nox.thea.codes/en/stable/ +[streamlit-link]: https://readme-ai.streamlit.app/ + + +[shieldsio]: https://shields.io/ +[simple-icons]: https://simpleicons.org/ +[skill-icons]: https://github.com/tandpfun/skill-icons +[github-profile-badges]: https://github.com/Aveek-Saha/GitHub-Profile-Badges +[markdown-badges]: https://github.com/Ileriayo/markdown-badges +[css-icons]: https://github.com/astrit/css.gg + + +[python-svg]: https://simpleicons.org/icons/python.svg +[pipx-svg]: https://simpleicons.org/icons/pipx.svg +[uv-svg]: https://simpleicons.org/icons/astral.svg +[docker-svg]: https://simpleicons.org/icons/docker.svg +[git-svg]: https://simpleicons.org/icons/git.svg +[bash-svg]: https://simpleicons.org/icons/gnubash.svg +[poetry-svg]: https://simpleicons.org/icons/poetry.svg +[streamlit-svg]: https://simpleicons.org/icons/streamlit.svg + + +[file-system]: https://en.wikipedia.org/wiki/File_system +[github]: https://github.com/ +[gitlab]: https://gitlab.com/ +[bitbucket]: https://bitbucket.org/ + + +[anthropic]: https://docs.anthropic.com/en/home +[gemini]: https://ai.google.dev/tutorials/python_quickstart +[ollama]: https://github.com/ollama/ollama +[openai]: https://platform.openai.com/docs/quickstart/account-setup: + + + +[project-overview]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-overview/introduction.png?raw=true +[features-table]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/features/features.png?raw=true +[project-structure]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-structure/project-structure.png?raw=true +[project-index]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-structure/project-index.png?raw=true +[installation-steps]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/getting-started/installation-steps.png?raw=true +[usage-guides]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/getting-started/usage-guides.png?raw=true +[community-and-support]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/community/community-and-support.png?raw=true +[contributing-guidelines]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/community/contributing-guidelines.png?raw=true +[readmeai.parsers]: https://github.com/eli64s/readme-ai/tree/main/readmeai/parsers +[tree.py]: https://github.com/eli64s/readme-ai/blob/main/readmeai/generators/tree.py +[prompts.toml]: https://github.com/eli64s/readme-ai/blob/main/readmeai/config/settings/prompts.toml + + +[readmeai]: https://github.com/eli64s/readme-ai +[pyflink-poc]: https://github.com/eli64s/pyflink-poc +[readmeai-streamlit]: https://github.com/eli64s/readme-ai-streamlit +[github-readme-quotes]: https://github.com/PiyushSuthar/github-readme-quotes +[docker-gs-ping]: https://github.com/olliefr/docker-gs-ping +[async-ml-inference]: https://github.com/FerrariDG/async-ml-inference +[minimal-todo]: https://github.com/avjinder/Minimal-Todo +[buenavista]: https://github.com/jwills/buenavista +[android-client]: https://github.com/rumaan/file.io-Android-Client +[litellm]: https://github.com/BerriAI/litellm + + +[README-Python.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-ai.md +[README-Flink.md]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/modern.md +[README-Streamlit.md]: https://github.com/eli64s/readme-ai/blob/main/examples/banners/svg-banner.md +[README-Vercel.md]: https://github.com/eli64s/readme-ai/blob/main/examples/logos/dalle.md +[README-DockerGo.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-docker-go.md +[README-FastAPI.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-fastapi-redis.md +[README-Java.md]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/compact.md +[README-PostgreSQL.md]: https://github.com/eli64s/readme-ai/blob/main/examples/headers/classic.md +[README-Kotlin.md]: https://github.com/eli64s/readme-ai/blob/main/examples/readme-kotlin.md +[README-Offline.md]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md + + +[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples +[show-and-tell]: https://github.com/eli64s/readme-ai/discussions/categories/show-and-tell + +--- + + +[license]: https://github.com/eli64s/readme-ai/blob/main/LICENSE +[readme-ai]: https://github.com/eli64s/readme-ai +[to-the-top]: https://img.shields.io/badge/Return-5D4ED3?style=flat&logo=ReadMe&logoColor=white diff --git a/docs/examples/output-h2/mkdocs.yml b/docs/examples/split-sections-h2/mkdocs.yml similarity index 84% rename from docs/examples/output-h2/mkdocs.yml rename to docs/examples/split-sections-h2/mkdocs.yml index 60e332f..21e2395 100644 --- a/docs/examples/output-h2/mkdocs.yml +++ b/docs/examples/split-sections-h2/mkdocs.yml @@ -1,6 +1,6 @@ -site_name: 'MkDocs Site: output-h2' +site_name: MkDocs Static Site Documentation -docs_dir: .splitme-ai/output-h2 +docs_dir: docs/examples/split-sections-h2 nav: - Introduction: introduction.md @@ -9,7 +9,7 @@ nav: - Configuration: configuration.md - Contributing: contributing.md - Demo: demo.md -- Examples: examples.md +- Example Gallery: example-gallery.md - Features: features.md - License: license.md - Quick Links: quick-links.md diff --git a/docs/examples/split-sections-h2/quick-links.md b/docs/examples/split-sections-h2/quick-links.md new file mode 100644 index 0000000..44b2e34 --- /dev/null +++ b/docs/examples/split-sections-h2/quick-links.md @@ -0,0 +1,19 @@ +## Quick Links + +- [Intro](#introduction) +- [Demo](#demo) +- [Features](#features) +- [Quickstart](#getting-started) +- [Configuration](#configuration) +- [Example Gallery](#example-gallery) +- [Contributing Guidelines](#contributing) + +> [!IMPORTANT] +> Explore the [Official Documentation][docs] for a complete list of features, customization options, and examples. + +line break + +--- + + +[docs]: https://eli64s.github.io/readme-ai diff --git a/docs/examples/output-h2/roadmap.md b/docs/examples/split-sections-h2/roadmap.md similarity index 62% rename from docs/examples/output-h2/roadmap.md rename to docs/examples/split-sections-h2/roadmap.md index d534e15..fe0c3e5 100644 --- a/docs/examples/output-h2/roadmap.md +++ b/docs/examples/split-sections-h2/roadmap.md @@ -1,6 +1,7 @@ ## Roadmap -* [ ] Release `readmeai 1.0.0` with enhanced documentation management features. +* [ ] Release `readmeai 1.0.0` with robust documentation creation and maintenance capabilities. +* [ ] Extend template support for various `project types` and `programming languages`. * [ ] Develop `Vscode Extension` to generate README files directly in the editor. * [ ] Develop `GitHub Actions` to automate documentation updates. * [ ] Add `badge packs` to provide additional badge styles and options. diff --git a/docs/examples/output-h3/additional-optional-dependencies.md b/docs/examples/split-sections-h3/additional-optional-dependencies.md similarity index 100% rename from docs/examples/output-h3/additional-optional-dependencies.md rename to docs/examples/split-sections-h3/additional-optional-dependencies.md diff --git a/docs/examples/split-sections-h3/community-contribution.md b/docs/examples/split-sections-h3/community-contribution.md new file mode 100644 index 0000000..6ea5f7c --- /dev/null +++ b/docs/examples/split-sections-h3/community-contribution.md @@ -0,0 +1,19 @@ +### Community Contribution + +#### Share Your README Files + +We invite developers to share their generated README files in our [Show & Tell][show-and-tell] discussion category. Your contributions help: + +- Showcase diverse documentation styles +- Provide real-world examples +- Help improve the ReadmeAI tool + +Find additional README examples in our [examples directory][examples-directory] on GitHub. + +line break + +--- + + +[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples +[show-and-tell]: https://github.com/eli64s/readme-ai/discussions/categories/show-and-tell diff --git a/docs/examples/split-sections-h3/customize-your-readme.md b/docs/examples/split-sections-h3/customize-your-readme.md new file mode 100644 index 0000000..8a0e63f --- /dev/null +++ b/docs/examples/split-sections-h3/customize-your-readme.md @@ -0,0 +1,205 @@ +### Customize Your README + +Let's begin by exploring various customization options and styles supported by ReadmeAI: + +
+
Header Styles
+ + + + + + + + + + + + + +
+ Classic Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/eli64s/readme-ai-streamlit \
+           --logo custom \
+           --badge-color FF4B4B \
+           --badge-style flat-square \
+           --header-style classic
+          
+        
+
+ Modern Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/olliefr/docker-gs-ping \
+           --badge-color 00ADD8 \
+           --badge-style for-the-badge \
+           --header-style modern \
+           --navigation-style roman
+          
+        
+
+ Compact Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/rumaan/file.io-Android-Client \
+           --badge-style plastic \
+           --badge-color blueviolet \
+           --logo PURPLE \
+           --header-style COMPACT \
+           --navigation-style NUMBER \
+           --emojis solar
+          
+        
+
+ + +

Banner Styles

+ + + + + + + + +
+ Console Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/emcf/thepipe \
+           --badge-style flat-square \
+           --badge-color 8a2be2 \
+           --header-style console \
+           --navigation-style accordion \
+           --emojis water
+          
+        
+
+ SVG Banner +

CLI Command:

+
+          $ readmeai --repository https://github.com/FerrariDG/async-ml-inference \
+           --badge-style plastic \
+           --badge-color 43a047 \
+           --header-style BANNER
+          
+        
+
+ + +

And More!

+ + + + + + + + +
+ Project Overview +

CLI Command:

+
+          $ readmeai --repository 'https://github.com/eli64sreadme-ai-streamlit' \
+           --badge-style FLAT-SQUARE \
+           --badge-color E92063 \
+           --header-style COMPACT \
+           --navigation-style ACCORDION \
+           --emojis RAINBOW \
+           --logo ICE
+          
+        
+
+ Custom Logo +

CLI Command:

+
+          $ readmeai --repository https://github.com/jwills/buenavista \
+           --align LEFT \
+           --badge-style FLAT-SQUARE \
+           --logo CUSTOM
+          
+        
+
+ + + +
+ +--- diff --git a/docs/examples/split-sections-h3/generated-sections-content.md b/docs/examples/split-sections-h3/generated-sections-content.md new file mode 100644 index 0000000..8d58312 --- /dev/null +++ b/docs/examples/split-sections-h3/generated-sections-content.md @@ -0,0 +1,48 @@ +### Generated Sections & Content + +
꩜ Expand to view more!
+ +|

Project Introduction

  • This section captures your project's essence and value proposition.
  • The prompt template used to generate this section can be viewed [here][prompts.toml].
| +| :--- | +| ![][project-overview] | + +|

Features Table

  • Detailed feature breakdown and technical capabilities.
  • The prompt template used to generate this section can be viewed [here][prompts.toml].
| +| :--- | +| ![][features-table] | + +|

Project Structure

  • Visual representation of your project's directory structure.
  • The tree is generated using [pure Python][tree.py] and embedded in a code block.
| +| :--- | +| ![][project-structure] | +|

Project Index

  • Summarizes key modules of the project, which are also used as context for downstream [prompts.toml][prompts.toml].
| +| ![][project-index] | + +|

Getting Started Guides

  • Dependencies and system requirements are extracted from the codebase during preprocessing.
  • The [parsers][readmeai.parsers] handle most of the heavy lifting here.
| +| :--- | +| ![][installation-steps] | +|

Installation, Usage, & Testing

  • Setup instructions and usage guides are automatically created based on data extracted from the codebase.
| +| ![][usage-guides] | + +|

Community & Support

  • Development roadmap, contribution guidelines, license information, and community resources.
  • A return button is also included for easy navigation.
| +| :--- | +| ![][community-and-support] | +|

Contribution Guides

  • Instructions for contributing to the project, including resource links and a basic contribution guide.
  • Graph of contributors is also included for open-source projects.
| +| ![][contributing-guidelines] | + +
+ +line break + +--- + + +[community-and-support]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/community/community-and-support.png?raw=true +[contributing-guidelines]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/community/contributing-guidelines.png?raw=true +[features-table]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/features/features.png?raw=true +[installation-steps]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/getting-started/installation-steps.png?raw=true +[project-index]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-structure/project-index.png?raw=true +[project-overview]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-overview/introduction.png?raw=true +[project-structure]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/project-structure/project-structure.png?raw=true +[prompts.toml]: https://github.com/eli64s/readme-ai/blob/main/readmeai/config/settings/prompts.toml +[readmeai.parsers]: https://github.com/eli64s/readme-ai/tree/main/readmeai/parsers +[tree.py]: https://github.com/eli64s/readme-ai/blob/main/readmeai/generators/tree.py +[usage-guides]: https://github.com/eli64s/readme-ai/blob/main/docs/docs/assets/img/getting-started/usage-guides.png?raw=true diff --git a/docs/examples/output-h3/installation.md b/docs/examples/split-sections-h3/installation.md similarity index 58% rename from docs/examples/output-h3/installation.md rename to docs/examples/split-sections-h3/installation.md index 74d6378..6e4a0f5 100644 --- a/docs/examples/output-h3/installation.md +++ b/docs/examples/split-sections-h3/installation.md @@ -3,8 +3,8 @@ ReadmeAI is available on [PyPI][pypi-link] as readmeai and can be installed as follows: - -#### ![pip][python-svg]{ width="2%" } Pip + +####  Pip Install with pip (recommended for most users): @@ -13,8 +13,8 @@ Install with pip (recommended for most users): ``` - -#### ![pipx][pipx-svg]{ width="2%" } Pipx + +####  Pipx With `pipx`, readmeai will be installed in an isolated environment: @@ -22,7 +22,8 @@ With `pipx`, readmeai will be installed in an isolated environment: ❯ pipx install readmeai ``` -#### ![uv][uv-svg]{ width="2%" } Uv + +####  Uv The fastest way to install readmeai is with [uv][uv-link]: @@ -31,8 +32,8 @@ The fastest way to install readmeai is with [uv][uv-link]: ``` - -#### ![docker][docker-svg]{ width="2%" } Docker + +####  Docker To run `readmeai` in a containerized environment, pull the latest image from [Docker Hub][dockerhub-link]: @@ -40,7 +41,8 @@ To run `readmeai` in a containerized environment, pull the latest image from [Do ❯ docker pull zeroxeli/readme-ai:latest ``` -#### ![build-from-source][git-svg]{ width="2%" } From source + +####  From source
Click to build readmeai from source @@ -64,7 +66,8 @@ To run `readmeai` in a containerized environment, pull the latest image from [Do Alternatively, use the [setup script][setup-script] to install dependencies: -#### ![bash][bash-svg]{ width="2%" } Bash + +#####  Bash 1. **Run the setup script:** @@ -74,7 +77,8 @@ Alternatively, use the [setup script][setup-script] to install dependencies: Or, use `poetry` to build and install project dependencies: -#### ![poetry][poetry-svg]{ width="2%" } Poetry + +#####  Poetry 1. **Install dependencies with poetry:** @@ -88,16 +92,16 @@ Or, use `poetry` to build and install project dependencies: --- -[bash-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/gnubash.svg +[bash-svg]: https://simpleicons.org/icons/gnubash.svg [docker-link]: https://hub.docker.com/r/zeroxeli/readme-ai [docker-shield]: https://img.shields.io/badge/Docker-2496ED.svg?style=flat&logo=Docker&logoColor=white -[docker-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/3052baaca03db99d00808acfec43a44e81ecbf7f/docs/docs/assets/svg/docker.svg -[git-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/git.svg +[docker-svg]: https://simpleicons.org/icons/docker.svg +[git-svg]: https://simpleicons.org/icons/git.svg [pipx-link]: https://pipx.pypa.io/stable/ [pipx-shield]: https://img.shields.io/badge/pipx-2CFFAA.svg?style=flat&logo=pipx&logoColor=black -[pipx-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/pipx.svg -[poetry-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/poetry.svg +[pipx-svg]: https://simpleicons.org/icons/pipx.svg +[poetry-svg]: https://simpleicons.org/icons/poetry.svg [pypi-link]: https://pypi.org/project/readmeai/ [pypi-shield]: https://img.shields.io/badge/PyPI-3775A9.svg?style=flat&logo=PyPI&logoColor=white -[python-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/python.svg -[uv-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/astral.svg +[python-svg]: https://simpleicons.org/icons/python.svg +[uv-svg]: https://simpleicons.org/icons/astral.svg diff --git a/docs/examples/output-h3/prerequisites.md b/docs/examples/split-sections-h3/prerequisites.md similarity index 91% rename from docs/examples/output-h3/prerequisites.md rename to docs/examples/split-sections-h3/prerequisites.md index 8b334ea..9838b12 100644 --- a/docs/examples/output-h3/prerequisites.md +++ b/docs/examples/split-sections-h3/prerequisites.md @@ -1,6 +1,6 @@ ### Prerequisites -ReadmeAI requires Python 3.9 or higher, plus one installation method of your choice: +ReadmeAI requires Python 3.9 or higher, and one of the following installation methods: | Requirement | Details | |--------------------------------------|----------------------------------| diff --git a/docs/examples/split-sections-h3/supported-llm-api-services.md b/docs/examples/split-sections-h3/supported-llm-api-services.md new file mode 100644 index 0000000..bfec9f0 --- /dev/null +++ b/docs/examples/split-sections-h3/supported-llm-api-services.md @@ -0,0 +1,20 @@ +### Supported LLM API Services + +ReadmeAI is model agnostic, with support for the following LLM API services: + +| Provider | Best For | Details | +|-----------------------------------|-----------------|--------------------------| +| [OpenAI][openai] | General use | Industry-leading models | +| [Anthropic][anthropic] | Advanced tasks | Claude language models | +| [Google Gemini][gemini] | Multimodal AI | Latest Google technology | +| [Ollama][ollama] | Open source | No API key needed | +| [Offline Mode][README-Offline.md] | Local operation | No internet required | + +--- + + +[README-Offline.md]: https://github.com/eli64s/readme-ai/blob/main/examples/offline-mode/readme-litellm.md +[anthropic]: https://docs.anthropic.com/en/home +[gemini]: https://ai.google.dev/tutorials/python_quickstart +[ollama]: https://github.com/ollama/ollama +[openai]: https://platform.openai.com/docs/quickstart/account-setup: diff --git a/docs/examples/output-h3/supported-repository-platforms.md b/docs/examples/split-sections-h3/supported-repository-platforms.md similarity index 84% rename from docs/examples/output-h3/supported-repository-platforms.md rename to docs/examples/split-sections-h3/supported-repository-platforms.md index c8c4e6b..6c703e2 100644 --- a/docs/examples/output-h3/supported-repository-platforms.md +++ b/docs/examples/split-sections-h3/supported-repository-platforms.md @@ -1,6 +1,6 @@ ### Supported Repository Platforms -ReadmeAI needs access to your repository to generate a README file. Current supported platforms include: +To generate a README file, provide the source repository. ReadmeAI supports these platforms: | Platform | Details | |----------------------------|---------------------------| diff --git a/docs/examples/output-h3/testing.md b/docs/examples/split-sections-h3/testing.md similarity index 77% rename from docs/examples/output-h3/testing.md rename to docs/examples/split-sections-h3/testing.md index c24eae5..9767065 100644 --- a/docs/examples/output-h3/testing.md +++ b/docs/examples/split-sections-h3/testing.md @@ -7,7 +7,7 @@ The [pytest][pytest-link] and [nox][nox-link] frameworks are used for developmen Install the dependencies with uv: ```sh -❯ uv pip install -r pyproject.toml --all-extras +❯ uv pip install --dev --group test --all-extras ``` Run the unit test suite using Pytest: @@ -25,7 +25,7 @@ Using nox, test the app against Python versions `3.9`, `3.10`, `3.11`, and `3.12 > [!TIP] > Nox is an automation tool for testing applications in multiple environments. This helps ensure your project is compatible with across Python versions and environments. -line break +line break --- diff --git a/docs/examples/output-h3/usage.md b/docs/examples/split-sections-h3/usage.md similarity index 78% rename from docs/examples/output-h3/usage.md rename to docs/examples/split-sections-h3/usage.md index 4548c79..53e3475 100644 --- a/docs/examples/output-h3/usage.md +++ b/docs/examples/split-sections-h3/usage.md @@ -118,7 +118,8 @@ ReadmeAI supports `offline mode`, allowing you to generate README files without ❯ readmeai --api offline -o readmeai-offline.md -r https://github.com/eli64s/readme-ai ``` -#### ![docker][docker-svg]{ width="2%" } Docker + +####  Docker Run the `readmeai` CLI in a Docker container: @@ -130,22 +131,25 @@ Run the `readmeai` CLI in a Docker container: --api openai ``` -#### ![streamlit][streamlit-svg]{ width="2%" } Streamlit + +####  Streamlit Try readme-ai directly in your browser on Streamlit Cloud, no installation required. -[][streamlit] +[](https://readme-ai.streamlit.app/) See the [readme-ai-streamlit][readme-ai-streamlit] repository on GitHub for more details about the application. > [!WARNING] > The readme-ai Streamlit web app may not always be up-to-date with the latest features. Please use the command-line interface (CLI) for the most recent functionality. -#### ![build-from-source][git-svg]{ width="2%" } From source + +####  From source
Click to run readmeai from source -#### ![bash][bash-svg]{ width="2%" } Bash + +#####  Bash If you installed the project from source with the bash script, run the following command: @@ -161,7 +165,8 @@ If you installed the project from source with the bash script, run the following ❯ python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai ``` -#### ![poetry][poetry-svg]{ width="2%" } Poetry + +#####  Poetry 1. Activate the virtual environment: @@ -177,16 +182,15 @@ If you installed the project from source with the bash script, run the following
-line break +line break --- -[bash-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/gnubash.svg -[docker-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/3052baaca03db99d00808acfec43a44e81ecbf7f/docs/docs/assets/svg/docker.svg -[git-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/git.svg +[bash-svg]: https://simpleicons.org/icons/gnubash.svg +[docker-svg]: https://simpleicons.org/icons/docker.svg +[git-svg]: https://simpleicons.org/icons/git.svg [ollama]: https://github.com/ollama/ollama -[poetry-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/poetry.svg +[poetry-svg]: https://simpleicons.org/icons/poetry.svg [readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit -[streamlit]: https://github.com/eli64s/readme-ai-streamlit -[streamlit-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/streamlit.svg +[streamlit-svg]: https://simpleicons.org/icons/streamlit.svg diff --git a/docs/examples/output-h4/docker-docker.md b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsdockersvg-docker.md similarity index 55% rename from docs/examples/output-h4/docker-docker.md rename to docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsdockersvg-docker.md index 3c3e511..151e36c 100644 --- a/docs/examples/output-h4/docker-docker.md +++ b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsdockersvg-docker.md @@ -1,4 +1,4 @@ -#### ![docker][docker-svg]{ width="2%" } Docker +####  Docker Run the `readmeai` CLI in a Docker container: @@ -10,7 +10,9 @@ Run the `readmeai` CLI in a Docker container: --api openai ``` + + --- -[docker-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/3052baaca03db99d00808acfec43a44e81ecbf7f/docs/docs/assets/svg/docker.svg +[streamlit-svg]: https://simpleicons.org/icons/streamlit.svg diff --git a/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsgitsvg-from-source.md b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsgitsvg-from-source.md new file mode 100644 index 0000000..d2c99f5 --- /dev/null +++ b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsgitsvg-from-source.md @@ -0,0 +1,45 @@ +####  From source + +
Click to run readmeai from source + + +#####  Bash + +If you installed the project from source with the bash script, run the following command: + +1. Activate the virtual environment: + + ```sh + ❯ conda activate readmeai + ``` + +2. Run the CLI: + + ```sh + ❯ python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai + ``` + + +#####  Poetry + +1. Activate the virtual environment: + + ```sh + ❯ poetry shell + ``` + +2. Run the CLI: + + ```sh + ❯ poetry run python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai + ``` + +
+ +line break + +--- + + +[bash-svg]: https://simpleicons.org/icons/gnubash.svg +[poetry-svg]: https://simpleicons.org/icons/poetry.svg diff --git a/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconspipxsvg-pipx.md b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconspipxsvg-pipx.md new file mode 100644 index 0000000..a8cab5a --- /dev/null +++ b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconspipxsvg-pipx.md @@ -0,0 +1,14 @@ +####  Pipx + +With `pipx`, readmeai will be installed in an isolated environment: + +```sh +❯ pipx install readmeai +``` + + + +--- + + +[uv-svg]: https://simpleicons.org/icons/astral.svg diff --git a/docs/examples/output-h4/pip-pip.md b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconspythonsvg-pip.md similarity index 62% rename from docs/examples/output-h4/pip-pip.md rename to docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconspythonsvg-pip.md index 7ac3277..20b9ac1 100644 --- a/docs/examples/output-h4/pip-pip.md +++ b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconspythonsvg-pip.md @@ -1,4 +1,4 @@ -#### ![pip][python-svg]{ width="2%" } Pip +####  Pip Install with pip (recommended for most users): @@ -7,10 +7,11 @@ Install with pip (recommended for most users): ``` + --- [pipx-link]: https://pipx.pypa.io/stable/ [pipx-shield]: https://img.shields.io/badge/pipx-2CFFAA.svg?style=flat&logo=pipx&logoColor=black -[python-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/python.svg +[pipx-svg]: https://simpleicons.org/icons/pipx.svg diff --git a/docs/examples/output-h4/streamlit-streamlit.md b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsstreamlitsvg-streamlit.md similarity index 62% rename from docs/examples/output-h4/streamlit-streamlit.md rename to docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsstreamlitsvg-streamlit.md index 0a9785f..d3f8b27 100644 --- a/docs/examples/output-h4/streamlit-streamlit.md +++ b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsstreamlitsvg-streamlit.md @@ -1,17 +1,18 @@ -#### ![streamlit][streamlit-svg]{ width="2%" } Streamlit +####  Streamlit Try readme-ai directly in your browser on Streamlit Cloud, no installation required. -[][streamlit] +[](https://readme-ai.streamlit.app/) See the [readme-ai-streamlit][readme-ai-streamlit] repository on GitHub for more details about the application. > [!WARNING] > The readme-ai Streamlit web app may not always be up-to-date with the latest features. Please use the command-line interface (CLI) for the most recent functionality. + + --- +[git-svg]: https://simpleicons.org/icons/git.svg [readme-ai-streamlit]: https://github.com/eli64s/readme-ai-streamlit -[streamlit]: https://github.com/eli64s/readme-ai-streamlit -[streamlit-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/streamlit.svg diff --git a/docs/examples/output-h4/uv-uv.md b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsuvsvg-uv.md similarity index 65% rename from docs/examples/output-h4/uv-uv.md rename to docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsuvsvg-uv.md index bece3d7..9c03714 100644 --- a/docs/examples/output-h4/uv-uv.md +++ b/docs/examples/split-sections-h4/img-width2-srchttpssimpleiconsorgiconsuvsvg-uv.md @@ -1,4 +1,4 @@ -#### ![uv][uv-svg]{ width="2%" } Uv +####  Uv The fastest way to install readmeai is with [uv][uv-link]: @@ -7,10 +7,11 @@ The fastest way to install readmeai is with [uv][uv-link]: ``` + --- [docker-link]: https://hub.docker.com/r/zeroxeli/readme-ai [docker-shield]: https://img.shields.io/badge/Docker-2496ED.svg?style=flat&logo=Docker&logoColor=white -[uv-svg]: https://raw.githubusercontent.com/eli64s/readme-ai/5ba3f704de2795e32f9fdb67e350caca87975a66/docs/docs/assets/svg/astral.svg +[docker-svg]: https://simpleicons.org/icons/docker.svg diff --git a/docs/examples/output-h4/set-your-api-key.md b/docs/examples/split-sections-h4/set-your-api-key.md similarity index 100% rename from docs/examples/output-h4/set-your-api-key.md rename to docs/examples/split-sections-h4/set-your-api-key.md diff --git a/docs/examples/split-sections-h4/share-your-readme-files.md b/docs/examples/split-sections-h4/share-your-readme-files.md new file mode 100644 index 0000000..6601b09 --- /dev/null +++ b/docs/examples/split-sections-h4/share-your-readme-files.md @@ -0,0 +1,17 @@ +#### Share Your README Files + +We invite developers to share their generated README files in our [Show & Tell][show-and-tell] discussion category. Your contributions help: + +- Showcase diverse documentation styles +- Provide real-world examples +- Help improve the ReadmeAI tool + +Find additional README examples in our [examples directory][examples-directory] on GitHub. + +line break + +--- + + +[examples-directory]: https://github.com/eli64s/readme-ai/tree/main/examples +[show-and-tell]: https://github.com/eli64s/readme-ai/discussions/categories/show-and-tell diff --git a/docs/examples/output-h4/using-the-cli.md b/docs/examples/split-sections-h4/using-the-cli.md similarity index 93% rename from docs/examples/output-h4/using-the-cli.md rename to docs/examples/split-sections-h4/using-the-cli.md index 1f6d094..e24151e 100644 --- a/docs/examples/output-h4/using-the-cli.md +++ b/docs/examples/split-sections-h4/using-the-cli.md @@ -63,4 +63,9 @@ ReadmeAI supports `offline mode`, allowing you to generate README files without ❯ readmeai --api offline -o readmeai-offline.md -r https://github.com/eli64s/readme-ai ``` + + --- + + +[docker-svg]: https://simpleicons.org/icons/docker.svg diff --git a/docs/features/reflinks.md b/docs/features/reflinks.md deleted file mode 100644 index 2967119..0000000 --- a/docs/features/reflinks.md +++ /dev/null @@ -1,27 +0,0 @@ -# Reference-style links - -Reference-style links are a way to keep the text of your Markdown file clean and readable. They are especially useful for long URLs or when you want to reuse the same link in multiple places. - - -The converter will: -1. Find all markdown links in the file -2. Convert them to reference-style links -3. Add a reference section at the bottom of the file -4. Handle both regular links and image links -5. Generate unique reference IDs -6. Preserve the original content structure - -## Example - -1. Convert links in a file (modifies in place) - - ```sh - splitme-ai --reflinks.input README.md - ``` -2. Convert links and save to a new file - - ```sh - splitme-ai --reflinks.input README.md --reflinks.output README-with-refs.md - ``` - ---- diff --git a/docs/index.md b/docs/index.md index 19727b0..a05e5cf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,8 +2,8 @@
- splitme-ai + splitme

Markdown Splitter: Modular Docs, Maximum Flexibility @@ -15,15 +15,15 @@

1. In the terminal, install package from PyPI: -

pip install -U splitme-ai
+
pip install -U splitme

2. Once installed, try it out:

-
splitme-ai --help
+
splitme --help

3. Generate a README file for your project:

-
splitme-ai 
+
splitme 

diff --git a/mkdocs.yml b/mkdocs.yml index 04d2600..36a9e82 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,13 +1,13 @@ -# -- SPLITME-AI Mkdocs Static Site Configuration ---------------------------- +# -- splitme Mkdocs Static Site Configuration ---------------------------- -site_name: splitme-ai +site_name: splitme site_description: "Markdown splitter for modular docs and flexible content." -site_author: "splitme-ai" -repo_name: eli64s/splitme-ai -repo_url: https://github.com/eli64s/splitme-ai +site_author: "splitme" +repo_name: eli64s/splitme +repo_url: https://github.com/eli64s/splitme edit_uri: edit/main/docs/ docs_dir: "docs/" -copyright: "© 2024 splitme-ai" +copyright: "© 2024-2025 splitme" theme: name: material @@ -21,9 +21,22 @@ theme: accent: "white" markdown_extensions: -- admonition -- pymdownx.details -- pymdownx.superfences + - admonition + - pymdownx.details + - pymdownx.superfences + +nav: + - Home: index.md + - Features: + - Split Markdown: features/split-markdown.md + - Merge Markdown: features/merge-markdown.md + - Convert Markdown: features/convert-markdown.md + - Installation: installation.md + - Usage: usage.md + - Configuration: configuration.md + - Contributing: contributing.md + - Changelog: changelog.md + - License: license.md plugins: -- search + - search diff --git a/pyproject.toml b/pyproject.toml index f628748..ca2a389 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,9 +3,9 @@ build-backend = 'hatchling.build' requires = [ "hatch-fancy-pypi-readme", "hatchling" ] [project] -name = "splitme-ai" -version = "0.1.10" -description = "Break down docs, build up knowledge." +name = "splitme" +version = "0.1.11" +description = "⌖ Markdown tools for modular docs." dynamic = ["readme"] keywords = [ "ai", @@ -24,7 +24,7 @@ keywords = [ ] license = "MIT" authors = [ { name = "Eli Salamie", email = "egsalamie@gmail.com" } ] -requires-python = ">=3.9, <=3.13" +requires-python = ">=3.9, <=3.14" classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.9", @@ -32,13 +32,25 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Topic :: Software Development :: Documentation", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Libraries :: Python Modules", + "Typing :: Typed", + "Framework :: Pytest", + "Framework :: Pydantic", ] dependencies = [ - "aiofiles>=24.1.0", + "mistletoe>=1.4.0", "pydantic>=2.10.3", "pydantic-settings>=2.6.1", "pyyaml>=6.0.2", "requests>=2.32.3", + "rich>=13.9.4", "toml>=0.10.2 ; python_full_version < '3.11'", ] @@ -49,18 +61,24 @@ optional-dependencies.docs = [ "mkdocs>=1.6.1", "mkdocs-material>=9.5.47", ] -urls.Homepage = 'https://github.com/eli64s/splitme-ai' -scripts.splitme-ai = "splitme_ai.core:main" +urls.Homepage = 'https://github.com/eli64s/splitme' +scripts.splitme = "splitme.__main__:main" [dependency-groups] dev = [ + "commonmark>=0.9.1", "hatch>=1.13", + "ipykernel>=6.29.5", + "keybert>=0.8.5", + "markdown-it-py>=3.0.0", + "mdit-py-plugins>=0.4.2", ] test = [ "coverage[toml]>=7.6.9", "pytest>=8.3.4", "pytest-asyncio>=0.25", "pytest-cov>=6", + "pytest-mock>=3.14.0", "pytest-pretty>=1.2", "pytest-randomly>=3.16", "pytest-sugar>=1", @@ -85,7 +103,7 @@ include = [ ] [tool.hatch.build.targets.wheel] -packages = [ "src/splitme_ai" ] +packages = [ "src/splitme" ] [tool.hatch.build.targets.sdist] include = [ @@ -100,7 +118,7 @@ include = [ ] [tool.hatch.version] -path = 'src/splitme_ai/__init__.py' +path = 'src/splitme/__init__.py' [tool.hatch.metadata] allow-direct-references = true @@ -108,10 +126,10 @@ allow-direct-references = true [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = 'text/markdown' substitutions = [ - { pattern = '(\s+)#(\d+)', replacement = '\1[#\2](https://github.com/eli64s/splitme-ai/issues/\2)' }, + { pattern = '(\s+)#(\d+)', replacement = '\1[#\2](https://github.com/eli64s/splitme/issues/\2)' }, { pattern = '(\s+)@([\w\-]+)', replacement = '\1[@\2](https://github.com/\2)' }, # replace relative links with absolute links - { pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)', replacement = '[\1](https://github.com/eli64s/splitme-ai/tree/main/\g<2>)'}, + { pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)', replacement = '[\1](https://github.com/eli64s/splitme/tree/main/\g<2>)'}, ] [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] @@ -123,7 +141,7 @@ addopts = [ "-rfEsxX", "--tb=short", "--durations=3", - "--cov=src/splitme_ai", + "--cov=splitme", "--cov-branch", "--cov-fail-under=0", "--cov-report=term-missing:skip-covered", @@ -162,7 +180,7 @@ omit = [ "**/__init__.py", "noxfile.py", ] -source = ["splitme_ai"] +source = ["splitme"] [tool.coverage.json] output = "tests/.reports/coverage.json" @@ -173,7 +191,7 @@ typeCheckingMode = "strict" reportMissingTypeStubs = false reportUnnecessaryIsInstance = false reportUnnecessaryTypeIgnoreComment = true -include = [ "splitme_ai", "tests" ] +include = [ "splitme", "tests" ] venvPath = ".venv" executionEnvironments = [ { root = "tests", reportUnusedFunction = false }, diff --git a/src/splitme/__init__.py b/src/splitme/__init__.py new file mode 100644 index 0000000..8ef91c3 --- /dev/null +++ b/src/splitme/__init__.py @@ -0,0 +1,34 @@ +from importlib.metadata import version + +from splitme.config import Config as Config +from splitme.core import MarkdownSplitter +from splitme.errors import ( + FileOperationError, + FileReadError, + FileWriteError, + InvalidPathError, + ParseError, + SplitmeBaseError, +) +from splitme.tools.markdown import link_validator, reflink_converter, reflink_extractor +from splitme.utils.file_handler import FileHandler + +from .cli import main as cli_main + +__version__ = version("splitme") +__all__: list[str] = [ + "Config", + "FileHandler", + "FileOperationError", + "FileReadError", + "FileWriteError", + "InvalidPathError", + "MarkdownSplitter", + "ParseError", + "SplitmeBaseError", + "__version__", + "cli_main", + "link_validator", + "reflink_converter", + "reflink_extractor", +] diff --git a/src/splitme/__main__.py b/src/splitme/__main__.py new file mode 100644 index 0000000..9ae637f --- /dev/null +++ b/src/splitme/__main__.py @@ -0,0 +1,4 @@ +from .cli import main + +if __name__ == "__main__": + main() diff --git a/src/splitme/cli.py b/src/splitme/cli.py new file mode 100755 index 0000000..f8449f1 --- /dev/null +++ b/src/splitme/cli.py @@ -0,0 +1,352 @@ +"""Command-line interface implementated with Pydantic Settings Management.""" + +from __future__ import annotations + +from pathlib import Path + +import yaml +from pydantic import AliasChoices, BaseModel, Field, field_validator +from pydantic_settings import BaseSettings, SettingsConfigDict +from rich import print +from rich.console import Console +from rich.table import Table +from rich.theme import Theme + +from splitme.generators.mkdocs.config import MkDocsConfig +from splitme.logger import Logger +from splitme.tools.markdown.link_validator import LinkValidator +from splitme.tools.markdown.reflink_converter import ReferenceLinkConverter +from splitme.utils.file_handler import FileHandler +from splitme.validators import ExistingFilePath, convert_to_path + +_logger = Logger(__name__) + + +class ConfigCommand(BaseModel): + """ + CLI command for managing configurations via YAML files. + """ + + config_path: Path = Field( + default=Path("splitme.yml"), + description="Path to the configuration file.", + validation_alias=AliasChoices("p", "path"), + ) + generate: bool = Field( + default=False, + description="Generate a default configuration file.", + validation_alias=AliasChoices("g", "generate"), + ) + show: bool = Field( + default=False, + description="Display the current configuration settings.", + validation_alias=AliasChoices("s", "show"), + ) + + validate_fields = field_validator("config_path")(convert_to_path) + + def cli_cmd(self) -> None: + """Execute the configuration command.""" + if self.generate: + self.generate_config() + + if self.show: + self.show_config() + + def generate_config(self) -> None: + """Generates a default configuration file.""" + _logger.info(f"Generating default configuration file at {self.config_path}") + settings = SplitmeApp() + settings_dict = settings.model_dump(mode="json") + + with self.config_path.open("w", encoding="utf-8") as file: + yaml.dump( + settings_dict, + file, + default_flow_style=False, + sort_keys=False, + ) + _logger.info(f"Splitme configuration file generated: {self.config_path}") + + def show_config(self) -> None: + """Displays the current configuration settings.""" + if self.config_path.exists(): + _logger.info(f"Reading configuration file: {self.config_path}") + try: + with self.config_path.open(encoding="utf-8") as file: + settings = yaml.safe_load(file) + except yaml.YAMLError as e: + _logger.error(f"Error reading configuration file: {e}") + return + + self.display_settings(settings) + else: + _logger.error( + f"No configuration file found at {self.config_path}. " + "Use '--generate' to create one." + ) + + def display_settings(self, settings: dict[str, str]) -> None: + """Displays settings using Rich.""" + theme = Theme({ + "title": "bold yellow", + "header": "bold green", + "key": "cyan", + "value": "magenta", + }) + console = Console(theme=theme) + console.print("[title]Configuration Settings[/title]\n") + table = Table(show_header=True, header_style="header") + table.add_column("Key", style="key", no_wrap=True) + table.add_column("Value", style="value") + for key, value in settings.items(): + table.add_row(str(key), str(value)) + console.print(table) + + +class CheckLinksCommand(BaseModel): + """ + Validate all links in a markdown file. + """ + + input_file: ExistingFilePath = Field( + ..., + description="Path to the markdown file.", + validation_alias=AliasChoices("i", "input"), + ) + report_path: Path = Field( + default=Path(".splitme/link_health.txt"), + description="Path to save the report.", + validation_alias=AliasChoices("rp", "report-path"), + ) + max_workers: int = Field( + default=5, + ge=1, + le=10, + description="Number of concurrent link checks.", + validation_alias=AliasChoices("mw", "max-workers"), + ) + timeout: int = Field( + default=10, + ge=1, + le=180, + description="Timeout for link validation in seconds.", + validation_alias=AliasChoices("t", "timeout"), + ) + + def cli_cmd(self) -> None: + """Execute the check links command.""" + _logger.info(f"Scanning markdown file {self.input_file} for broken links...") + + checker = LinkValidator(timeout=self.timeout, max_workers=self.max_workers) + results = checker.check_markdown_file(str(self.input_file)) + if not results: + _logger.info("No links found.") + return + + custom_theme = Theme({ + "title": "bold yellow", + "header": "bold green", + "field": "dim", + "value": "bold magenta", + "error": "bold red", + }) + console = Console(theme=custom_theme) + console.print("\n[title]Markdown Link Check Results[/title]\n") + table = Table(show_header=True, header_style="header") + table.add_column("Status", style="field") + table.add_column("Line", style="value") + table.add_column("Link", style="value") + table.add_column("Error", style="error") + broken_links = 0 + for result in results: + status = "✓" if result["status"] == "ok" else "𝗫" + error = result["error"] if result["error"] else "" + table.add_row( + status, str(result["line"]), f"[link]{result['url']}[/link]", error + ) + if result["error"]: + broken_links += 1 + console.print(table) + console.print( + f"\nSummary: {broken_links} broken links out of {len(results)} total links." + ) + + +class ReferenceLinksCommand(BaseModel): + """ + Convert inline markdown links to reference-style links. + """ + + input_file: ExistingFilePath = Field( + ..., + description="Path to the markdown file.", + validation_alias=AliasChoices("i", "input"), + ) + output_file: Path | str = Field( + default=Path("reflinks_output.md"), + description="Path to save updated document.", + validation_alias=AliasChoices("o", "output"), + ) + + def cli_cmd(self) -> None: + """Execute the reference link conversion.""" + _logger.info( + f"Converting all links in '{self.input_file}' to reference style..." + ) + converter = ReferenceLinkConverter() + converter.process_file(self.input_file, self.output_file or self.input_file) + _logger.info( + f"Link conversion complete. Updated file saved to '{self.output_file}'." + ) + + +class MkDocsCommand(BaseModel): + """ + Generate a basic MkDocs configuration. + """ + + docs_dir: Path = Field( + default=Path(".splitme/docs"), + description="Path to the documentation directory.", + validation_alias=AliasChoices("d", "dir", "docs-dir"), + ) + site_name: str = Field( + default="MkDocs Static Site Documentation", + description="Name of the MkDocs site.", + validation_alias=AliasChoices("name", "site-name"), + ) + + validate_fields = field_validator("docs_dir")(convert_to_path) + + def cli_cmd(self) -> None: + """Execute MkDocs configuration generation.""" + _logger.info(f"Generating MkDocs static site config for: {self.docs_dir}") + MkDocsConfig( + docs_dir=self.docs_dir, + site_name=self.site_name, + ).generate_config() + _logger.info(f"MkDocs config generated and saved to: {self.docs_dir}.") + + +class SplitCommand(BaseModel): + """ + Split a markdown file into sections based on headings. + """ + + input_file: ExistingFilePath = Field( + ..., + description="Path to the input markdown file.", + validation_alias=AliasChoices("i", "input"), + ) + output_dir: Path = Field( + default=Path(".splitme/docs"), + description="Directory to save split files.", + validation_alias=AliasChoices("o", "output"), + ) + heading_level: str = Field( + default="##", + description="Heading level to split on (e.g., '#', '##').", + validation_alias=AliasChoices("hl", "heading", "level", "heading-level"), + ) + case_sensitive: bool = Field( + default=False, + description="Enable case-sensitive heading matching.", + validation_alias=AliasChoices("cs", "case-sensitive"), + ) + + def cli_cmd(self) -> None: + """Execute the split command.""" + from splitme.core import MarkdownSplitter + + _logger.info(f"Splitting Markdown file: {self.input_file}") + _logger.info(f"Splitting on heading level: {self.heading_level}") + splitter = MarkdownSplitter() + content = FileHandler().read(self.input_file) + # splitter.settings = self.model_dump() + splitter.process_file(content) + _logger.info(f"Split completed. Files saved to: {self.output_dir}") + + +class SplitmeApp(BaseSettings): + """ + Main CLI interface for splitme. + """ + + config: ConfigCommand | None = Field( + default=None, + description="Manage configuration settings", + validation_alias=AliasChoices("c", "config"), + ) + check_links: CheckLinksCommand | None = Field( + default=None, + description="Validate links in a markdown file", + validation_alias=AliasChoices("cl", "check-links"), + ) + reference_links: ReferenceLinksCommand | None = Field( + default=None, + description="Convert links to reference style", + validation_alias=AliasChoices("rl", "reflinks"), + ) + split: SplitCommand | None = Field( + default=None, + description="Split a markdown file into sections", + validation_alias=AliasChoices("s", "split"), + ) + mkdocs: MkDocsCommand | None = Field( + default=None, + description="Generate MkDocs configuration from a Markdown file", + validation_alias=AliasChoices("mk", "mkdocs"), + ) + version: bool = Field( + default=False, + description="Display the version number", + validation_alias=AliasChoices("v", "version"), + ) + + model_config = SettingsConfigDict( + case_sensitive=False, + cli_enforce_required=False, + cli_implicit_flags=True, + cli_parse_args=True, + env_prefix="SPLITME_", + extra="allow", + ) + + def cli_cmd(self) -> None: + """Execute the appropriate command.""" + + from splitme import __version__ + + if self.version: + print(f"[bold green]splitme[/bold green] {__version__}") + return + + if all( + v is None + for k, v in self.model_dump().items() + if k + not in [ + "version", + "model_config", + ] + ): + self.print_help() + return + + if self.config: + self.config.cli_cmd() + if self.check_links: + self.check_links.cli_cmd() + if self.reference_links: + self.reference_links.cli_cmd() + if self.split: + self.split.cli_cmd() + if self.mkdocs: + self.mkdocs.cli_cmd() + + +def main() -> None: + """Main entry point for the Splitme CLI.""" + settings = SplitmeApp() + settings.cli_cmd() diff --git a/src/splitme/config.py b/src/splitme/config.py new file mode 100644 index 0000000..4932f56 --- /dev/null +++ b/src/splitme/config.py @@ -0,0 +1,33 @@ +import os +from dataclasses import dataclass +from pathlib import Path + +import yaml + + +@dataclass +class Config: + """ + Configuration settings for markdown text splitting. + """ + + heading_level: str = "##" + output_dir: str = "docs" + preserve_refs: bool = True + add_hr: bool = True + + @classmethod + def from_yaml(cls, path: Path) -> "Config": + """Load configuration from YAML file.""" + with open(path, encoding="utf-8") as f: + return cls(**yaml.safe_load(f)) + + @classmethod + def from_env(cls) -> "Config": + """Load configuration settings from environment variables.""" + config = Config() + config.heading_level = os.getenv("SPLITME_HEADING_LEVEL", config.heading_level) + config.output_dir = os.getenv("SPLITME_OUTPUT_DIR", config.output_dir) + config.preserve_refs = bool(os.getenv("SPLITME_PRESERVE_REFS", "True")) + config.add_hr = bool(os.getenv("SPLITME_ADD_HR", "True")) + return config diff --git a/src/splitme_ai/core.py b/src/splitme/core.py similarity index 86% rename from src/splitme_ai/core.py rename to src/splitme/core.py index fc2c692..a343465 100644 --- a/src/splitme_ai/core.py +++ b/src/splitme/core.py @@ -1,16 +1,16 @@ -"""Core functionalities for markdown text splitting and processing.""" +"""Core methods for splitting markdown content into sections.""" from __future__ import annotations import re from dataclasses import dataclass from pathlib import Path -from typing import Dict, List, Optional +from typing import Dict, List -from splitme_ai.cli import SplitmeApp, SplitmeSettings -from splitme_ai.logger import Logger -from splitme_ai.tools.reference_link_extractor import ReferenceLinkExtractor -from splitme_ai.utils.filename_sanitizer import sanitize_filename +from splitme.cli import SplitmeApp +from splitme.logger import Logger +from splitme.tools.markdown.reflink_extractor import ReferenceLinkExtractor +from splitme.utils.filename_sanitizer import sanitize_filename _logger = Logger(__name__) @@ -29,33 +29,36 @@ class Section: references: dict[str, str] | None = None def __post_init__(self) -> None: + """Initialize references as an empty dictionary if not provided.""" if self.references is None: self.references = {} class MarkdownSplitter: - """Splits markdown documents based on headings.""" + """ + Splits markdown documents based on headings. + """ - def __init__(self, settings: Optional[SplitmeSettings] = None) -> None: - self.settings = settings or SplitmeSettings() + def __init__(self, settings: SplitmeApp | None = None) -> None: + self.settings = settings or SplitmeApp() self._compile_patterns() - _logger.debug(f"Initialized MarkdownSplitter with settings: {self.settings}") + _logger.debug(f"MarkdownSplitter initialized with settings: {self.settings}") def process_file(self, content: str) -> List[Section]: """Process markdown file, split it, and handle additional steps.""" - _logger.info("Starting markdown file processing") + _logger.info("Processing markdown content...") sections = self.split(content) - - _logger.debug(f"Creating output directory: {self.settings.output_dir}") - self.settings.output_dir.mkdir(parents=True, exist_ok=True) + output_dir = Path(self.settings.split.output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + _logger.debug(f"Verified output directory: {output_dir}") for section in sections: - section_path = self.settings.output_dir / section.filename + section_path = output_dir / section.filename _logger.debug(f"Writing section '{section.title}' to {section_path}") section_path.write_text(section.content, encoding="utf-8") if hasattr(self.settings, "process_mkdocs"): - _logger.info("Mkdocs configuration enabled. Processing...") + _logger.info(f"Processing mkdocs.yml with settings: {self.settings.mkdocs}") self.settings.process_mkdocs() _logger.info("File processing completed successfully") @@ -138,7 +141,7 @@ def end(self, *args): return [section] # Target heading level is determined by number of # in settings - target_level = len(self.settings.heading_level) + target_level = len(self.settings.model_dump()["split"]["heading_level"]) sections = [] # Track the current section being built @@ -181,6 +184,7 @@ def end(self, *args): elif heading_level > target_level and current_section_start is not None: # This is nested content for the current section, do nothing continue + elif heading_level < target_level: # This is a higher-level heading, ignore its content if current_section_start is not None: @@ -202,11 +206,10 @@ def end(self, *args): current_section_start = None current_section_title = None - # Don't forget to handle the last section if we were building one + # Handle the last section if we were building one if current_section_start is not None: section_content = content[current_section_start:].strip() section_refs = ref_handler.find_used_references(section_content) - sections.append( self._create_section( title=current_section_title, @@ -216,19 +219,20 @@ def end(self, *args): ) ) - _logger.info(f"Successfully split content into {len(sections)} sections.") + _logger.info(f"Successfully split document into {len(sections)} sections.") return sections def _compile_patterns(self) -> None: """Compile regex patterns based on settings.""" - flags = 0 if self.settings.case_sensitive else re.IGNORECASE - - # Patterns for parsing + flags = ( + 0 + if self.settings.model_dump()["split"]["case_sensitive"] + else re.IGNORECASE + ) self.heading_pattern = re.compile( - f"^({re.escape(self.settings.heading_level)})\\s+(.+?)(?:\\s+)*\\s*$", + f"^({re.escape(self.settings.model_dump()['split']['heading_level'])})\\s+(.+?)(?:\\s+)*\\s*$", re.MULTILINE | flags, ) - self.reference_pattern = re.compile(r"^\[([^\]]+)\]:\s+(.+)$", re.MULTILINE) self.reference_usage = re.compile(r"\[([^\]]+)\](?!\()", re.MULTILINE) @@ -279,13 +283,3 @@ def _format_section_content(self, content: str, references: Dict[str, str]) -> s # Ensure the file ends with exactly one newline return base_content.rstrip() + "\n" - - -def main(): - """CLI entry point for splitme-ai.""" - app = SplitmeApp() - app.cli_cmd() - - -if __name__ == "__main__": - main() diff --git a/src/splitme/errors.py b/src/splitme/errors.py new file mode 100644 index 0000000..734869f --- /dev/null +++ b/src/splitme/errors.py @@ -0,0 +1,62 @@ +"""Custom exceptions for the splitme package.""" + +from __future__ import annotations + +from typing import Any + + +class SplitmeBaseError(Exception): + """Base exception for splitme errors.""" + + ... + + +class ParseError(SplitmeBaseError): + """Raised when parsing markdown content fails.""" + + ... + + +class FileOperationError(SplitmeBaseError): + """Raised when file operations fail.""" + + ... + + +# -- CLI ------------- + + +class CLIError(SplitmeBaseError): + """Exceptions related to the CLI.""" + + def __init__(self, message: str, *args: Any) -> None: + super().__init__(f"Invalid option provided to CLI: {message}", *args) + + +# -- File IO --------- + + +class FileSystemError(SplitmeBaseError): + """Exceptions related to file system operations.""" + + def __init__(self, message: str, path: str, *args: Any) -> None: + self.file_path = path + super().__init__(f"{message}: {path}", *args) + + +class FileReadError(FileSystemError): + """Could not read file.""" + + ... + + +class FileWriteError(FileSystemError): + """Could not write file.""" + + ... + + +class InvalidPathError(FileSystemError): + """Invalid path provided.""" + + ... diff --git a/src/splitme/generators/__init__.py b/src/splitme/generators/__init__.py new file mode 100644 index 0000000..8f1bbd9 --- /dev/null +++ b/src/splitme/generators/__init__.py @@ -0,0 +1,3 @@ +from splitme.generators.mkdocs.config import MkDocsConfig + +__all__: list[str] = ["MkDocsConfig"] diff --git a/tests/splitme_ai/__init__.py b/src/splitme/generators/mintlify/__init__.py similarity index 100% rename from tests/splitme_ai/__init__.py rename to src/splitme/generators/mintlify/__init__.py diff --git a/tests/splitme_ai/generators/__init__.py b/src/splitme/generators/mkdocs/__init__.py similarity index 100% rename from tests/splitme_ai/generators/__init__.py rename to src/splitme/generators/mkdocs/__init__.py diff --git a/src/splitme_ai/generators/mkdocs_config.py b/src/splitme/generators/mkdocs/config.py similarity index 94% rename from src/splitme_ai/generators/mkdocs_config.py rename to src/splitme/generators/mkdocs/config.py index 72ea927..2ec8b7e 100644 --- a/src/splitme_ai/generators/mkdocs_config.py +++ b/src/splitme/generators/mkdocs/config.py @@ -5,15 +5,14 @@ ClassVar, Dict, List, - Optional, Set, Union, ) import yaml -from splitme_ai.errors import FileOperationError -from splitme_ai.utils.file_handler import FileHandler +from splitme.errors import FileOperationError +from splitme.utils.file_handler import FileHandler class MkDocsConfig: @@ -32,10 +31,10 @@ class MkDocsConfig: def __init__( self, - docs_dir: Union[str, Path] = ".splitme-ai/", + docs_dir: Union[str, Path] = ".splitme/", site_name: str = "MkDocs Site Documentation", enable_material: bool = True, - theme_palette: Optional[Dict[str, str]] = None, + theme_palette: Dict[str, str] | None = None, ) -> None: if not site_name or not site_name.strip(): raise ValueError("Site name cannot be empty") @@ -165,8 +164,8 @@ def _get_base_config(self) -> Dict[str, Union[str, Dict[str, str]]]: def generate_config( self, - output_file: Optional[Union[str, Path]] = None, - extra_config: Optional[Dict[str, Union[str, Dict[str, str]]]] = None, + output_file: Union[str, Path] | None = None, + extra_config: Dict[str, Union[str, Dict[str, str]]] | None = None, ) -> None: """Generate MkDocs configuration file with enhanced error handling. @@ -208,7 +207,9 @@ def generate_config( f"Failed to write MkDocs configuration to {output_file}: {e!s}" ) from e - def _deep_merge_configs(self, base: dict, update: dict) -> dict: + def _deep_merge_configs( + self, base: dict[str, Any], update: dict[str, Any] + ) -> dict[str, Any]: """Recursively merge two configuration dictionaries. Args: @@ -245,7 +246,6 @@ def update_nav(self, output_file: Union[str, Path] = "mkdocs.yml") -> None: raise FileNotFoundError(f"Config file not found: {output_file}") try: - # Read existing configuration with output_path.open("r", encoding="utf-8") as f: config = yaml.safe_load(f) @@ -292,13 +292,13 @@ class SpacedDumper(yaml.Dumper): def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) self.last_was_basic = False - self.current_key: Optional[str] = None + self.current_key: str | None = None def represent_mapping( self, tag: str, mapping: Any, # Union[SupportsItems[Any, Any], Iterable[tuple[Any, Any]]], - flow_style: Optional[bool] = None, + flow_style: bool | None = None, ) -> yaml.MappingNode: """Override to track the current key being processed.""" # Get the key if we're at the top level @@ -306,7 +306,7 @@ def represent_mapping( self.current_key = next(iter(mapping)) # type: ignore return super().represent_mapping(tag, mapping, flow_style) - def write_line_break(self, data: Optional[str] = None) -> None: + def write_line_break(self, data: str | None = None) -> None: """Add extra line breaks between major sections, but not basic settings.""" super().write_line_break(data) diff --git a/src/splitme_ai/logger.py b/src/splitme/logger.py similarity index 98% rename from src/splitme_ai/logger.py rename to src/splitme/logger.py index efecdd9..1af8b3c 100644 --- a/src/splitme_ai/logger.py +++ b/src/splitme/logger.py @@ -39,7 +39,7 @@ def format(self, record: logging.LogRecord) -> str: class Logger: """ - Custom logger class for the splitme-ai package. + Custom logger class for the splitme package. """ _instances: typing.ClassVar[dict[str, "Logger"]] = {} diff --git a/src/splitme/tools/__init__.py b/src/splitme/tools/__init__.py new file mode 100644 index 0000000..59f7819 --- /dev/null +++ b/src/splitme/tools/__init__.py @@ -0,0 +1,9 @@ +from splitme.tools.markdown.link_validator import LinkValidator +from splitme.tools.markdown.reflink_converter import ReferenceLinkConverter +from splitme.tools.markdown.reflink_extractor import ReferenceLinkExtractor + +__all__: list[str] = [ + "LinkValidator", + "ReferenceLinkConverter", + "ReferenceLinkExtractor", +] diff --git a/tests/splitme_ai/tools/__init__.py b/src/splitme/tools/html/__init__.py similarity index 100% rename from tests/splitme_ai/tools/__init__.py rename to src/splitme/tools/html/__init__.py diff --git a/tests/splitme_ai/utils/__init__.py b/src/splitme/tools/markdown/__init__.py similarity index 100% rename from tests/splitme_ai/utils/__init__.py rename to src/splitme/tools/markdown/__init__.py diff --git a/src/splitme_ai/tools/markdown_link_validator.py b/src/splitme/tools/markdown/link_validator.py similarity index 98% rename from src/splitme_ai/tools/markdown_link_validator.py rename to src/splitme/tools/markdown/link_validator.py index 4c0b02d..32d3575 100644 --- a/src/splitme_ai/tools/markdown_link_validator.py +++ b/src/splitme/tools/markdown/link_validator.py @@ -7,12 +7,12 @@ import requests -from splitme_ai.logger import Logger +from splitme.logger import Logger _logger = Logger(__name__) -class MarkdownLinkValidator: +class LinkValidator: def __init__(self, timeout: int = 10, max_workers: int = 5): """ Initialize the link checker with configurable timeout and concurrency. diff --git a/src/splitme_ai/tools/markdown_link_converter.py b/src/splitme/tools/markdown/reflink_converter.py similarity index 98% rename from src/splitme_ai/tools/markdown_link_converter.py rename to src/splitme/tools/markdown/reflink_converter.py index f977f78..10b50a9 100644 --- a/src/splitme_ai/tools/markdown_link_converter.py +++ b/src/splitme/tools/markdown/reflink_converter.py @@ -6,12 +6,12 @@ from pathlib import Path from typing import Dict, List, Tuple -from splitme_ai.logger import Logger +from splitme.logger import Logger _logger = Logger(__name__) -class MarkdownLinkConverter: +class ReferenceLinkConverter: """Converts inline Markdown links to reference-style links.""" def __init__(self) -> None: diff --git a/src/splitme_ai/tools/reference_link_extractor.py b/src/splitme/tools/markdown/reflink_extractor.py similarity index 96% rename from src/splitme_ai/tools/reference_link_extractor.py rename to src/splitme/tools/markdown/reflink_extractor.py index c8e356c..6c5918c 100644 --- a/src/splitme_ai/tools/reference_link_extractor.py +++ b/src/splitme/tools/markdown/reflink_extractor.py @@ -5,7 +5,7 @@ import re from typing import Dict -from splitme_ai.logger import Logger +from splitme.logger import Logger _logger = Logger(__name__) @@ -41,10 +41,9 @@ def _extract_references(self) -> dict[str, str]: # Extract references that appear after reference marker comments ref_sections = re.split(r"", self.markdown_text) - references = {} + references: dict[str, str] = {} ref_pattern = re.compile(r"^\[([^\]]+)\]:\s*(.+?)\s*$", re.MULTILINE) - # Process each reference section (if any exist) for section in ref_sections: for match in ref_pattern.finditer(section): ref_name = match.group(1).strip() diff --git a/src/splitme/utils/__init__.py b/src/splitme/utils/__init__.py new file mode 100644 index 0000000..02845f3 --- /dev/null +++ b/src/splitme/utils/__init__.py @@ -0,0 +1,5 @@ +from splitme.utils.file_handler import FileHandler + +__all__: list[str] = [ + "FileHandler", +] diff --git a/src/splitme_ai/utils/file_handler.py b/src/splitme/utils/file_handler.py similarity index 94% rename from src/splitme_ai/utils/file_handler.py rename to src/splitme/utils/file_handler.py index a14e883..2ee862e 100644 --- a/src/splitme_ai/utils/file_handler.py +++ b/src/splitme/utils/file_handler.py @@ -3,7 +3,7 @@ from pathlib import Path from typing import Union -from splitme_ai.errors import FileOperationError +from splitme.errors import FileOperationError class FileHandler: diff --git a/src/splitme_ai/utils/filename_sanitizer.py b/src/splitme/utils/filename_sanitizer.py similarity index 100% rename from src/splitme_ai/utils/filename_sanitizer.py rename to src/splitme/utils/filename_sanitizer.py diff --git a/src/splitme/validators.py b/src/splitme/validators.py new file mode 100644 index 0000000..aec6c7a --- /dev/null +++ b/src/splitme/validators.py @@ -0,0 +1,26 @@ +"""Pydantic functions and type annotations to validate user input.""" + +from pathlib import Path +from typing import Annotated + +from pydantic import AfterValidator + +from splitme.errors import InvalidPathError + + +def convert_to_path(v: str) -> Path: + """Convert the path string to a Path object.""" + return Path(v) + + +def validate_path(v: Path) -> Path: + """Ensure the path exists and is a file.""" + if not v.exists() or not v.is_file(): + raise InvalidPathError( + message="The provided path does not exist or is not a file.", + path=str(v), + ) + return v + + +ExistingFilePath = Annotated[Path, AfterValidator(validate_path)] diff --git a/src/splitme_ai/__init__.py b/src/splitme_ai/__init__.py deleted file mode 100644 index 0b7688a..0000000 --- a/src/splitme_ai/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from importlib.metadata import version - -from splitme_ai.config import Config as Config -from splitme_ai.core import MarkdownSplitter as MarkdownSplitter -from splitme_ai.errors import FileOperationError as FileOperationError -from splitme_ai.errors import ParseError as ParseError -from splitme_ai.errors import SplitmeAIBaseError -from splitme_ai.utils.file_handler import FileHandler - -__version__ = version("splitme-ai") - -__all__: list[str] = [ - "Config", - "FileHandler", - "FileOperationError", - "MarkdownSplitter", - "ParseError", - "SplitmeAIBaseError", -] diff --git a/src/splitme_ai/cli.py b/src/splitme_ai/cli.py deleted file mode 100644 index 79bab3f..0000000 --- a/src/splitme_ai/cli.py +++ /dev/null @@ -1,283 +0,0 @@ -"""Command-line interface implementation using Pydantic settings management.""" - -from __future__ import annotations - -from pathlib import Path -from typing import TYPE_CHECKING, Annotated, Set - -if TYPE_CHECKING: - pass - -from pydantic import AfterValidator, AliasChoices, BaseModel, Field -from pydantic_settings import BaseSettings, CliImplicitFlag, SettingsConfigDict - -from splitme_ai.generators.mkdocs_config import MkDocsConfig -from splitme_ai.logger import Logger -from splitme_ai.tools.markdown_link_converter import MarkdownLinkConverter -from splitme_ai.tools.markdown_link_validator import MarkdownLinkValidator - -_logger = Logger(__name__) - - -def validate_path(v: Path) -> Path: - """Check if the path exists and is a file.""" - if not v.exists(): - raise ValueError(f"Path '{v}' does not exist.") - if not v.is_file(): - raise ValueError(f"Path '{v}' is not a file.") - return v - - -# Reusable custom type with validation -ExistingFilePath = Annotated[Path, AfterValidator(validate_path)] - - -class SplitmeSettings(BaseSettings): - """ - Configuration settings for splitme-ai. - """ - - case_sensitive: bool = Field( - default=False, description="Use case-sensitive heading matching" - ) - exclude_patterns: Set[str] = Field( - default_factory=set, description="Patterns to exclude from splitting" - ) - generate_mkdocs: CliImplicitFlag[bool] = Field( - default=False, - description="Generate MkDocs configuration", - validation_alias=AliasChoices("mk", "mkdocs"), - ) - heading_level: str = Field( - default="##", - description="Heading level to split on (e.g., '#', '##', '###')", - validation_alias=AliasChoices("hl", "heading_level"), - ) - output_dir: Path = Field( - default=Path(".splitme-ai/output"), - description="Output directory for split files", - validation_alias=AliasChoices("o", "output"), - ) - preserve_context: bool = Field( - default=True, description="Preserve parent heading context in split files" - ) - - model_config = SettingsConfigDict( - case_sensitive=False, - cli_implicit_flags=True, - env_file=".env", - env_file_encoding="utf-8", - env_prefix="SPLITME_", - extra="ignore", - validate_default=True, - ) - - def process_mkdocs(self) -> None: - """Generate MkDocs configuration file if enabled.""" - if not self.generate_mkdocs: - return - config = MkDocsConfig( - docs_dir=self.output_dir, - site_name=f"MkDocs Site: {self.output_dir.name}", - enable_material=True, - ) - config.generate_config() - - -class ConfigCommand(BaseModel): - """ - CLI command for managing configurations via JSON files. - """ - - generate: bool = Field( - default=False, description="Generate default configuration file." - ) - show: bool = Field( - default=False, description="Show current configuration settings." - ) - - def cli_cmd(self) -> None: - """Execute the config command.""" - if self.generate: - settings = SplitmeSettings() - config_path = Path(".splitme.yml") - if config_path.exists() or config_path.with_suffix(".yaml").exists(): - with open(".splitme.yml", "w") as f: - f.write(settings.model_dump_json()) - _logger.info("Generated default configuration in .splitme.yml") - - if self.show: - settings = SplitmeSettings() - print("\nCurrent configuration settings:") - print("-" * 32) - max_field_len = max(len(field) for field in settings.model_dump()) - for field, value in settings.model_dump().items(): - print(f"{field:<{max_field_len}} = {value}") - print() - - -class LinkValidatorCommand(BaseModel): - """ - CLI command for checking if Markdown links are valid. - """ - - input_file: ExistingFilePath = Field( - ..., - description="Input markdown file to process", - validation_alias=AliasChoices("i", "input"), - ) - timeout: int = Field( - default=10, - description="Timeout in seconds for each HTTP request", - ) - max_workers: int = Field( - default=5, - description="Maximum number of concurrent requests", - ) - - model_config = SettingsConfigDict(validate_default=True, extra="forbid") - - def cli_cmd(self) -> None: - """Execute the check links command.""" - print(f"Scanning markdown file {self.input_file} for broken links...") - - checker = MarkdownLinkValidator( - timeout=self.timeout, max_workers=self.max_workers - ) - results = checker.check_markdown_file(str(self.input_file)) - - if not results: - print("No links found.") - return - - print("\nMarkdown Link Check Results:") - print("-" * 80) - - broken_links = 0 - for result in results: - status = "✓" if result["status"] == "ok" else "𝗫" - print( - f"{status} Line {result['line']}: [{result['text']}]({result['url']})" - ) - if result["error"]: - print(f" Error: {result['error']}") - broken_links += 1 - - print( - f"\nSummary: {broken_links} broken links out of {len(results)} total links." - ) - - -class LinkConverterCommand(BaseModel): - """ - CLI command for converting markdown links to reference-style links. - """ - - input_file: ExistingFilePath = Field( - ..., - description="Input markdown file to process", - validation_alias=AliasChoices("i", "input"), - ) - output_file: Path | None = Field( - default=None, - description="Output file path (defaults to input file)", - validation_alias=AliasChoices("o", "output"), - ) - - model_config = SettingsConfigDict(validate_default=True, extra="forbid") - - def cli_cmd(self) -> None: - """Execute the reference links command.""" - converter = MarkdownLinkConverter() - _logger.info(f"Converting all links in {self.input_file} to reference-style.") - converter.process_file(self.input_file, self.output_file) - _logger.info(f"Output written to {self.output_file}") - - -class SplitCommand(BaseModel): - """ - CLI command for splitting markdown files. - """ - - input_file: ExistingFilePath = Field( - ..., - description="Input markdown file to split", - validation_alias=AliasChoices("i", "input"), - ) - settings: SplitmeSettings = Field( - default_factory=SplitmeSettings, - description="Configuration settings for text splitting.", - ) - - def cli_cmd(self) -> None: - """Execute the split command.""" - from splitme_ai.core import MarkdownSplitter - - splitter = MarkdownSplitter(self.settings) - content = self.input_file.read_text(encoding="utf-8") - sections = splitter.process_file(content) - - _logger.info(f"Split {self.input_file} into {len(sections)} sections.") - - for section in sections: - _logger.info(f"Created file {section.filename} from {section.title}") - - -class SplitmeApp(BaseSettings): - """ - Main application CLI interface. - """ - - config: ConfigCommand | None = Field( - default=None, description="Manage configuration" - ) - split: SplitCommand | None = Field( - default=None, - description="Split markdown files", - validation_alias=AliasChoices("s", "split"), - ) - reference_links: LinkConverterCommand | None = Field( - default=None, - description="Convert all links to reference-style syntax", - validation_alias=AliasChoices("rl", "reflinks"), - ) - validate_links: LinkValidatorCommand | None = Field( - default=None, - description="Check if links in a markdown file are valid", - validation_alias=AliasChoices("vl", "validate-links"), - ) - version: bool = Field( - default=False, - description="Package version", - validation_alias=AliasChoices("v", "V", "version"), - ) - - model_config = SettingsConfigDict( - case_sensitive=True, - cli_enforce_required=True, - cli_kebab_case=True, - cli_implicit_flags=True, - cli_parse_args=True, - env_file=".env", - env_file_encoding="utf-8", - env_prefix="SPLITME_", - protected_namespaces=(), - # str_to_bool=["true", "t", "yes", "y", "on", "1", ""], - validate_default=True, - ) - - def cli_cmd(self) -> None: - """Execute the appropriate command.""" - from splitme_ai import __version__ - - if self.version: - print(f"splitme-ai version {__version__}") - return - if self.split: - self.split.cli_cmd() - elif self.config: - self.config.cli_cmd() - elif self.reference_links: - self.reference_links.cli_cmd() - elif self.validate_links: - self.validate_links.cli_cmd() diff --git a/src/splitme_ai/config.py b/src/splitme_ai/config.py deleted file mode 100644 index 013721a..0000000 --- a/src/splitme_ai/config.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Configuration management for JSON config files.""" - -from dataclasses import dataclass - -import yaml - - -@dataclass -class Config: - """ - Configuration settings for markdown text splitting. - """ - - heading_level: str = "##" - output_dir: str = "docs" - preserve_refs: bool = True - add_hr: bool = True - - @classmethod - def from_yaml(cls, path: str) -> "Config": - """Load configuration from YAML file.""" - with open(path, encoding="utf-8") as f: - return cls(**yaml.safe_load(f)) diff --git a/src/splitme_ai/errors.py b/src/splitme_ai/errors.py deleted file mode 100644 index 9f2faf1..0000000 --- a/src/splitme_ai/errors.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Custom exceptions for the splitme-ai package.""" - -from __future__ import annotations - - -class SplitmeAIBaseError(Exception): - """Base exception for splitme-ai errors.""" - - ... - - -class ParseError(SplitmeAIBaseError): - """Raised when parsing markdown content fails.""" - - ... - - -class FileOperationError(SplitmeAIBaseError): - """Raised when file operations fail.""" - - ... - - -# -- CLI Exceptions ----------------------------------------------------------- - - -class CLIError(SplitmeAIBaseError): - """Exceptions related to the CLI.""" - - def __init__(self, message, *args): - super().__init__(f"Invalid option provided to CLI: {message}", *args) - - -# -- File IO Exceptions ------------------------------------------------------- - - -class FileSystemError(SplitmeAIBaseError): - """Exceptions related to file system operations.""" - - def __init__(self, message, path, *args): - self.file_path = path - super().__init__(f"{message}: {path}", *args) - - -class FileReadError(FileSystemError): - """Could not read file.""" - - ... - - -class FileWriteError(FileSystemError): - """Could not write file.""" - - ... - - -# -- --------------------------------------------- diff --git a/src/splitme_ai/generators/__init__.py b/src/splitme_ai/generators/__init__.py deleted file mode 100644 index 10564d4..0000000 --- a/src/splitme_ai/generators/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from splitme_ai.generators.mkdocs_config import MkDocsConfig - -__all__: list[str] = ["MkDocsConfig"] diff --git a/src/splitme_ai/tools/__init__.py b/src/splitme_ai/tools/__init__.py deleted file mode 100644 index 61c9cfa..0000000 --- a/src/splitme_ai/tools/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from splitme_ai.tools.markdown_link_converter import MarkdownLinkConverter -from splitme_ai.tools.markdown_link_validator import MarkdownLinkValidator -from splitme_ai.tools.reference_link_extractor import ReferenceLinkExtractor - -__all__: list[str] = [ - "MarkdownLinkConverter", - "MarkdownLinkValidator", - "ReferenceLinkExtractor", -] diff --git a/src/splitme_ai/utils/__init__.py b/src/splitme_ai/utils/__init__.py deleted file mode 100644 index 72178a1..0000000 --- a/src/splitme_ai/utils/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from splitme_ai.utils.file_handler import FileHandler - -__all__: list[str] = [ - "FileHandler", -] diff --git a/tests/conftest.py b/tests/conftest.py index 6e5a315..c428232 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,16 +2,16 @@ import pytest -from splitme_ai.utils.file_handler import FileHandler +from splitme.utils.file_handler import FileHandler +@pytest.fixture def file_handler() -> FileHandler: - """Return a file handler instance.""" return FileHandler() @pytest.fixture -def markdown_file(filename: str = "readme-ai.md") -> str: +def input_file(filename: str = "tests/data/markdown/readme-ai.md") -> str: """Return markdown file content.""" - file_path = Path.cwd() / f"tests/data/{filename}" + file_path = Path.cwd() / filename return file_handler().read(file_path) diff --git a/tests/data/html/readme-ai.html b/tests/data/html/readme-ai.html new file mode 100644 index 0000000..b445b09 --- /dev/null +++ b/tests/data/html/readme-ai.html @@ -0,0 +1,966 @@ +
+

+ ReadmeAI Logo +

+

+ Designed for simplicity, customization, and developer productivity. +

+

+ + Github Actions + + + Test Coverage + + + PyPI Version + + + Total Downloads + + + MIT License + +

+
+line break +

Quick Links

+ +
+

[!IMPORTANT] + Explore the Official Documentation for a complete list of features, customization options, and examples.

+
+line break +

Introduction

+

ReadmeAI is a developer tool that automatically generates README files using a robust repository processing engine and advanced language models. Simply provide a URL or path to your codebase, and a well-structured and detailed README will be generated.

+

Why Use ReadmeAI?

+

This project aims to streamline the process of creating and maintaining documentation across all technical disciplines and experience levels. The core principles include:

+
    +
  • 🔵 Automate: Generate detailed and structured README files with a single command.
  • +
  • ⚫️ Customize: Select from a variety of templates, styles, badges, and much more.
  • +
  • 🟣 Flexible: Switch between OpenAI, Ollama, Anthropic, and Gemini anytime.
  • +
  • 🟠 Language Agnostic: Compatible with a wide range of languages and frameworks.
  • +
  • 🟡 Best Practices: Ensure clean and consistent documentation across all projects.
  • +
  • ✨ Offline Mode: Create README files offline, without using a LLM API service.
  • +
+

Demo

+

Run from your terminal:

+

readmeai-cli-demo

+ +line break +

Features

+

Customize Your README

+

Let's begin by exploring various customization options and styles supported by ReadmeAI:

+
+
Header Styles
+ + + + + + + + + + + + + +
+ Classic Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/eli64s/readme-ai-streamlit \
+           --logo custom \
+           --badge-color FF4B4B \
+           --badge-style flat-square \
+           --header-style classic
+          
+        
+
+ Modern Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/olliefr/docker-gs-ping \
+           --badge-color 00ADD8 \
+           --badge-style for-the-badge \
+           --header-style modern \
+           --navigation-style roman
+          
+        
+
+ Compact Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/rumaan/file.io-Android-Client \
+           --badge-style plastic \
+           --badge-color blueviolet \
+           --logo PURPLE \
+           --header-style COMPACT \
+           --navigation-style NUMBER \
+           --emojis solar
+          
+        
+
+ +

Banner Styles

+ + + + + + + + +
+ Console Header +

CLI Command:

+
+          $ readmeai --repository https://github.com/emcf/thepipe \
+           --badge-style flat-square \
+           --badge-color 8a2be2 \
+           --header-style console \
+           --navigation-style accordion \
+           --emojis water
+          
+        
+
+ SVG Banner +

CLI Command:

+
+          $ readmeai --repository https://github.com/FerrariDG/async-ml-inference \
+           --badge-style plastic \
+           --badge-color 43a047 \
+           --header-style BANNER
+          
+        
+
+ +

And More!

+ + + + + + + + +
+ Project Overview +

CLI Command:

+
+          $ readmeai --repository 'https://github.com/eli64sreadme-ai-streamlit' \
+           --badge-style FLAT-SQUARE \
+           --badge-color E92063 \
+           --header-style COMPACT \
+           --navigation-style ACCORDION \
+           --emojis RAINBOW \
+           --logo ICE
+          
+        
+
+ Custom Logo +

CLI Command:

+
+          $ readmeai --repository https://github.com/jwills/buenavista \
+           --align LEFT \
+           --badge-style FLAT-SQUARE \
+           --logo CUSTOM
+          
+        
+
+ + +
+

Generated Sections & Content

+
+ ꩜ Expand to view more!
+ + + + + + + + + + + +
+

Project Introduction

+
    +
  • This section captures your project's essence and value proposition.
  • +
  • The prompt template used to generate this section can be viewed here.
  • +
+
+ + + + + + + + + + + +
+

Features Table

+
    +
  • Detailed feature breakdown and technical capabilities.
  • +
  • The prompt template used to generate this section can be viewed here.
  • +
+
+ + + + + + + + + + + + + + + + + +
+

Project Structure

+
    +
  • Visual representation of your project's directory structure.
  • +
  • The tree is generated using pure Python and embedded in a code block.
  • +
+
+

Project Index

+
    +
  • Summarizes key modules of the project, which are also used as context for downstream prompts.toml.
  • +
+
+ + + + + + + + + + + + + + + + + +
+

Getting Started Guides

+
    +
  • Dependencies and system requirements are extracted from the codebase during preprocessing.
  • +
  • The parsers handle most of the heavy lifting here.
  • +
+
+

Installation, Usage, & Testing

+
    +
  • Setup instructions and usage guides are automatically created based on data extracted from the codebase.
  • +
+
+ + + + + + + + + + + + + + + + + +
+

Community & Support

+
    +
  • Development roadmap, contribution guidelines, license information, and community resources.
  • +
  • A return button is also included for easy navigation.
  • +
+
+

Contribution Guides

+
    +
  • Instructions for contributing to the project, including resource links and a basic contribution guide.
  • +
  • Graph of contributors is also included for open-source projects.
  • +
+
+
+line break +

Getting Started

+

Prerequisites

+

ReadmeAI requires Python 3.9 or higher, and one of the following installation methods:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RequirementDetails
Python ≥3.9Core runtime
Installation Method (choose one)
pipDefault Python package manager
pipxIsolated environment installer
uvHigh-performance package manager
dockerContainerized environment
+

Supported Repository Platforms

+

To generate a README file, provide the source repository. ReadmeAI supports these platforms:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformDetails
File SystemLocal repository access
GitHubIndustry-standard hosting
GitLabFull DevOps integration
BitbucketAtlassian ecosystem
+

Supported LLM API Services

+

ReadmeAI is model agnostic, with support for the following LLM API services:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProviderBest ForDetails
OpenAIGeneral useIndustry-leading models
AnthropicAdvanced tasksClaude language models
Google GeminiMultimodal AILatest Google technology
OllamaOpen sourceNo API key needed
Offline ModeLocal operationNo internet required
+
+

Installation

+

ReadmeAI is available on PyPI as readmeai and can be installed as follows:

+ + +

 Pip

+

Install with pip (recommended for most users):

+
❯ pip install -U readmeai
+
+ + +

 Pipx

+

With pipx, readmeai will be installed in an isolated environment:

+
❯ pipx install readmeai
+
+ +

 Uv

+

The fastest way to install readmeai is with uv:

+
❯ uv tool install readmeai
+
+ + +

 Docker

+

To run readmeai in a containerized environment, pull the latest image from [Docker Hub][dockerhub-link]:

+
❯ docker pull zeroxeli/readme-ai:latest
+
+ +

 From source

+
+ Click to build readmeai from source +
    +
  1. +

    Clone the repository:

    +
    ❯ git clone https://github.com/eli64s/readme-ai
    +
    +
  2. +
  3. +

    Navigate to the project directory:

    +
    ❯ cd readme-ai
    +
    +
  4. +
  5. +

    Install dependencies:

    +
    ❯ pip install -r setup/requirements.txt
    +
    +
  6. +
+

Alternatively, use the [setup script][setup-script] to install dependencies:

+ +
 Bash
+
    +
  1. +

    Run the setup script:

    +
    ❯ bash setup/setup.sh
    +
    +
  2. +
+

Or, use poetry to build and install project dependencies:

+ +
 Poetry
+
    +
  1. +

    Install dependencies with poetry:

    +
    ❯ poetry install
    +
    +
  2. +
+
+
+

Additional Optional Dependencies

+
+

[!IMPORTANT] + To use the Anthropic and Google Gemini clients, extra dependencies are required. Install the package with the following extras:

+
    +
  • +

    Anthropic:

    +
    ❯ pip install "readmeai[anthropic]"
    +
    +
  • +
  • +

    Google Gemini:

    +
    ❯ pip install "readmeai[google-generativeai]"
    +
    +
  • +
  • +

    Install Multiple Clients:

    +
    ❯ pip install "readmeai[anthropic,google-generativeai]"
    +
    +
  • +
+
+

Usage

+

Set your API key

+

When running readmeai with a third-party service, you must provide a valid API key. For example, the OpenAI client is set as follows:

+
❯ export OPENAI_API_KEY=<your_api_key>
+
+# For Windows users:
+❯ set OPENAI_API_KEY=<your_api_key>
+
+
+ Click to view environment variables for - Ollama, Anthropic, Google Gemini +
+
+ Ollama +
+

Refer to the Ollama documentation for more information on setting up the Ollama server.

+

To start, follow these steps:

+
    +
  1. +

    Pull your model of choice from the Ollama repository:

    +
    ❯ ollama pull llama3.2:latest
    +
    +
  2. +
  3. +

    Start the Ollama server and set the OLLAMA_HOST environment variable:

    +
    ❯ export OLLAMA_HOST=127.0.0.1 && ollama serve
    +
    +
  4. +
+
+
+ Anthropic +
    +
  1. +

    Export your Anthropic API key:

    +
    ❯ export ANTHROPIC_API_KEY=<your_api_key>
    +
    +
  2. +
+
+
+ Google Gemini +
    +
  1. +

    Export your Google Gemini API key:

    +
    ❯ export GOOGLE_API_KEY=<your_api_key
    +
    +
  2. +
+
+
+

Using the CLI

+
Running with a LLM API service
+

Below is the minimal command required to run readmeai using the OpenAI client:

+
❯ readmeai --api openai -o readmeai-openai.md -r https://github.com/eli64s/readme-ai
+
+
+

[!IMPORTANT] + The default model set is gpt-3.5-turbo, offering the best balance between cost and performance.When using any model from the gpt-4 series and up, please monitor your costs and usage to avoid unexpected charges.

+
+

ReadmeAI can easily switch between API providers and models. We can run the same command as above with the Anthropic client:

+
❯ readmeai --api anthropic -m claude-3-5-sonnet-20240620 -o readmeai-anthropic.md -r https://github.com/eli64s/readme-ai
+
+

And finally, with the Google Gemini client:

+
❯ readmeai --api gemini -m gemini-1.5-flash -o readmeai-gemini.md -r https://github.com/eli64s/readme-ai
+
+
Running with local models
+

We can also run readmeai with free and open-source locally hosted models using the Ollama:

+
❯ readmeai --api ollama --model llama3.2 -r https://github.com/eli64s/readme-ai
+
+
Running on a local codebase
+

To generate a README file from a local codebase, simply provide the full path to the project:

+
❯ readmeai --repository /users/username/projects/myproject --api openai
+
+

Adding more customization options:

+
❯ readmeai --repository https://github.com/eli64s/readme-ai \
+           --output readmeai.md \
+           --api openai \
+           --model gpt-4 \
+           --badge-color A931EC \
+           --badge-style flat-square \
+           --header-style compact \
+           --navigation-style fold \
+           --temperature 0.9 \
+           --tree-depth 2
+           --logo LLM \
+           --emojis solar
+
+
Running in offline mode
+

ReadmeAI supports offline mode, allowing you to generate README files without using a LLM API service.

+
❯ readmeai --api offline -o readmeai-offline.md -r https://github.com/eli64s/readme-ai
+
+ +

 Docker

+

Run the readmeai CLI in a Docker container:

+
❯ docker run -it --rm \
+    -e OPENAI_API_KEY=$OPENAI_API_KEY \
+    -v "$(pwd)":/app zeroxeli/readme-ai:latest \
+    --repository https://github.com/eli64s/readme-ai \
+    --api openai
+
+ +

 Streamlit

+

Try readme-ai directly in your browser on Streamlit Cloud, no installation required.

+

+

See the readme-ai-streamlit repository on GitHub for more details about the application.

+
+

[!WARNING] + The readme-ai Streamlit web app may not always be up-to-date with the latest features. Please use the command-line interface (CLI) for the most recent functionality.

+
+ +

 From source

+
+ Click to run readmeai from source + +
 Bash
+

If you installed the project from source with the bash script, run the following command:

+
    +
  1. +

    Activate the virtual environment:

    +
    ❯ conda activate readmeai
    +
    +
  2. +
  3. +

    Run the CLI:

    +
    ❯ python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai
    +
    +
  4. +
+ +
 Poetry
+
    +
  1. +

    Activate the virtual environment:

    +
    ❯ poetry shell
    +
    +
  2. +
  3. +

    Run the CLI:

    +
    ❯ poetry run python3 -m readmeai.cli.main -r https://github.com/eli64s/readme-ai
    +
    +
  4. +
+
+line break +

Testing

+ +

The pytest and nox frameworks are used for development and testing.

+

Install the dependencies with uv:

+
❯ uv pip install --dev --group test --all-extras
+
+

Run the unit test suite using Pytest:

+
❯ make test
+
+

Using nox, test the app against Python versions 3.9, 3.10, 3.11, and 3.12:

+
❯ make test-nox
+
+
+

[!TIP] + Nox is an automation tool for testing applications in multiple environments. This helps ensure your project is compatible with across Python versions and environments. +

+
+line break +

Configuration

+

Customize your README generation with a variety of options and style settings supported such as:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionDescriptionDefault
--alignText alignment in headercenter
--apiLLM API service provideroffline
--badge-colorBadge color name or hex code0080ff
--badge-styleBadge icon style typeflat
--header-styleHeader template styleclassic
--navigation-styleTable of contents stylebullet
--emojisEmoji theme packs prefixed to section titlesNone
--logoProject logo imageblue
--logo-sizeLogo image size30%
--modelSpecific LLM model to usegpt-3.5-turbo
--outputOutput filenamereadme-ai.md
--repositoryRepository URL or local directory pathNone
--temperatureCreativity level for content generation0.1
--tree-max-depthMaximum depth of the directory tree structure2
+

Run the following command to view all available options:

+
❯ readmeai --help
+
+ +

Visit the Official Documentation for a complete guide on configuring and customizing README files.

+
+line break +

Example Gallery

+

This gallery showcases a diverse collection of README examples generated across various programming languages, frameworks, and project types.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TechRepositoryREADMEProject Description
PythonREADME-Python.mdreadmeaiReadmeAI's core project
Apache FlinkREADME-Flink.mdpyflink-pocPyFlink proof of concept
StreamlitREADME-Streamlit.mdreadmeai-streamlitWeb application interface
Vercel & NPMREADME-Vercel.mdgithub-readme-quotesDeployment showcase
Go & DockerREADME-DockerGo.mddocker-gs-pingContainerized Golang app
FastAPI & RedisREADME-FastAPI.mdasync-ml-inferenceML inference service
JavaREADME-Java.mdminimal-todoMinimalist To-Do app
PostgreSQL & DuckDBREADME-PostgreSQL.mdbuenavistaDatabase proxy server
KotlinREADME-Kotlin.mdandroid-clientMobile client application
Offline ModeREADME-Offline.mdlitellmOffline functionality demo
+

Community Contribution

+

Share Your README Files

+

We invite developers to share their generated README files in our Show & Tell discussion category. Your contributions help:

+
    +
  • Showcase diverse documentation styles
  • +
  • Provide real-world examples
  • +
  • Help improve the ReadmeAI tool
  • +
+

Find additional README examples in our examples directory on GitHub.

+line break +

Roadmap

+
    +
  • [ ] Release readmeai 1.0.0 with robust documentation creation and maintenance capabilities.
  • +
  • [ ] Extend template support for various project types and programming languages.
  • +
  • [ ] Develop Vscode Extension to generate README files directly in the editor.
  • +
  • [ ] Develop GitHub Actions to automate documentation updates.
  • +
  • [ ] Add badge packs to provide additional badge styles and options. +
      +
    • [ ] Code coverage, CI/CD status, project version, and more.
    • +
    +
  • +
+

Contributing

+

Contributions are welcome! Please read the Contributing Guide to get started.

+ +
+

+ + + +

+

Acknowledgments

+

A big shoutout to the projects below for their awesome work and open-source contributions:

+ +

🎗 License

+

Copyright © 2023-2025 readme-ai.
+ Released under the MIT license.

+
+

+
+line break + + + + + + + + + + + + + diff --git a/tests/data/markdown/mistletoe.md b/tests/data/markdown/mistletoe.md new file mode 100644 index 0000000..1d258f4 --- /dev/null +++ b/tests/data/markdown/mistletoe.md @@ -0,0 +1,268 @@ +

mistletoe

+ +[![Build Status][build-badge]][github-actions] +[![Coverage Status][cover-badge]][coveralls] +[![PyPI][pypi-badge]][pypi] +[![is wheel][wheel-badge]][pypi] + +mistletoe is a Markdown parser in pure Python, +designed to be fast, spec-compliant and fully customizable. + +Apart from being the fastest +CommonMark-compliant Markdown parser implementation in pure Python, +mistletoe also supports easy definitions of custom tokens. +Parsing Markdown into an abstract syntax tree +also allows us to swap out renderers for different output formats, +without touching any of the core components. + +Remember to spell mistletoe in lowercase! + +Features +-------- +* **Fast**: + mistletoe is the fastest implementation of CommonMark in Python. + See the [performance][performance] section for details. + +* **Spec-compliant**: + CommonMark is [a useful, high-quality project][oilshell]. + mistletoe follows the [CommonMark specification][commonmark] + to resolve ambiguities during parsing. + Outputs are predictable and well-defined. + +* **Extensible**: + Strikethrough and tables are supported natively, + and custom block-level and span-level tokens can easily be added. + Writing a new renderer for mistletoe is a relatively + trivial task. + + You can even write [a Lisp][scheme] in it. + +Output formats +-------------- + +Renderers for the following "core" output formats exist within the mistletoe +main package: + +* HTML +* LaTeX +* AST (Abstract Syntax Tree; handy for debugging the parsing process) +* Markdown (Can be used to reflow the text, or make other types of automated + changes to Markdown documents) + +Renderers for the following output formats can be found +in the [contrib][contrib] package: + +* HTML with MathJax (_mathjax.py_) +* HTML with code highlighting (using Pygments) (_pygments\_renderer.py_) +* HTML with TOC (for programmatical use) (_toc\_renderer.py_) +* HTML with support for GitHub wiki links (_github\_wiki.py_) +* Jira Markdown (_jira\_renderer.py_) +* XWiki Syntax (_xwiki20\_renderer.py_) +* Scheme (_scheme.py_) + +Installation +------------ +mistletoe is tested for Python 3.5 and above. Install mistletoe with pip: + +```sh +pip3 install mistletoe +``` + +Alternatively, clone the repo: + +```sh +git clone https://github.com/miyuchina/mistletoe.git +cd mistletoe +pip3 install -e . +``` + +This installs mistletoe in "editable" mode (because of the `-e` option). +That means that any changes made to the source code will get visible +immediately - that's because Python only makes a link to the specified +directory (`.`) instead of copying the files to the standard packages +folder. + +See the [contributing][contributing] doc for how to contribute to mistletoe. + +Usage +----- + +### Usage from Python + +Here's how you can use mistletoe in a Python script: + +```python +import mistletoe + +with open('foo.md', 'r') as fin: + rendered = mistletoe.markdown(fin) +``` + +`mistletoe.markdown()` uses mistletoe's default settings: allowing HTML mixins +and rendering to HTML. The function also accepts an additional argument +`renderer`. To produce LaTeX output: + +```python +import mistletoe +from mistletoe.latex_renderer import LaTeXRenderer + +with open('foo.md', 'r') as fin: + rendered = mistletoe.markdown(fin, LaTeXRenderer) +``` + +To reflow the text in a Markdown document with a max line length of 20 characters: + +```python +import mistletoe +from mistletoe.markdown_renderer import MarkdownRenderer + +with open('dev-guide.md', 'r') as fin: + with MarkdownRenderer(max_line_length=20) as renderer: + print(renderer.render(mistletoe.Document(fin))) +``` + +Finally, here's how you would manually specify extra tokens via a renderer. +In the following example, we use `HtmlRenderer` to render +the AST. The renderer itself adds `HtmlBlock` and `HtmlSpan` tokens to the parsing +process. The result should be equal to the output obtained from +the first example above. + +```python +from mistletoe import Document, HtmlRenderer + +with open('foo.md', 'r') as fin: + with HtmlRenderer() as renderer: # or: `with HtmlRenderer(AnotherToken1, AnotherToken2) as renderer:` + doc = Document(fin) # parse the lines into AST + rendered = renderer.render(doc) # render the AST + # internal lists of tokens to be parsed are automatically reset when exiting this `with` block +``` + +**Important**: As can be seen from the example above, +the parsing phase is currently tightly connected with initiation +and closing of a renderer. Therefore, you should never call `Document(...)` +outside of a `with ... as renderer` block, unless you know what you are doing. + +### Usage from command-line + +pip installation enables mistletoe's command-line utility. Type the following +directly into your shell: + +```sh +mistletoe foo.md +``` + +This will transpile `foo.md` into HTML, and dump the output to stdout. To save +the HTML, direct the output into a file: + +```sh +mistletoe foo.md > out.html +``` + +You can use a different renderer by including the full path to the renderer +class after a `-r` or `--renderer` flag. For example, to transpile into +LaTeX: + +```sh +mistletoe foo.md --renderer mistletoe.latex_renderer.LaTeXRenderer +``` + +and similarly for a renderer in the contrib package: + +```sh +mistletoe foo.md --renderer mistletoe.contrib.jira_renderer.JiraRenderer +``` + + +### mistletoe interactive mode + +Running `mistletoe` without specifying a file will land you in interactive +mode. Like Python's REPL, interactive mode allows you to test how your +Markdown will be interpreted by mistletoe: + +```html +mistletoe [version 0.7.2] (interactive) +Type Ctrl-D to complete input, or Ctrl-C to exit. +>>> some **bold** text +... and some *italics* +... +

some bold text +and some italics

+>>> +``` + +The interactive mode also accepts the `--renderer` flag: + +```latex +mistletoe [version 0.7.2] (interactive) +Type Ctrl-D to complete input, or Ctrl-C to exit. +Using renderer: LaTeXRenderer +>>> some **bold** text +... and some *italics* +... +\documentclass{article} +\begin{document} + +some \textbf{bold} text +and some \textit{italics} +\end{document} +>>> +``` + +Who uses mistletoe? +------------------- + +mistletoe is used by projects of various target audience. +You can find some concrete projects in the "Used by" section +on [Libraries.io][libraries-mistletoe], but this is definitely not a complete +list. +Also a list of [Dependents][github-dependents] is tracked by GitHub directly. + +### Run mistletoe from CopyQ + +One notable example is running mistletoe as a Markdown converter from the +advanced clipboard manager called [CopyQ][copyq]. One just needs to install +the [Convert Markdown to ...][copyq-convert-md] custom script command +and then run this command on any selected Markdown text. + +Why mistletoe? +-------------- + +"For fun," says David Beazley. + +Further reading +--------------- + +* [Performance][performance] +* [Developer's Guide](dev-guide.md) + +Copyright & License +------------------- +* mistletoe's logo uses artwork by [Freepik][icon], under + [CC BY 3.0][cc-by]. +* mistletoe is released under [MIT][license]. + +[build-badge]: https://img.shields.io/github/actions/workflow/status/miyuchina/mistletoe/python-package.yml?style=flat-square +[cover-badge]: https://img.shields.io/coveralls/miyuchina/mistletoe.svg?style=flat-square +[pypi-badge]: https://img.shields.io/pypi/v/mistletoe.svg?style=flat-square +[wheel-badge]: https://img.shields.io/pypi/wheel/mistletoe.svg?style=flat-square +[github-actions]: https://github.com/miyuchina/mistletoe/actions/workflows/python-package.yml +[coveralls]: https://coveralls.io/github/miyuchina/mistletoe?branch=master +[pypi]: https://pypi.python.org/pypi/mistletoe +[mistune]: https://github.com/lepture/mistune +[python-markdown]: https://github.com/waylan/Python-Markdown +[python-markdown2]: https://github.com/trentm/python-markdown2 +[commonmark-py]: https://github.com/rtfd/CommonMark-py +[performance]: performance.md +[oilshell]: https://www.oilshell.org/blog/2018/02/14.html +[commonmark]: https://spec.commonmark.org/ +[contrib]: https://github.com/miyuchina/mistletoe/tree/master/mistletoe/contrib +[scheme]: https://github.com/miyuchina/mistletoe/blob/master/mistletoe/contrib/scheme.py +[contributing]: CONTRIBUTING.md +[icon]: https://www.freepik.com +[cc-by]: https://creativecommons.org/licenses/by/3.0/us/ +[license]: LICENSE +[pythonpath]: https://stackoverflow.com/questions/16107526/how-to-flexibly-change-pythonpath +[libraries-mistletoe]: https://libraries.io/pypi/mistletoe +[copyq]: https://hluk.github.io/CopyQ/ +[copyq-convert-md]: https://github.com/hluk/copyq-commands/tree/master/Global#convert-markdown-to- +[github-dependents]: https://github.com/miyuchina/mistletoe/network/dependents diff --git a/tests/data/pydantic.md b/tests/data/markdown/pydantic.md similarity index 96% rename from tests/data/pydantic.md rename to tests/data/markdown/pydantic.md index f0ce9b3..99b4295 100644 --- a/tests/data/pydantic.md +++ b/tests/data/markdown/pydantic.md @@ -31,7 +31,7 @@ See [documentation](https://docs.pydantic.dev/) for more details. Install using `pip install -U pydantic` or `conda install pydantic -c conda-forge`. For more installation options to make Pydantic even faster, -see the [Install](https://docs.pydantic.dev/install/) section in the documentation. +see the [Install](https://docs.pydantic.dev/install/invalid-link) section in the documentation. ## A Simple Example diff --git a/tests/data/readme-ai.md b/tests/data/markdown/readme-ai.md similarity index 100% rename from tests/data/readme-ai.md rename to tests/data/markdown/readme-ai.md diff --git a/tests/splitme_ai/test_core.py b/tests/generators/__init__.py similarity index 100% rename from tests/splitme_ai/test_core.py rename to tests/generators/__init__.py diff --git a/tests/generators/mkdocs/__init__.py b/tests/generators/mkdocs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/splitme_ai/test_cli.py b/tests/splitme_ai/test_cli.py deleted file mode 100644 index dd55a0c..0000000 --- a/tests/splitme_ai/test_cli.py +++ /dev/null @@ -1,12 +0,0 @@ -from pathlib import Path - -from splitme_ai.cli import SplitmeSettings - - -def test_default_values(): - settings = SplitmeSettings() - assert settings.case_sensitive is False - assert settings.exclude_patterns == set() - assert settings.generate_mkdocs is False - assert settings.heading_level == "##" - assert settings.output_dir == Path(".splitme-ai/output") diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..4a38352 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,38 @@ +from pathlib import Path + +import pytest +import pytest_mock + +from splitme.cli import SplitmeApp +from splitme.errors import InvalidPathError +from splitme.validators import validate_path + + +def test_splitme_settings(): + settings = SplitmeApp() + assert isinstance(settings, SplitmeApp) + + +def test_validate_path_file_exists(mocker: pytest_mock.MockFixture): + mock_path = mocker.Mock(spec=Path) + mock_path.exists.return_value = True + mock_path.is_file.return_value = True + result = validate_path(mock_path) + assert result == mock_path + + +def test_validate_path_file_does_not_exist(mocker: pytest_mock.MockFixture): + mock_path = mocker.Mock(spec=Path) + mock_path.exists.return_value = False + with pytest.raises(InvalidPathError) as e: + validate_path(mock_path) + assert isinstance(e.value, InvalidPathError) + + +def test_validate_path_not_a_file(mocker: pytest_mock.MockFixture): + mock_path = mocker.Mock(spec=Path) + mock_path.exists.return_value = True + mock_path.is_file.return_value = False + with pytest.raises(InvalidPathError) as e: + validate_path(mock_path) + assert isinstance(e.value, InvalidPathError) diff --git a/tests/test_core.py b/tests/test_core.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_validators.py b/tests/test_validators.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/tools/__init__.py b/tests/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/tools/markdown/__init__.py b/tests/tools/markdown/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/tools/markdown/test_link_validator.py b/tests/tools/markdown/test_link_validator.py new file mode 100644 index 0000000..be0a032 --- /dev/null +++ b/tests/tools/markdown/test_link_validator.py @@ -0,0 +1,36 @@ +import pytest + +from splitme.tools.markdown.link_validator import LinkValidator + + +@pytest.fixture +def validator() -> LinkValidator: + return LinkValidator() + + +@pytest.mark.parametrize( + "content, expected", + [ + ("[example](http://example.com)", [("example", "http://example.com", 1)]), + ( + "[example](http://example.com)\n[example2](http://example2.com)", + [ + ("example", "http://example.com", 1), + ("example2", "http://example2.com", 2), + ], + ), + ( + "[example](http://example.com)\n[example2](http://example2.com)\n[example3](http://example3.com)", + [ + ("example", "http://example.com", 1), + ("example2", "http://example2.com", 2), + ("example3", "http://example3.com", 3), + ], + ), + ], +) +def test_extract_links( + validator: LinkValidator, content: str, expected: list[tuple[str, str, int]] +): + links = validator.extract_links(content) + assert links == expected diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/uv.lock b/uv.lock index 1985985..ecf40e4 100644 --- a/uv.lock +++ b/uv.lock @@ -1,13 +1,9 @@ version = 1 -requires-python = ">=3.9, <=3.13" - -[[package]] -name = "aiofiles" -version = "24.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, +requires-python = ">=3.9, <=3.14" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version >= '3.10' and python_full_version < '3.12'", + "python_full_version < '3.10'", ] [[package]] @@ -52,6 +48,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/7a/4daaf3b6c08ad7ceffea4634ec206faeff697526421c20f07628c7372156/anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352", size = 93052 }, ] +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + [[package]] name = "babel" version = "2.16.0" @@ -252,6 +266,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "commonmark" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/48/a60f593447e8f0894ebb7f6e6c1f25dafc5e89c5879fdc9360ae93ff83f0/commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", size = 95764 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/92/dfd892312d822f36c55366118b95d914e5f16de11044a27cf10a7d71bbbf/commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9", size = 51068 }, +] + [[package]] name = "coverage" version = "7.6.9" @@ -355,6 +390,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/d9/28edf32ee2fcdca587146bcde90102a7319b2f2c690edfa627e46d586050/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", size = 4090937 }, ] +[[package]] +name = "debugpy" +version = "1.8.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/25/c74e337134edf55c4dfc9af579eccb45af2393c40960e2795a94351e8140/debugpy-1.8.12.tar.gz", hash = "sha256:646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce", size = 1641122 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/19/dd58334c0a1ec07babf80bf29fb8daf1a7ca4c1a3bbe61548e40616ac087/debugpy-1.8.12-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:a2ba7ffe58efeae5b8fad1165357edfe01464f9aef25e814e891ec690e7dd82a", size = 2076091 }, + { url = "https://files.pythonhosted.org/packages/4c/37/bde1737da15f9617d11ab7b8d5267165f1b7dae116b2585a6643e89e1fa2/debugpy-1.8.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbbd4149c4fc5e7d508ece083e78c17442ee13b0e69bfa6bd63003e486770f45", size = 3560717 }, + { url = "https://files.pythonhosted.org/packages/d9/ca/bc67f5a36a7de072908bc9e1156c0f0b272a9a2224cf21540ab1ffd71a1f/debugpy-1.8.12-cp310-cp310-win32.whl", hash = "sha256:b202f591204023b3ce62ff9a47baa555dc00bb092219abf5caf0e3718ac20e7c", size = 5180672 }, + { url = "https://files.pythonhosted.org/packages/c1/b9/e899c0a80dfa674dbc992f36f2b1453cd1ee879143cdb455bc04fce999da/debugpy-1.8.12-cp310-cp310-win_amd64.whl", hash = "sha256:9649eced17a98ce816756ce50433b2dd85dfa7bc92ceb60579d68c053f98dff9", size = 5212702 }, + { url = "https://files.pythonhosted.org/packages/af/9f/5b8af282253615296264d4ef62d14a8686f0dcdebb31a669374e22fff0a4/debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:36f4829839ef0afdfdd208bb54f4c3d0eea86106d719811681a8627ae2e53dd5", size = 2174643 }, + { url = "https://files.pythonhosted.org/packages/ef/31/f9274dcd3b0f9f7d1e60373c3fa4696a585c55acb30729d313bb9d3bcbd1/debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28ed481d530e3138553be60991d2d61103ce6da254e51547b79549675f539b7", size = 3133457 }, + { url = "https://files.pythonhosted.org/packages/ab/ca/6ee59e9892e424477e0c76e3798046f1fd1288040b927319c7a7b0baa484/debugpy-1.8.12-cp311-cp311-win32.whl", hash = "sha256:4ad9a94d8f5c9b954e0e3b137cc64ef3f579d0df3c3698fe9c3734ee397e4abb", size = 5106220 }, + { url = "https://files.pythonhosted.org/packages/d5/1a/8ab508ab05ede8a4eae3b139bbc06ea3ca6234f9e8c02713a044f253be5e/debugpy-1.8.12-cp311-cp311-win_amd64.whl", hash = "sha256:4703575b78dd697b294f8c65588dc86874ed787b7348c65da70cfc885efdf1e1", size = 5130481 }, + { url = "https://files.pythonhosted.org/packages/ba/e6/0f876ecfe5831ebe4762b19214364753c8bc2b357d28c5d739a1e88325c7/debugpy-1.8.12-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:7e94b643b19e8feb5215fa508aee531387494bf668b2eca27fa769ea11d9f498", size = 2500846 }, + { url = "https://files.pythonhosted.org/packages/19/64/33f41653a701f3cd2cbff8b41ebaad59885b3428b5afd0d93d16012ecf17/debugpy-1.8.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086b32e233e89a2740c1615c2f775c34ae951508b28b308681dbbb87bba97d06", size = 4222181 }, + { url = "https://files.pythonhosted.org/packages/32/a6/02646cfe50bfacc9b71321c47dc19a46e35f4e0aceea227b6d205e900e34/debugpy-1.8.12-cp312-cp312-win32.whl", hash = "sha256:2ae5df899732a6051b49ea2632a9ea67f929604fd2b036613a9f12bc3163b92d", size = 5227017 }, + { url = "https://files.pythonhosted.org/packages/da/a6/10056431b5c47103474312cf4a2ec1001f73e0b63b1216706d5fef2531eb/debugpy-1.8.12-cp312-cp312-win_amd64.whl", hash = "sha256:39dfbb6fa09f12fae32639e3286112fc35ae976114f1f3d37375f3130a820969", size = 5267555 }, + { url = "https://files.pythonhosted.org/packages/cf/4d/7c3896619a8791effd5d8c31f0834471fc8f8fb3047ec4f5fc69dd1393dd/debugpy-1.8.12-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:696d8ae4dff4cbd06bf6b10d671e088b66669f110c7c4e18a44c43cf75ce966f", size = 2485246 }, + { url = "https://files.pythonhosted.org/packages/99/46/bc6dcfd7eb8cc969a5716d858e32485eb40c72c6a8dc88d1e3a4d5e95813/debugpy-1.8.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:898fba72b81a654e74412a67c7e0a81e89723cfe2a3ea6fcd3feaa3395138ca9", size = 4218616 }, + { url = "https://files.pythonhosted.org/packages/03/dd/d7fcdf0381a9b8094da1f6a1c9f19fed493a4f8576a2682349b3a8b20ec7/debugpy-1.8.12-cp313-cp313-win32.whl", hash = "sha256:22a11c493c70413a01ed03f01c3c3a2fc4478fc6ee186e340487b2edcd6f4180", size = 5226540 }, + { url = "https://files.pythonhosted.org/packages/25/bd/ecb98f5b5fc7ea0bfbb3c355bc1dd57c198a28780beadd1e19915bf7b4d9/debugpy-1.8.12-cp313-cp313-win_amd64.whl", hash = "sha256:fdb3c6d342825ea10b90e43d7f20f01535a72b3a1997850c0c3cefa5c27a4a2c", size = 5267134 }, + { url = "https://files.pythonhosted.org/packages/89/37/a3333c5b69c086465ea3c073424ef2775e52a6c17276f642f64209c4a082/debugpy-1.8.12-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:b5c6c967d02fee30e157ab5227706f965d5c37679c687b1e7bbc5d9e7128bd41", size = 2077275 }, + { url = "https://files.pythonhosted.org/packages/50/1d/99f6a0a78b4b513ff2b0d0e44c1e705f7ee34e3aba0e8add617d339d97dc/debugpy-1.8.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a77f422f31f170c4b7e9ca58eae2a6c8e04da54121900651dfa8e66c29901a", size = 3555956 }, + { url = "https://files.pythonhosted.org/packages/b8/86/c624665aaa807d065da2016b05e9f2fb4fa56872d67a5fbd7751e77f7f88/debugpy-1.8.12-cp39-cp39-win32.whl", hash = "sha256:a4042edef80364239f5b7b5764e55fd3ffd40c32cf6753da9bda4ff0ac466018", size = 5181535 }, + { url = "https://files.pythonhosted.org/packages/72/c7/d59a0f845ce1677b5c2bb170f08cc1cc3531625a5fdce9c67bd31116540a/debugpy-1.8.12-cp39-cp39-win_amd64.whl", hash = "sha256:f30b03b0f27608a0b26c75f0bb8a880c752c0e0b01090551b9d87c7d783e2069", size = 5213601 }, + { url = "https://files.pythonhosted.org/packages/38/c4/5120ad36405c3008f451f94b8f92ef1805b1e516f6ff870f331ccb3c4cc0/debugpy-1.8.12-py2.py3-none-any.whl", hash = "sha256:274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6", size = 5229490 }, +] + +[[package]] +name = "decorator" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, +] + [[package]] name = "distlib" version = "0.3.9" @@ -400,6 +473,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, ] +[[package]] +name = "executing" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 }, +] + [[package]] name = "filelock" version = "3.16.1" @@ -409,6 +491,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] +[[package]] +name = "fsspec" +version = "2024.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862 }, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -545,6 +636,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 }, ] +[[package]] +name = "huggingface-hub" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/d2/d6976de7542792fc077b498d64af64882b6d8bb40679284ec0bff77d5929/huggingface_hub-0.27.1.tar.gz", hash = "sha256:c004463ca870283909d715d20f066ebd6968c2207dae9393fdffb3c1d4d8f98b", size = 379407 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/3f/50f6b25fafdcfb1c089187a328c95081abf882309afd86f4053951507cd1/huggingface_hub-0.27.1-py3-none-any.whl", hash = "sha256:1c5155ca7d60b60c2e2fc38cbb3ffb7f7c3adf48f824015b219af9061771daec", size = 450658 }, +] + [[package]] name = "hyperlink" version = "21.0.0" @@ -571,7 +680,7 @@ name = "importlib-metadata" version = "8.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp" }, + { name = "zipp", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 } wheels = [ @@ -587,6 +696,82 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "ipython", version = "8.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "8.18.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version < '3.10'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, + { name = "jedi", marker = "python_full_version < '3.10'" }, + { name = "matplotlib-inline", marker = "python_full_version < '3.10'" }, + { name = "pexpect", marker = "python_full_version < '3.10' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "stack-data", marker = "python_full_version < '3.10'" }, + { name = "traitlets", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/b9/3ba6c45a6df813c09a48bac313c22ff83efa26cbb55011218d925a46e2ad/ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", size = 5486330 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/6b/d9fdcdef2eb6a23f391251fde8781c38d42acd82abe84d054cb74f7863b0/ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397", size = 808161 }, +] + +[[package]] +name = "ipython" +version = "8.31.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version >= '3.10' and python_full_version < '3.12'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.10'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "jedi", marker = "python_full_version >= '3.10'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.10'" }, + { name = "pexpect", marker = "python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "stack-data", marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 }, +] + [[package]] name = "jaraco-classes" version = "3.4.0" @@ -623,6 +808,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", size = 10187 }, ] +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + [[package]] name = "jeepney" version = "0.8.0" @@ -715,6 +912,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/b7/a3cde72c644fd1caf9da07fb38cf2c130f43484d8f91011940b7c4f42c8f/jiter-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1c0dfbd1be3cbefc7510102370d86e35d1d53e5a93d48519688b1bf0f761160a", size = 207527 }, ] +[[package]] +name = "joblib" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, +] + [[package]] name = "jsonpath-python" version = "1.0.6" @@ -724,6 +930,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/8a/d63959f4eff03893a00e6e63592e3a9f15b9266ed8e0275ab77f8c7dbc94/jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575", size = 7552 }, ] +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, +] + +[[package]] +name = "keybert" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "rich" }, + { name = "scikit-learn" }, + { name = "sentence-transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/a6/28ece89c550f0698585ea254eb5f7263433a1796b0b5ce98233f1249404d/keybert-0.8.5.tar.gz", hash = "sha256:4b8e4b4d129b319b6266c77b9c8ed34e94e5db42a977c977c8ae58f57343995f", size = 30185 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/b6/0258658e776c747765a1584cbd3861303f9ba34ee6beea6d6b8b21d47630/keybert-0.8.5-py3-none-any.whl", hash = "sha256:005e0eab30c8e85c249ccc6eaad7741357e692591b3eaebe64c40f12614c2ca9", size = 37463 }, +] + [[package]] name = "keyring" version = "25.6.0" @@ -843,6 +1096,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/73/085399401383ce949f727afec55ec3abd76648d04b9f22e1c0e99cb4bec3/MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", size = 15506 }, ] +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -861,6 +1138,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, ] +[[package]] +name = "mistletoe" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/96/ea46a376a7c4cd56955ecdfff0ea68de43996a4e6d1aee4599729453bd11/mistletoe-1.4.0.tar.gz", hash = "sha256:1630f906e5e4bbe66fdeb4d29d277e2ea515d642bb18a9b49b136361a9818c9d", size = 107203 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/0f/b5e545f0c7962be90366af3418989b12cf441d9da1e5d89d88f2f3e5cf8f/mistletoe-1.4.0-py3-none-any.whl", hash = "sha256:44a477803861de1237ba22e375c6b617690a31d2902b47279d1f8f7ed498a794", size = 51304 }, +] + [[package]] name = "mistralai" version = "1.2.5" @@ -958,6 +1244,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", size = 60952 }, ] +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + [[package]] name = "mypy" version = "1.14.0" @@ -1006,6 +1301,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + +[[package]] +name = "networkx" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772 }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version >= '3.10' and python_full_version < '3.12'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, +] + [[package]] name = "nodeenv" version = "1.9.1" @@ -1015,6 +1344,247 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, ] +[[package]] +name = "numpy" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540 }, + { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623 }, + { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774 }, + { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081 }, + { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451 }, + { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572 }, + { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722 }, + { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170 }, + { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558 }, + { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137 }, + { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552 }, + { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957 }, + { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573 }, + { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330 }, + { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895 }, + { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253 }, + { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074 }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640 }, + { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230 }, + { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803 }, + { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835 }, + { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499 }, + { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497 }, + { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158 }, + { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173 }, + { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174 }, + { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701 }, + { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313 }, + { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 }, + { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942 }, + { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512 }, + { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976 }, + { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494 }, + { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596 }, + { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099 }, + { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823 }, + { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424 }, + { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809 }, + { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314 }, + { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288 }, + { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793 }, + { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885 }, + { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784 }, +] + +[[package]] +name = "numpy" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version >= '3.10' and python_full_version < '3.12'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/2a/69033dc22d981ad21325314f8357438078f5c28310a6d89fb3833030ec8a/numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e", size = 21215825 }, + { url = "https://files.pythonhosted.org/packages/31/2c/39f91e00bbd3d5639b027ac48c55dc5f2992bd2b305412d26be4c830862a/numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e", size = 14354996 }, + { url = "https://files.pythonhosted.org/packages/0a/2c/d468ebd253851af10de5b3e8f3418ebabfaab5f0337a75299fbeb8b8c17a/numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715", size = 5393621 }, + { url = "https://files.pythonhosted.org/packages/7f/f4/3d8a5a0da297034106c5de92be881aca7079cde6058934215a1de91334f6/numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a", size = 6928931 }, + { url = "https://files.pythonhosted.org/packages/47/a7/029354ab56edd43dd3f5efbfad292b8844f98b93174f322f82353fa46efa/numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97", size = 14333157 }, + { url = "https://files.pythonhosted.org/packages/e3/d7/11fc594838d35c43519763310c316d4fd56f8600d3fc80a8e13e325b5c5c/numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957", size = 16381794 }, + { url = "https://files.pythonhosted.org/packages/af/d4/dd9b19cd4aff9c79d3f54d17f8be815407520d3116004bc574948336981b/numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d", size = 15543990 }, + { url = "https://files.pythonhosted.org/packages/30/97/ab96b7650f27f684a9b1e46757a7294ecc50cab27701d05f146e9f779627/numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd", size = 18170896 }, + { url = "https://files.pythonhosted.org/packages/81/9b/bae9618cab20db67a2ca9d711795cad29b2ca4b73034dd3b5d05b962070a/numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160", size = 6573458 }, + { url = "https://files.pythonhosted.org/packages/92/9b/95678092febd14070cfb7906ea7932e71e9dd5a6ab3ee948f9ed975e905d/numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014", size = 12915812 }, + { url = "https://files.pythonhosted.org/packages/21/67/32c68756eed84df181c06528ff57e09138f893c4653448c4967311e0f992/numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189", size = 21220002 }, + { url = "https://files.pythonhosted.org/packages/3b/89/f43bcad18f2b2e5814457b1c7f7b0e671d0db12c8c0e43397ab8cb1831ed/numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323", size = 14391215 }, + { url = "https://files.pythonhosted.org/packages/9c/e6/efb8cd6122bf25e86e3dd89d9dbfec9e6861c50e8810eed77d4be59b51c6/numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac", size = 5391918 }, + { url = "https://files.pythonhosted.org/packages/47/e2/fccf89d64d9b47ffb242823d4e851fc9d36fa751908c9aac2807924d9b4e/numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e", size = 6933133 }, + { url = "https://files.pythonhosted.org/packages/34/22/5ece749c0e5420a9380eef6fbf83d16a50010bd18fef77b9193d80a6760e/numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c", size = 14338187 }, + { url = "https://files.pythonhosted.org/packages/5b/86/caec78829311f62afa6fa334c8dfcd79cffb4d24bcf96ee02ae4840d462b/numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f", size = 16393429 }, + { url = "https://files.pythonhosted.org/packages/c8/4e/0c25f74c88239a37924577d6ad780f3212a50f4b4b5f54f5e8c918d726bd/numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826", size = 15559103 }, + { url = "https://files.pythonhosted.org/packages/d4/bd/d557f10fa50dc4d5871fb9606af563249b66af2fc6f99041a10e8757c6f1/numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8", size = 18182967 }, + { url = "https://files.pythonhosted.org/packages/30/e9/66cc0f66386d78ed89e45a56e2a1d051e177b6e04477c4a41cd590ef4017/numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50", size = 6571499 }, + { url = "https://files.pythonhosted.org/packages/66/a3/4139296b481ae7304a43581046b8f0a20da6a0dfe0ee47a044cade796603/numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2", size = 12919805 }, + { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, + { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, + { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, + { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, + { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, + { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, + { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, + { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, + { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, + { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 }, + { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 }, + { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 }, + { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 }, + { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 }, + { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 }, + { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 }, + { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 }, + { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 }, + { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 }, + { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 }, + { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 }, + { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 }, + { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 }, + { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 }, + { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 }, + { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 }, + { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 }, + { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 }, + { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 }, + { url = "https://files.pythonhosted.org/packages/96/7e/1dd770ee68916ed358991ab62c2cc353ffd98d0b75b901d52183ca28e8bb/numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495", size = 21047291 }, + { url = "https://files.pythonhosted.org/packages/d1/3c/ccd08578dc532a8e6927952339d4a02682b776d5e85be49ed0760308433e/numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df", size = 6792494 }, + { url = "https://files.pythonhosted.org/packages/7c/28/8754b9aee4f97199f9a047f73bb644b5a2014994a6d7b061ba67134a42de/numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a", size = 16197312 }, + { url = "https://files.pythonhosted.org/packages/26/96/deb93f871f401045a684ca08a009382b247d14996d7a94fea6aa43c67b94/numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60", size = 12822674 }, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.4.5.8" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/7f/7fbae15a3982dc9595e49ce0f19332423b260045d0a6afe93cdbe2f1f624/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3", size = 363333771 }, + { url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805 }, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/b5/9fb3d00386d3361b03874246190dfec7b206fd74e6e287b26a8fcb359d95/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a", size = 12354556 }, + { url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957 }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/aa/083b01c427e963ad0b314040565ea396f914349914c298556484f799e61b/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198", size = 24133372 }, + { url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306 }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/aa/b656d755f474e2084971e9a297def515938d56b466ab39624012070cb773/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3", size = 894177 }, + { url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737 }, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.1.0.70" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, +] + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/8a/0e728f749baca3fbeffad762738276e5df60851958be7783af121a7221e7/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399", size = 211422548 }, + { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117 }, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.5.147" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/9c/a79180e4d70995fdf030c6946991d0171555c6edf95c265c6b2bf7011112/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9", size = 56314811 }, + { url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206 }, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.6.1.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/6b/a5c33cf16af09166845345275c34ad2190944bcc6026797a39f8e0a282e0/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e", size = 127634111 }, + { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057 }, +] + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.3.1.170" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/a9/c0d2f83a53d40a4a41be14cea6a0bf9e668ffcf8b004bd65633f433050c0/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3", size = 207381987 }, + { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763 }, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.21.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/99/12cd266d6233f47d00daf3a72739872bdc10267d0383508b0b9c84a18bb6/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", size = 188654414 }, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/45/239d52c05074898a80a900f49b1615d81c07fceadd5ad6c4f86a987c0bc4/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83", size = 20552510 }, + { url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810 }, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/39/471f581edbb7804b39e8063d92fc8305bdc7a80ae5c07dbe6ea5c50d14a5/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3", size = 100417 }, + { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, +] + [[package]] name = "openai" version = "1.58.1" @@ -1052,6 +1622,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, ] +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + [[package]] name = "pathspec" version = "0.12.1" @@ -1073,6 +1652,84 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, ] +[[package]] +name = "pillow" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/1c/2dcea34ac3d7bc96a1fd1bd0a6e06a57c67167fec2cff8d95d88229a8817/pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", size = 3229983 }, + { url = "https://files.pythonhosted.org/packages/14/ca/6bec3df25e4c88432681de94a3531cc738bd85dea6c7aa6ab6f81ad8bd11/pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", size = 3101831 }, + { url = "https://files.pythonhosted.org/packages/d4/2c/668e18e5521e46eb9667b09e501d8e07049eb5bfe39d56be0724a43117e6/pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", size = 4314074 }, + { url = "https://files.pythonhosted.org/packages/02/80/79f99b714f0fc25f6a8499ecfd1f810df12aec170ea1e32a4f75746051ce/pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", size = 4394933 }, + { url = "https://files.pythonhosted.org/packages/81/aa/8d4ad25dc11fd10a2001d5b8a80fdc0e564ac33b293bdfe04ed387e0fd95/pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", size = 4353349 }, + { url = "https://files.pythonhosted.org/packages/84/7a/cd0c3eaf4a28cb2a74bdd19129f7726277a7f30c4f8424cd27a62987d864/pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", size = 4476532 }, + { url = "https://files.pythonhosted.org/packages/8f/8b/a907fdd3ae8f01c7670dfb1499c53c28e217c338b47a813af8d815e7ce97/pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", size = 4279789 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/9f139d9e8cccd661c3efbf6898967a9a337eb2e9be2b454ba0a09533100d/pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", size = 4413131 }, + { url = "https://files.pythonhosted.org/packages/a8/68/0d8d461f42a3f37432203c8e6df94da10ac8081b6d35af1c203bf3111088/pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", size = 2291213 }, + { url = "https://files.pythonhosted.org/packages/14/81/d0dff759a74ba87715509af9f6cb21fa21d93b02b3316ed43bda83664db9/pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", size = 2625725 }, + { url = "https://files.pythonhosted.org/packages/ce/1f/8d50c096a1d58ef0584ddc37e6f602828515219e9d2428e14ce50f5ecad1/pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", size = 2375213 }, + { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 }, + { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 }, + { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 }, + { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 }, + { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 }, + { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 }, + { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 }, + { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 }, + { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 }, + { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 }, + { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 }, + { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, + { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, + { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, + { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, + { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, + { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, + { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, + { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, + { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, + { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, + { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, + { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, + { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, + { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, + { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, + { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, + { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, + { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, + { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, + { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, + { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, + { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, + { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, + { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, + { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, + { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, + { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, + { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, + { url = "https://files.pythonhosted.org/packages/9a/1f/9df5ac77491fddd2e36c352d16976dc11fbe6ab842f5df85fd7e31b847b9/pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6", size = 3229995 }, + { url = "https://files.pythonhosted.org/packages/a6/62/c7b359e924dca274173b04922ac06aa63614f7e934d132f2fe1d852509aa/pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e", size = 3101890 }, + { url = "https://files.pythonhosted.org/packages/7b/63/136f21340a434de895b62bcf2c386005a8aa24066c4facd619f5e0e9f283/pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc", size = 4310366 }, + { url = "https://files.pythonhosted.org/packages/f6/46/0bd0ca03d9d1164a7fa33d285ef6d1c438e963d0c8770e4c5b3737ef5abe/pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2", size = 4391582 }, + { url = "https://files.pythonhosted.org/packages/0c/55/f182db572b28bd833b8e806f933f782ceb2df64c40e4d8bd3d4226a46eca/pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade", size = 4350278 }, + { url = "https://files.pythonhosted.org/packages/75/fb/e330fdbbcbc4744214b5f53b84d9d8a9f4ffbebc2e9c2ac10475386e3296/pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884", size = 4471768 }, + { url = "https://files.pythonhosted.org/packages/eb/51/20ee6c4da4448d7a67ffb720a5fcdb965115a78e211a1f58f9845ae15f86/pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196", size = 4276549 }, + { url = "https://files.pythonhosted.org/packages/37/f2/a25c0bdaa6d6fd5cc3d4a6f65b5a7ea46e7af58bee00a98efe0a5af79c58/pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8", size = 4409350 }, + { url = "https://files.pythonhosted.org/packages/12/a7/06687947604cd3e47abeea1b78b65d34ffce7feab03cfe0dd985f115dca3/pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5", size = 2291271 }, + { url = "https://files.pythonhosted.org/packages/21/a6/f51d47675940b5c63b08ff0575b3518428b4acb891f88526fa4ee1edab6f/pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f", size = 2625783 }, + { url = "https://files.pythonhosted.org/packages/95/56/97750bd33e68648fa432dfadcb8ede7624bd905822d42262d34bcebdd9d7/pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a", size = 2375193 }, + { url = "https://files.pythonhosted.org/packages/fa/c5/389961578fb677b8b3244fcd934f720ed25a148b9a5cc81c91bdf59d8588/pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", size = 3198345 }, + { url = "https://files.pythonhosted.org/packages/c4/fa/803c0e50ffee74d4b965229e816af55276eac1d5806712de86f9371858fd/pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", size = 3072938 }, + { url = "https://files.pythonhosted.org/packages/dc/67/2a3a5f8012b5d8c63fe53958ba906c1b1d0482ebed5618057ef4d22f8076/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", size = 3400049 }, + { url = "https://files.pythonhosted.org/packages/e5/a0/514f0d317446c98c478d1872497eb92e7cde67003fed74f696441e647446/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", size = 3422431 }, + { url = "https://files.pythonhosted.org/packages/cd/00/20f40a935514037b7d3f87adfc87d2c538430ea625b63b3af8c3f5578e72/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", size = 3446208 }, + { url = "https://files.pythonhosted.org/packages/28/3c/7de681727963043e093c72e6c3348411b0185eab3263100d4490234ba2f6/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", size = 3509746 }, + { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353 }, +] + [[package]] name = "platformdirs" version = "4.3.6" @@ -1091,6 +1748,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, +] + +[[package]] +name = "psutil" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, + { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, + { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, + { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, + { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, + { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, + { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, +] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -1100,6 +1784,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, ] +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + [[package]] name = "pyasn1" version = "0.6.1" @@ -1377,6 +2070,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, ] +[[package]] +name = "pytest-mock" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863 }, +] + [[package]] name = "pytest-pretty" version = "1.2.0" @@ -1451,6 +2156,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, ] +[[package]] +name = "pywin32" +version = "308" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/a6/3e9f2c474895c1bb61b11fa9640be00067b5c5b363c501ee9c3fa53aec01/pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", size = 5927028 }, + { url = "https://files.pythonhosted.org/packages/d9/b4/84e2463422f869b4b718f79eb7530a4c1693e96b8a4e5e968de38be4d2ba/pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", size = 6558484 }, + { url = "https://files.pythonhosted.org/packages/9f/8f/fb84ab789713f7c6feacaa08dad3ec8105b88ade8d1c4f0f0dfcaaa017d6/pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", size = 7971454 }, + { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, + { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, + { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, + { url = "https://files.pythonhosted.org/packages/a8/41/ead05a7657ffdbb1edabb954ab80825c4f87a3de0285d59f8290457f9016/pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341", size = 5991824 }, + { url = "https://files.pythonhosted.org/packages/e4/cd/0838c9a6063bff2e9bac2388ae36524c26c50288b5d7b6aebb6cdf8d375d/pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920", size = 6640327 }, +] + [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -1525,6 +2251,96 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 }, ] +[[package]] +name = "pyzmq" +version = "26.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/a8/9837c39aba390eb7d01924ace49d761c8dbe7bc2d6082346d00c8332e431/pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", size = 1340058 }, + { url = "https://files.pythonhosted.org/packages/a2/1f/a006f2e8e4f7d41d464272012695da17fb95f33b54342612a6890da96ff6/pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", size = 1008818 }, + { url = "https://files.pythonhosted.org/packages/b6/09/b51b6683fde5ca04593a57bbe81788b6b43114d8f8ee4e80afc991e14760/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", size = 673199 }, + { url = "https://files.pythonhosted.org/packages/c9/78/486f3e2e824f3a645238332bf5a4c4b4477c3063033a27c1e4052358dee2/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", size = 911762 }, + { url = "https://files.pythonhosted.org/packages/5e/3b/2eb1667c9b866f53e76ee8b0c301b0469745a23bd5a87b7ee3d5dd9eb6e5/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", size = 868773 }, + { url = "https://files.pythonhosted.org/packages/16/29/ca99b4598a9dc7e468b5417eda91f372b595be1e3eec9b7cbe8e5d3584e8/pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", size = 868834 }, + { url = "https://files.pythonhosted.org/packages/ad/e5/9efaeb1d2f4f8c50da04144f639b042bc52869d3a206d6bf672ab3522163/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", size = 1202861 }, + { url = "https://files.pythonhosted.org/packages/c3/62/c721b5608a8ac0a69bb83cbb7d07a56f3ff00b3991a138e44198a16f94c7/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", size = 1515304 }, + { url = "https://files.pythonhosted.org/packages/87/84/e8bd321aa99b72f48d4606fc5a0a920154125bd0a4608c67eab742dab087/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", size = 1414712 }, + { url = "https://files.pythonhosted.org/packages/cd/cd/420e3fd1ac6977b008b72e7ad2dae6350cc84d4c5027fc390b024e61738f/pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", size = 578113 }, + { url = "https://files.pythonhosted.org/packages/5c/57/73930d56ed45ae0cb4946f383f985c855c9b3d4063f26416998f07523c0e/pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", size = 641631 }, + { url = "https://files.pythonhosted.org/packages/61/d2/ae6ac5c397f1ccad59031c64beaafce7a0d6182e0452cc48f1c9c87d2dd0/pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", size = 543528 }, + { url = "https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", size = 1340639 }, + { url = "https://files.pythonhosted.org/packages/98/4d/5000468bd64c7910190ed0a6c76a1ca59a68189ec1f007c451dc181a22f4/pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", size = 1008710 }, + { url = "https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", size = 673129 }, + { url = "https://files.pythonhosted.org/packages/86/94/99085a3f492aa538161cbf27246e8886ff850e113e0c294a5b8245f13b52/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", size = 910107 }, + { url = "https://files.pythonhosted.org/packages/31/1d/346809e8a9b999646d03f21096428453465b1bca5cd5c64ecd048d9ecb01/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", size = 867960 }, + { url = "https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", size = 869204 }, + { url = "https://files.pythonhosted.org/packages/0f/f9/18417771dee223ccf0f48e29adf8b4e25ba6d0e8285e33bcbce078070bc3/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", size = 1203351 }, + { url = "https://files.pythonhosted.org/packages/e0/46/f13e67fe0d4f8a2315782cbad50493de6203ea0d744610faf4d5f5b16e90/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", size = 1514204 }, + { url = "https://files.pythonhosted.org/packages/50/11/ddcf7343b7b7a226e0fc7b68cbf5a5bb56291fac07f5c3023bb4c319ebb4/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", size = 1414339 }, + { url = "https://files.pythonhosted.org/packages/01/14/1c18d7d5b7be2708f513f37c61bfadfa62161c10624f8733f1c8451b3509/pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", size = 576928 }, + { url = "https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", size = 642317 }, + { url = "https://files.pythonhosted.org/packages/98/77/1cbfec0358078a4c5add529d8a70892db1be900980cdb5dd0898b3d6ab9d/pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", size = 543834 }, + { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 }, + { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 }, + { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 }, + { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 }, + { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 }, + { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 }, + { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 }, + { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 }, + { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 }, + { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 }, + { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 }, + { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, + { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 }, + { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 }, + { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 }, + { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 }, + { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 }, + { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 }, + { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 }, + { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 }, + { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 }, + { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 }, + { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 }, + { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 }, + { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 }, + { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 }, + { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 }, + { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 }, + { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 }, + { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 }, + { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, + { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, + { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, + { url = "https://files.pythonhosted.org/packages/ac/9e/ad5fbbe1bcc7a9d1e8c5f4f7de48f2c1dc481e151ef80cc1ce9a7fe67b55/pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2", size = 1341256 }, + { url = "https://files.pythonhosted.org/packages/4c/d9/d7a8022108c214803a82b0b69d4885cee00933d21928f1f09dca371cf4bf/pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c", size = 1009385 }, + { url = "https://files.pythonhosted.org/packages/ed/69/0529b59ac667ea8bfe8796ac71796b688fbb42ff78e06525dabfed3bc7ae/pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98", size = 908009 }, + { url = "https://files.pythonhosted.org/packages/6e/bd/3ff3e1172f12f55769793a3a334e956ec2886805ebfb2f64756b6b5c6a1a/pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9", size = 862078 }, + { url = "https://files.pythonhosted.org/packages/c3/ec/ab13585c3a1f48e2874253844c47b194d56eb25c94718691349c646f336f/pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db", size = 673756 }, + { url = "https://files.pythonhosted.org/packages/1e/be/febcd4b04dd50ee6d514dfbc33a3d5d9cb38ec9516e02bbfc929baa0f141/pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073", size = 1203684 }, + { url = "https://files.pythonhosted.org/packages/16/28/304150e71afd2df3b82f52f66c0d8ab9ac6fe1f1ffdf92bad4c8cc91d557/pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc", size = 1515864 }, + { url = "https://files.pythonhosted.org/packages/18/89/8d48d8cd505c12a1f5edee597cc32ffcedc65fd8d2603aebaaedc38a7041/pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940", size = 1415383 }, + { url = "https://files.pythonhosted.org/packages/d4/7e/43a60c3b179f7da0cbc2b649bd2702fd6a39bff5f72aa38d6e1aeb00256d/pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44", size = 578540 }, + { url = "https://files.pythonhosted.org/packages/3a/55/8841dcd28f783ad06674c8fe8d7d72794b548d0bff8829aaafeb72e8b44d/pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec", size = 642147 }, + { url = "https://files.pythonhosted.org/packages/b4/78/b3c31ccfcfcdd6ea50b6abc8f46a2a7aadb9c3d40531d1b908d834aaa12e/pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb", size = 543903 }, + { url = "https://files.pythonhosted.org/packages/53/fb/36b2b2548286e9444e52fcd198760af99fd89102b5be50f0660fcfe902df/pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", size = 906955 }, + { url = "https://files.pythonhosted.org/packages/77/8f/6ce54f8979a01656e894946db6299e2273fcee21c8e5fa57c6295ef11f57/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", size = 565701 }, + { url = "https://files.pythonhosted.org/packages/ee/1c/bf8cd66730a866b16db8483286078892b7f6536f8c389fb46e4beba0a970/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", size = 794312 }, + { url = "https://files.pythonhosted.org/packages/71/43/91fa4ff25bbfdc914ab6bafa0f03241d69370ef31a761d16bb859f346582/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", size = 752775 }, + { url = "https://files.pythonhosted.org/packages/ec/d2/3b2ab40f455a256cb6672186bea95cd97b459ce4594050132d71e76f0d6f/pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", size = 550762 }, + { url = "https://files.pythonhosted.org/packages/6c/78/3096d72581365dfb0081ac9512a3b53672fa69854aa174d78636510c4db8/pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3", size = 906945 }, + { url = "https://files.pythonhosted.org/packages/da/f2/8054574d77c269c31d055d4daf3d8407adf61ea384a50c8d14b158551d09/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a", size = 565698 }, + { url = "https://files.pythonhosted.org/packages/77/21/c3ad93236d1d60eea10b67528f55e7db115a9d32e2bf163fcf601f85e9cc/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6", size = 794307 }, + { url = "https://files.pythonhosted.org/packages/6a/49/e95b491724500fcb760178ce8db39b923429e328e57bcf9162e32c2c187c/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a", size = 752769 }, + { url = "https://files.pythonhosted.org/packages/9b/a9/50c9c06762b30792f71aaad8d1886748d39c4bffedc1171fbc6ad2b92d67/pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4", size = 751338 }, + { url = "https://files.pythonhosted.org/packages/ca/63/27e6142b4f67a442ee480986ca5b88edb01462dd2319843057683a5148bd/pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f", size = 550757 }, +] + [[package]] name = "regex" version = "2024.11.6" @@ -1676,6 +2492,165 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/9f/026e18ca7d7766783d779dae5e9c656746c6ede36ef73c6d934aaf4a6dec/ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08", size = 9074500 }, ] +[[package]] +name = "safetensors" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/4f/2ef9ef1766f8c194b01b67a63a444d2e557c8fe1d82faf3ebd85f370a917/safetensors-0.5.2.tar.gz", hash = "sha256:cb4a8d98ba12fa016f4241932b1fc5e702e5143f5374bba0bbcf7ddc1c4cf2b8", size = 66957 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/d1/017e31e75e274492a11a456a9e7c171f8f7911fe50735b4ec6ff37221220/safetensors-0.5.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:45b6092997ceb8aa3801693781a71a99909ab9cc776fbc3fa9322d29b1d3bef2", size = 427067 }, + { url = "https://files.pythonhosted.org/packages/24/84/e9d3ff57ae50dd0028f301c9ee064e5087fe8b00e55696677a0413c377a7/safetensors-0.5.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6d0d6a8ee2215a440e1296b843edf44fd377b055ba350eaba74655a2fe2c4bae", size = 408856 }, + { url = "https://files.pythonhosted.org/packages/f1/1d/fe95f5dd73db16757b11915e8a5106337663182d0381811c81993e0014a9/safetensors-0.5.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86016d40bcaa3bcc9a56cd74d97e654b5f4f4abe42b038c71e4f00a089c4526c", size = 450088 }, + { url = "https://files.pythonhosted.org/packages/cf/21/e527961b12d5ab528c6e47b92d5f57f33563c28a972750b238b871924e49/safetensors-0.5.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:990833f70a5f9c7d3fc82c94507f03179930ff7d00941c287f73b6fcbf67f19e", size = 458966 }, + { url = "https://files.pythonhosted.org/packages/a5/8b/1a037d7a57f86837c0b41905040369aea7d8ca1ec4b2a77592372b2ec380/safetensors-0.5.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dfa7c2f3fe55db34eba90c29df94bcdac4821043fc391cb5d082d9922013869", size = 509915 }, + { url = "https://files.pythonhosted.org/packages/61/3d/03dd5cfd33839df0ee3f4581a20bd09c40246d169c0e4518f20b21d5f077/safetensors-0.5.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46ff2116150ae70a4e9c490d2ab6b6e1b1b93f25e520e540abe1b81b48560c3a", size = 527664 }, + { url = "https://files.pythonhosted.org/packages/c5/dc/8952caafa9a10a3c0f40fa86bacf3190ae7f55fa5eef87415b97b29cb97f/safetensors-0.5.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab696dfdc060caffb61dbe4066b86419107a24c804a4e373ba59be699ebd8d5", size = 461978 }, + { url = "https://files.pythonhosted.org/packages/60/da/82de1fcf1194e3dbefd4faa92dc98b33c06bed5d67890e0962dd98e18287/safetensors-0.5.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03c937100f38c9ff4c1507abea9928a6a9b02c9c1c9c3609ed4fb2bf413d4975", size = 491253 }, + { url = "https://files.pythonhosted.org/packages/5a/9a/d90e273c25f90c3ba1b0196a972003786f04c39e302fbd6649325b1272bb/safetensors-0.5.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a00e737948791b94dad83cf0eafc09a02c4d8c2171a239e8c8572fe04e25960e", size = 628644 }, + { url = "https://files.pythonhosted.org/packages/70/3c/acb23e05aa34b4f5edd2e7f393f8e6480fbccd10601ab42cd03a57d4ab5f/safetensors-0.5.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:d3a06fae62418ec8e5c635b61a8086032c9e281f16c63c3af46a6efbab33156f", size = 721648 }, + { url = "https://files.pythonhosted.org/packages/71/45/eaa3dba5253a7c6931230dc961641455710ab231f8a89cb3c4c2af70f8c8/safetensors-0.5.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1506e4c2eda1431099cebe9abf6c76853e95d0b7a95addceaa74c6019c65d8cf", size = 659588 }, + { url = "https://files.pythonhosted.org/packages/b0/71/2f9851164f821064d43b481ddbea0149c2d676c4f4e077b178e7eeaa6660/safetensors-0.5.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5c5b5d9da594f638a259fca766046f44c97244cc7ab8bef161b3e80d04becc76", size = 632533 }, + { url = "https://files.pythonhosted.org/packages/00/f1/5680e2ef61d9c61454fad82c344f0e40b8741a9dbd1e31484f0d31a9b1c3/safetensors-0.5.2-cp38-abi3-win32.whl", hash = "sha256:fe55c039d97090d1f85277d402954dd6ad27f63034fa81985a9cc59655ac3ee2", size = 291167 }, + { url = "https://files.pythonhosted.org/packages/86/ca/aa489392ec6fb59223ffce825461e1f811a3affd417121a2088be7a5758b/safetensors-0.5.2-cp38-abi3-win_amd64.whl", hash = "sha256:78abdddd03a406646107f973c7843276e7b64e5e32623529dc17f3d94a20f589", size = 303756 }, +] + +[[package]] +name = "scikit-learn" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scipy", version = "1.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/3a/f4597eb41049110b21ebcbb0bcb43e4035017545daa5eedcfeb45c08b9c5/scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e", size = 12067702 }, + { url = "https://files.pythonhosted.org/packages/37/19/0423e5e1fd1c6ec5be2352ba05a537a473c1677f8188b9306097d684b327/scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36", size = 11112765 }, + { url = "https://files.pythonhosted.org/packages/70/95/d5cb2297a835b0f5fc9a77042b0a2d029866379091ab8b3f52cc62277808/scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8634c4bd21a2a813e0a7e3900464e6d593162a29dd35d25bdf0103b3fce60ed5", size = 12643991 }, + { url = "https://files.pythonhosted.org/packages/b7/91/ab3c697188f224d658969f678be86b0968ccc52774c8ab4a86a07be13c25/scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775da975a471c4f6f467725dff0ced5c7ac7bda5e9316b260225b48475279a1b", size = 13497182 }, + { url = "https://files.pythonhosted.org/packages/17/04/d5d556b6c88886c092cc989433b2bab62488e0f0dafe616a1d5c9cb0efb1/scikit_learn-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:8a600c31592bd7dab31e1c61b9bbd6dea1b3433e67d264d17ce1017dbdce8002", size = 11125517 }, + { url = "https://files.pythonhosted.org/packages/6c/2a/e291c29670795406a824567d1dfc91db7b699799a002fdaa452bceea8f6e/scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33", size = 12102620 }, + { url = "https://files.pythonhosted.org/packages/25/92/ee1d7a00bb6b8c55755d4984fd82608603a3cc59959245068ce32e7fb808/scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d", size = 11116234 }, + { url = "https://files.pythonhosted.org/packages/30/cd/ed4399485ef364bb25f388ab438e3724e60dc218c547a407b6e90ccccaef/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2", size = 12592155 }, + { url = "https://files.pythonhosted.org/packages/a8/f3/62fc9a5a659bb58a03cdd7e258956a5824bdc9b4bb3c5d932f55880be569/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8", size = 13497069 }, + { url = "https://files.pythonhosted.org/packages/a1/a6/c5b78606743a1f28eae8f11973de6613a5ee87366796583fb74c67d54939/scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415", size = 11139809 }, + { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516 }, + { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837 }, + { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728 }, + { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700 }, + { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613 }, + { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001 }, + { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360 }, + { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004 }, + { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776 }, + { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865 }, + { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804 }, + { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530 }, + { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852 }, + { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256 }, + { url = "https://files.pythonhosted.org/packages/d2/37/b305b759cc65829fe1b8853ff3e308b12cdd9d8884aa27840835560f2b42/scikit_learn-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6849dd3234e87f55dce1db34c89a810b489ead832aaf4d4550b7ea85628be6c1", size = 12101868 }, + { url = "https://files.pythonhosted.org/packages/83/74/f64379a4ed5879d9db744fe37cfe1978c07c66684d2439c3060d19a536d8/scikit_learn-1.6.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e7be3fa5d2eb9be7d77c3734ff1d599151bb523674be9b834e8da6abe132f44e", size = 11144062 }, + { url = "https://files.pythonhosted.org/packages/fd/dc/d5457e03dc9c971ce2b0d750e33148dd060fefb8b7dc71acd6054e4bb51b/scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44a17798172df1d3c1065e8fcf9019183f06c87609b49a124ebdf57ae6cb0107", size = 12693173 }, + { url = "https://files.pythonhosted.org/packages/79/35/b1d2188967c3204c78fa79c9263668cf1b98060e8e58d1a730fe5b2317bb/scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b7a3b86e411e4bce21186e1c180d792f3d99223dcfa3b4f597ecc92fa1a422", size = 13518605 }, + { url = "https://files.pythonhosted.org/packages/fb/d8/8d603bdd26601f4b07e2363032b8565ab82eb857f93d86d0f7956fcf4523/scikit_learn-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7a73d457070e3318e32bdb3aa79a8d990474f19035464dfd8bede2883ab5dc3b", size = 11155078 }, +] + +[[package]] +name = "scipy" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076 }, + { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232 }, + { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202 }, + { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335 }, + { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728 }, + { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588 }, + { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805 }, + { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687 }, + { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638 }, + { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931 }, + { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145 }, + { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227 }, + { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301 }, + { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348 }, + { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062 }, + { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311 }, + { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493 }, + { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955 }, + { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927 }, + { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538 }, + { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190 }, + { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244 }, + { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637 }, + { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440 }, +] + +[[package]] +name = "scipy" +version = "1.15.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version >= '3.10' and python_full_version < '3.12'", +] +dependencies = [ + { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/c6/8eb0654ba0c7d0bb1bf67bf8fbace101a8e4f250f7722371105e8b6f68fc/scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6", size = 59407493 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/53/b204ce5a4433f1864001b9d16f103b9c25f5002a602ae83585d0ea5f9c4a/scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1", size = 41414518 }, + { url = "https://files.pythonhosted.org/packages/c7/fc/54ffa7a8847f7f303197a6ba65a66104724beba2e38f328135a78f0dc480/scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff", size = 32519265 }, + { url = "https://files.pythonhosted.org/packages/f1/77/a98b8ba03d6f371dc31a38719affd53426d4665729dcffbed4afe296784a/scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea", size = 24792859 }, + { url = "https://files.pythonhosted.org/packages/a7/78/70bb9f0df7444b18b108580934bfef774822e28fd34a68e5c263c7d2828a/scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e", size = 27886506 }, + { url = "https://files.pythonhosted.org/packages/14/a7/f40f6033e06de4176ddd6cc8c3ae9f10a226c3bca5d6b4ab883bc9914a14/scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25", size = 38375041 }, + { url = "https://files.pythonhosted.org/packages/17/03/390a1c5c61fd76b0fa4b3c5aa3bdd7e60f6c46f712924f1a9df5705ec046/scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52", size = 40597556 }, + { url = "https://files.pythonhosted.org/packages/4e/70/fa95b3ae026b97eeca58204a90868802e5155ac71b9d7bdee92b68115dd3/scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0", size = 42938505 }, + { url = "https://files.pythonhosted.org/packages/d6/07/427859116bdd71847c898180f01802691f203c3e2455a1eb496130ff07c5/scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8", size = 43909663 }, + { url = "https://files.pythonhosted.org/packages/8e/2e/7b71312da9c2dabff53e7c9a9d08231bc34d9d8fdabe88a6f1155b44591c/scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2", size = 41424362 }, + { url = "https://files.pythonhosted.org/packages/81/8c/ab85f1aa1cc200c796532a385b6ebf6a81089747adc1da7482a062acc46c/scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0", size = 32535910 }, + { url = "https://files.pythonhosted.org/packages/3b/9c/6f4b787058daa8d8da21ddff881b4320e28de4704a65ec147adb50cb2230/scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf", size = 24809398 }, + { url = "https://files.pythonhosted.org/packages/16/2b/949460a796df75fc7a1ee1becea202cf072edbe325ebe29f6d2029947aa7/scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac", size = 27918045 }, + { url = "https://files.pythonhosted.org/packages/5f/36/67fe249dd7ccfcd2a38b25a640e3af7e59d9169c802478b6035ba91dfd6d/scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df", size = 38332074 }, + { url = "https://files.pythonhosted.org/packages/fc/da/452e1119e6f720df3feb588cce3c42c5e3d628d4bfd4aec097bd30b7de0c/scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7", size = 40588469 }, + { url = "https://files.pythonhosted.org/packages/7f/71/5f94aceeac99a4941478af94fe9f459c6752d497035b6b0761a700f5f9ff/scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a", size = 42965214 }, + { url = "https://files.pythonhosted.org/packages/af/25/caa430865749d504271757cafd24066d596217e83326155993980bc22f97/scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b", size = 43896034 }, + { url = "https://files.pythonhosted.org/packages/d8/6e/a9c42d0d39e09ed7fd203d0ac17adfea759cba61ab457671fe66e523dbec/scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776", size = 41478318 }, + { url = "https://files.pythonhosted.org/packages/04/ee/e3e535c81828618878a7433992fecc92fa4df79393f31a8fea1d05615091/scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f", size = 32596696 }, + { url = "https://files.pythonhosted.org/packages/c4/5e/b1b0124be8e76f87115f16b8915003eec4b7060298117715baf13f51942c/scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04", size = 24870366 }, + { url = "https://files.pythonhosted.org/packages/14/36/c00cb73eefda85946172c27913ab995c6ad4eee00fa4f007572e8c50cd51/scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9", size = 28007461 }, + { url = "https://files.pythonhosted.org/packages/68/94/aff5c51b3799349a9d1e67a056772a0f8a47db371e83b498d43467806557/scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce", size = 38068174 }, + { url = "https://files.pythonhosted.org/packages/b0/3c/0de11ca154e24a57b579fb648151d901326d3102115bc4f9a7a86526ce54/scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2", size = 40249869 }, + { url = "https://files.pythonhosted.org/packages/15/09/472e8d0a6b33199d1bb95e49bedcabc0976c3724edd9b0ef7602ccacf41e/scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5", size = 42629068 }, + { url = "https://files.pythonhosted.org/packages/ff/ba/31c7a8131152822b3a2cdeba76398ffb404d81d640de98287d236da90c49/scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d", size = 43621992 }, + { url = "https://files.pythonhosted.org/packages/2b/bf/dd68965a4c5138a630eeed0baec9ae96e5d598887835bdde96cdd2fe4780/scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85", size = 41441136 }, + { url = "https://files.pythonhosted.org/packages/ef/5e/4928581312922d7e4d416d74c416a660addec4dd5ea185401df2269ba5a0/scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692", size = 32533699 }, + { url = "https://files.pythonhosted.org/packages/32/90/03f99c43041852837686898c66767787cd41c5843d7a1509c39ffef683e9/scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab", size = 24807289 }, + { url = "https://files.pythonhosted.org/packages/9d/52/bfe82b42ae112eaba1af2f3e556275b8727d55ac6e4932e7aef337a9d9d4/scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c", size = 27929844 }, + { url = "https://files.pythonhosted.org/packages/f6/77/54ff610bad600462c313326acdb035783accc6a3d5f566d22757ad297564/scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e", size = 38031272 }, + { url = "https://files.pythonhosted.org/packages/f1/26/98585cbf04c7cf503d7eb0a1966df8a268154b5d923c5fe0c1ed13154c49/scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e", size = 40210217 }, + { url = "https://files.pythonhosted.org/packages/fd/3f/3d2285eb6fece8bc5dbb2f9f94d61157d61d155e854fd5fea825b8218f12/scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4", size = 42587785 }, + { url = "https://files.pythonhosted.org/packages/48/7d/5b5251984bf0160d6533695a74a5fddb1fa36edd6f26ffa8c871fbd4782a/scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef", size = 43640439 }, + { url = "https://files.pythonhosted.org/packages/e7/b8/0e092f592d280496de52e152582030f8a270b194f87f890e1a97c5599b81/scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b", size = 41619862 }, + { url = "https://files.pythonhosted.org/packages/f6/19/0b6e1173aba4db9e0b7aa27fe45019857fb90d6904038b83927cbe0a6c1d/scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95", size = 32610387 }, + { url = "https://files.pythonhosted.org/packages/e7/02/754aae3bd1fa0f2479ade3cfdf1732ecd6b05853f63eee6066a32684563a/scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364", size = 24883814 }, + { url = "https://files.pythonhosted.org/packages/1f/ac/d7906201604a2ea3b143bb0de51b3966f66441ba50b7dc182c4505b3edf9/scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0", size = 27944865 }, + { url = "https://files.pythonhosted.org/packages/84/9d/8f539002b5e203723af6a6f513a45e0a7671e9dabeedb08f417ac17e4edc/scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54", size = 39883261 }, + { url = "https://files.pythonhosted.org/packages/97/c0/62fd3bab828bcccc9b864c5997645a3b86372a35941cdaf677565c25c98d/scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c", size = 42093299 }, + { url = "https://files.pythonhosted.org/packages/e4/1f/5d46a8d94e9f6d2c913cbb109e57e7eed914de38ea99e2c4d69a9fc93140/scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5", size = 43181730 }, +] + [[package]] name = "secretstorage" version = "3.3.3" @@ -1689,6 +2664,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221 }, ] +[[package]] +name = "sentence-transformers" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "pillow" }, + { name = "scikit-learn" }, + { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scipy", version = "1.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "torch" }, + { name = "tqdm" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/0a/c677efe908b20e7e8d4ed6cce3a3447eebc7dc5e348e458f5f9a44a72b00/sentence_transformers-3.3.1.tar.gz", hash = "sha256:9635dbfb11c6b01d036b9cfcee29f7716ab64cf2407ad9f403a2e607da2ac48b", size = 217914 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/c8/990e22a465e4771338da434d799578865d6d7ef1fdb50bd844b7ecdcfa19/sentence_transformers-3.3.1-py3-none-any.whl", hash = "sha256:abffcc79dab37b7d18d21a26d5914223dd42239cfe18cb5e111c66c54b658ae7", size = 268797 }, +] + +[[package]] +name = "setuptools" +version = "75.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, +] + [[package]] name = "shellingham" version = "1.5.4" @@ -1717,15 +2720,16 @@ wheels = [ ] [[package]] -name = "splitme-ai" -version = "0.1.10" +name = "splitme" +version = "0.1.11" source = { editable = "." } dependencies = [ - { name = "aiofiles" }, + { name = "mistletoe" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pyyaml" }, { name = "requests" }, + { name = "rich" }, { name = "toml", marker = "python_full_version < '3.11'" }, ] @@ -1740,7 +2744,12 @@ docs = [ [package.dev-dependencies] dev = [ + { name = "commonmark" }, { name = "hatch" }, + { name = "ipykernel" }, + { name = "keybert" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, ] docs = [ { name = "mkdocs" }, @@ -1759,6 +2768,7 @@ test = [ { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-cov" }, + { name = "pytest-mock" }, { name = "pytest-pretty" }, { name = "pytest-randomly" }, { name = "pytest-sugar" }, @@ -1767,7 +2777,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "aiofiles", specifier = ">=24.1.0" }, + { name = "mistletoe", specifier = ">=1.4.0" }, { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6.1" }, { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.47" }, { name = "pydantic", specifier = ">=2.10.3" }, @@ -1775,11 +2785,19 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.6.1" }, { name = "pyyaml", specifier = ">=6.0.2" }, { name = "requests", specifier = ">=2.32.3" }, + { name = "rich", specifier = ">=13.9.4" }, { name = "toml", marker = "python_full_version < '3.11'", specifier = ">=0.10.2" }, ] [package.metadata.requires-dev] -dev = [{ name = "hatch", specifier = ">=1.13" }] +dev = [ + { name = "commonmark", specifier = ">=0.9.1" }, + { name = "hatch", specifier = ">=1.13" }, + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "keybert", specifier = ">=0.8.5" }, + { name = "markdown-it-py", specifier = ">=3.0.0" }, + { name = "mdit-py-plugins", specifier = ">=0.4.2" }, +] docs = [ { name = "mkdocs", specifier = ">=1.6.1" }, { name = "mkdocs-material", specifier = ">=9.5.47" }, @@ -1797,12 +2815,39 @@ test = [ { name = "pytest", specifier = ">=8.3.4" }, { name = "pytest-asyncio", specifier = ">=0.25" }, { name = "pytest-cov", specifier = ">=6" }, + { name = "pytest-mock", specifier = ">=3.14.0" }, { name = "pytest-pretty", specifier = ">=1.2" }, { name = "pytest-randomly", specifier = ">=3.16" }, { name = "pytest-sugar", specifier = ">=1" }, { name = "pytest-xdist", specifier = ">=3.6.1" }, ] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + +[[package]] +name = "sympy" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/99/5a5b6f19ff9f083671ddf7b9632028436167cd3d33e11015754e41b249a4/sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f", size = 7533040 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 }, +] + [[package]] name = "termcolor" version = "2.5.0" @@ -1812,6 +2857,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7f/be/df630c387a0a054815d60be6a97eb4e8f17385d5d6fe660e1c02750062b4/termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8", size = 7755 }, ] +[[package]] +name = "threadpoolctl" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b5148dcbf72f5cde221f8bfe3b6a540da7aa1842f6b491ad979a6c8b84af/threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107", size = 41936 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467", size = 18414 }, +] + +[[package]] +name = "tokenizers" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/41/c2be10975ca37f6ec40d7abd7e98a5213bb04f284b869c1a24e6504fd94d/tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4", size = 343021 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/5c/8b09607b37e996dc47e70d6a7b6f4bdd4e4d5ab22fe49d7374565c7fefaf/tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2", size = 2647461 }, + { url = "https://files.pythonhosted.org/packages/22/7a/88e58bb297c22633ed1c9d16029316e5b5ac5ee44012164c2edede599a5e/tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e", size = 2563639 }, + { url = "https://files.pythonhosted.org/packages/f7/14/83429177c19364df27d22bc096d4c2e431e0ba43e56c525434f1f9b0fd00/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193", size = 2903304 }, + { url = "https://files.pythonhosted.org/packages/7e/db/3433eab42347e0dc5452d8fcc8da03f638c9accffefe5a7c78146666964a/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e", size = 2804378 }, + { url = "https://files.pythonhosted.org/packages/57/8b/7da5e6f89736c2ade02816b4733983fca1c226b0c42980b1ae9dc8fcf5cc/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e", size = 3095488 }, + { url = "https://files.pythonhosted.org/packages/4d/f6/5ed6711093dc2c04a4e03f6461798b12669bc5a17c8be7cce1240e0b5ce8/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba", size = 3121410 }, + { url = "https://files.pythonhosted.org/packages/81/42/07600892d48950c5e80505b81411044a2d969368cdc0d929b1c847bf6697/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273", size = 3388821 }, + { url = "https://files.pythonhosted.org/packages/22/06/69d7ce374747edaf1695a4f61b83570d91cc8bbfc51ccfecf76f56ab4aac/tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04", size = 3008868 }, + { url = "https://files.pythonhosted.org/packages/c8/69/54a0aee4d576045b49a0eb8bffdc495634309c823bf886042e6f46b80058/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e", size = 8975831 }, + { url = "https://files.pythonhosted.org/packages/f7/f3/b776061e4f3ebf2905ba1a25d90380aafd10c02d406437a8ba22d1724d76/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b", size = 8920746 }, + { url = "https://files.pythonhosted.org/packages/d8/ee/ce83d5ec8b6844ad4c3ecfe3333d58ecc1adc61f0878b323a15355bcab24/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74", size = 9161814 }, + { url = "https://files.pythonhosted.org/packages/18/07/3e88e65c0ed28fa93aa0c4d264988428eef3df2764c3126dc83e243cb36f/tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff", size = 9357138 }, + { url = "https://files.pythonhosted.org/packages/15/b0/dc4572ca61555fc482ebc933f26cb407c6aceb3dc19c301c68184f8cad03/tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a", size = 2202266 }, + { url = "https://files.pythonhosted.org/packages/44/69/d21eb253fa91622da25585d362a874fa4710be600f0ea9446d8d0217cec1/tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c", size = 2389192 }, +] + [[package]] name = "toml" version = "0.10.2" @@ -1878,6 +2957,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, ] +[[package]] +name = "torch" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.12'" }, + { name = "sympy" }, + { name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/ef/834af4a885b31a0b32fff2d80e1e40f771e1566ea8ded55347502440786a/torch-2.5.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:71328e1bbe39d213b8721678f9dcac30dfc452a46d586f1d514a6aa0a99d4744", size = 906446312 }, + { url = "https://files.pythonhosted.org/packages/69/f0/46e74e0d145f43fa506cb336eaefb2d240547e4ce1f496e442711093ab25/torch-2.5.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:34bfa1a852e5714cbfa17f27c49d8ce35e1b7af5608c4bc6e81392c352dbc601", size = 91919522 }, + { url = "https://files.pythonhosted.org/packages/a5/13/1eb674c8efbd04d71e4a157ceba991904f633e009a584dd65dccbafbb648/torch-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:32a037bd98a241df6c93e4c789b683335da76a2ac142c0973675b715102dc5fa", size = 203088048 }, + { url = "https://files.pythonhosted.org/packages/a9/9d/e0860474ee0ff8f6ef2c50ec8f71a250f38d78a9b9df9fd241ad3397a65b/torch-2.5.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:23d062bf70776a3d04dbe74db950db2a5245e1ba4f27208a87f0d743b0d06e86", size = 63877046 }, + { url = "https://files.pythonhosted.org/packages/d1/35/e8b2daf02ce933e4518e6f5682c72fd0ed66c15910ea1fb4168f442b71c4/torch-2.5.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:de5b7d6740c4b636ef4db92be922f0edc425b65ed78c5076c43c42d362a45457", size = 906474467 }, + { url = "https://files.pythonhosted.org/packages/40/04/bd91593a4ca178ece93ca55f27e2783aa524aaccbfda66831d59a054c31e/torch-2.5.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:340ce0432cad0d37f5a31be666896e16788f1adf8ad7be481196b503dad675b9", size = 91919450 }, + { url = "https://files.pythonhosted.org/packages/0d/4a/e51420d46cfc90562e85af2fee912237c662ab31140ab179e49bd69401d6/torch-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:603c52d2fe06433c18b747d25f5c333f9c1d58615620578c326d66f258686f9a", size = 203098237 }, + { url = "https://files.pythonhosted.org/packages/d0/db/5d9cbfbc7968d79c5c09a0bc0bc3735da079f2fd07cc10498a62b320a480/torch-2.5.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:31f8c39660962f9ae4eeec995e3049b5492eb7360dd4f07377658ef4d728fa4c", size = 63884466 }, + { url = "https://files.pythonhosted.org/packages/8b/5c/36c114d120bfe10f9323ed35061bc5878cc74f3f594003854b0ea298942f/torch-2.5.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:ed231a4b3a5952177fafb661213d690a72caaad97d5824dd4fc17ab9e15cec03", size = 906389343 }, + { url = "https://files.pythonhosted.org/packages/6d/69/d8ada8b6e0a4257556d5b4ddeb4345ea8eeaaef3c98b60d1cca197c7ad8e/torch-2.5.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:3f4b7f10a247e0dcd7ea97dc2d3bfbfc90302ed36d7f3952b0008d0df264e697", size = 91811673 }, + { url = "https://files.pythonhosted.org/packages/5f/ba/607d013b55b9fd805db2a5c2662ec7551f1910b4eef39653eeaba182c5b2/torch-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:73e58e78f7d220917c5dbfad1a40e09df9929d3b95d25e57d9f8558f84c9a11c", size = 203046841 }, + { url = "https://files.pythonhosted.org/packages/57/6c/bf52ff061da33deb9f94f4121fde7ff3058812cb7d2036c97bc167793bd1/torch-2.5.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:8c712df61101964eb11910a846514011f0b6f5920c55dbf567bff8a34163d5b1", size = 63858109 }, + { url = "https://files.pythonhosted.org/packages/69/72/20cb30f3b39a9face296491a86adb6ff8f1a47a897e4d14667e6cf89d5c3/torch-2.5.1-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:9b61edf3b4f6e3b0e0adda8b3960266b9009d02b37555971f4d1c8f7a05afed7", size = 906393265 }, + { url = "https://files.pythonhosted.org/packages/a9/18/81c399e8f4f1580d34bf99d827cb5fb5cf7a18a266bb5d30ca3ec2e89ba6/torch-2.5.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1f3b7fb3cf7ab97fae52161423f81be8c6b8afac8d9760823fd623994581e1a3", size = 906479005 }, + { url = "https://files.pythonhosted.org/packages/5d/86/1c4b168d52cddb8d17952a7b5b25f69ef0da1fc34de1223d73d0d9db1801/torch-2.5.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7974e3dce28b5a21fb554b73e1bc9072c25dde873fa00d54280861e7a009d7dc", size = 91846074 }, + { url = "https://files.pythonhosted.org/packages/76/49/4a0a8b19ce8f9bf32fcab4e863c7e2366f519f9826c84ca250567b11a014/torch-2.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:46c817d3ea33696ad3b9df5e774dba2257e9a4cd3c4a3afbf92f6bb13ac5ce2d", size = 203000888 }, + { url = "https://files.pythonhosted.org/packages/25/07/3548a7cfcf69d0eccec2ee79ee3913f1cdaadb27b36946774db86729ee47/torch-2.5.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:8046768b7f6d35b85d101b4b38cba8aa2f3cd51952bc4c06a49580f2ce682291", size = 63876023 }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + [[package]] name = "tqdm" version = "4.67.1" @@ -1890,6 +3034,51 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + +[[package]] +name = "transformers" +version = "4.48.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/6b/caf620fae7fbf35947c81e7dd0834493b9ad9b71bb9e433025ac7a07e79a/transformers-4.48.1.tar.gz", hash = "sha256:7c1931facc3ee8adcbf86fc7a87461d54c1e40eca3bb57fef1ee9f3ecd32187e", size = 8365872 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/9f/92d3091c44cb19add044064af1bf1345cd35fbb84d32a3690f912800a295/transformers-4.48.1-py3-none-any.whl", hash = "sha256:24be0564b0a36d9e433d9a65de248f1545b6f6edce1737669605eb6a8141bbbb", size = 9665001 }, +] + +[[package]] +name = "triton" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013 }, + { url = "https://files.pythonhosted.org/packages/86/17/d9a5cf4fcf46291856d1e90762e36cbabd2a56c7265da0d1d9508c8e3943/triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c", size = 209506424 }, + { url = "https://files.pythonhosted.org/packages/78/eb/65f5ba83c2a123f6498a3097746607e5b2f16add29e36765305e4ac7fdd8/triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8182f42fd8080a7d39d666814fa36c5e30cc00ea7eeeb1a2983dbb4c99a0fdc", size = 209551444 }, + { url = "https://files.pythonhosted.org/packages/c4/69/57e0fed438d547524e08bfedc587078314176ad1c15c8be904d3f03149ec/triton-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aafa9a20cd0d9fee523cd4504aa7131807a864cd77dcf6efe7e981f18b8c6c11", size = 209460480 }, +] + [[package]] name = "trove-classifiers" version = "2024.10.21.16" @@ -2047,6 +3236,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + [[package]] name = "zipp" version = "3.21.0"