mirror of
https://github.com/vinta/awesome-python.git
synced 2026-05-07 00:14:48 -05:00
feat: use explicit Projects section in README
This commit is contained in:
158
README.md
158
README.md
@@ -2,13 +2,13 @@
|
||||
|
||||
An opinionated guide to the best Python frameworks, libraries, tools, and resources.
|
||||
|
||||
# **Sponsors**
|
||||
## **Sponsors**
|
||||
|
||||
- **[pyr](https://pyrun.dev)**: Zero-config Python project manager. Bootstraps its own runtime, app-convention, and working imports - out the box.
|
||||
|
||||
> The **#10 most-starred repo on GitHub**. Put your product in front of Python developers. [Become a sponsor](SPONSORSHIP.md).
|
||||
|
||||
# Categories
|
||||
## Categories
|
||||
|
||||
**AI & ML**
|
||||
|
||||
@@ -123,11 +123,11 @@ An opinionated guide to the best Python frameworks, libraries, tools, and resour
|
||||
- [Microsoft Windows](#microsoft-windows)
|
||||
- [Miscellaneous](#miscellaneous)
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**AI & ML**
|
||||
|
||||
## AI and Agents
|
||||
### AI and Agents
|
||||
|
||||
_Libraries for building AI applications, LLM integrations, and autonomous agents._
|
||||
|
||||
@@ -163,7 +163,7 @@ _Libraries for building AI applications, LLM integrations, and autonomous agents
|
||||
- [vibevoice](https://github.com/microsoft/VibeVoice) - A family of open-source voice AI models from Microsoft for text-to-speech and long-form speech recognition.
|
||||
- [voxcpm](https://github.com/OpenBMB/VoxCPM) - A tokenizer-free text-to-speech foundation model for multilingual speech generation and voice cloning.
|
||||
|
||||
## Deep Learning
|
||||
### Deep Learning
|
||||
|
||||
_Frameworks for Neural Networks and Deep Learning. Also see [awesome-deep-learning](https://github.com/ChristosChristofidis/awesome-deep-learning)._
|
||||
|
||||
@@ -174,7 +174,7 @@ _Frameworks for Neural Networks and Deep Learning. Also see [awesome-deep-learni
|
||||
- [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) - PyTorch implementations of Stable Baselines (deep) reinforcement learning algorithms.
|
||||
- [tensorflow](https://github.com/tensorflow/tensorflow) - The most popular Deep Learning framework created by Google.
|
||||
|
||||
## Machine Learning
|
||||
### Machine Learning
|
||||
|
||||
_Libraries for Machine Learning. Also see [awesome-machine-learning](https://github.com/josephmisiti/awesome-machine-learning#python)._
|
||||
|
||||
@@ -190,7 +190,7 @@ _Libraries for Machine Learning. Also see [awesome-machine-learning](https://git
|
||||
- [timesfm](https://github.com/google-research/timesfm) - A pretrained foundation model from Google Research for time-series forecasting.
|
||||
- [xgboost](https://github.com/dmlc/xgboost) - A scalable, portable, and distributed gradient boosting library.
|
||||
|
||||
## Natural Language Processing
|
||||
### Natural Language Processing
|
||||
|
||||
_Libraries for working with human languages._
|
||||
|
||||
@@ -203,7 +203,7 @@ _Libraries for working with human languages._
|
||||
- [funnlp](https://github.com/fighting41love/funNLP) - A collection of tools and datasets for Chinese NLP.
|
||||
- [jieba](https://github.com/fxsjy/jieba) - The most popular Chinese text segmentation library.
|
||||
|
||||
## Computer Vision
|
||||
### Computer Vision
|
||||
|
||||
_Libraries for Computer Vision._
|
||||
|
||||
@@ -212,7 +212,7 @@ _Libraries for Computer Vision._
|
||||
- [opencv](https://github.com/opencv/opencv-python) - Open Source Computer Vision Library.
|
||||
- [pytesseract](https://github.com/madmaze/pytesseract) - A wrapper for [Google Tesseract OCR](https://github.com/tesseract-ocr).
|
||||
|
||||
## Recommender Systems
|
||||
### Recommender Systems
|
||||
|
||||
_Libraries for building recommender systems._
|
||||
|
||||
@@ -222,7 +222,7 @@ _Libraries for building recommender systems._
|
||||
|
||||
**Web Development**
|
||||
|
||||
## Web Frameworks
|
||||
### Web Frameworks
|
||||
|
||||
_Traditional full stack web frameworks. Also see [Web APIs](#web-apis)._
|
||||
|
||||
@@ -245,7 +245,7 @@ _Traditional full stack web frameworks. Also see [Web APIs](#web-apis)._
|
||||
- [starlette](https://github.com/Kludex/starlette) - A lightweight ASGI framework and toolkit for building high-performance async services.
|
||||
- [tornado](https://github.com/tornadoweb/tornado) - A web framework and asynchronous networking library.
|
||||
|
||||
## Web APIs
|
||||
### Web APIs
|
||||
|
||||
_Libraries for building RESTful and GraphQL APIs._
|
||||
|
||||
@@ -264,7 +264,7 @@ _Libraries for building RESTful and GraphQL APIs._
|
||||
- [strawberry](https://github.com/strawberry-graphql/strawberry) - A GraphQL library that leverages Python type annotations for schema definition.
|
||||
- [webargs](https://github.com/marshmallow-code/webargs) - A friendly library for parsing HTTP request arguments with built-in support for popular web frameworks.
|
||||
|
||||
## Web Servers
|
||||
### Web Servers
|
||||
|
||||
_ASGI and WSGI compatible web servers._
|
||||
|
||||
@@ -281,7 +281,7 @@ _ASGI and WSGI compatible web servers._
|
||||
- [grpcio](https://github.com/grpc/grpc) - HTTP/2-based RPC framework with Python bindings, built by Google.
|
||||
- [rpyc](https://github.com/tomerfiliba-org/rpyc) (Remote Python Call) - A transparent and symmetric RPC library for Python.
|
||||
|
||||
## WebSocket
|
||||
### WebSocket
|
||||
|
||||
_Libraries for working with WebSocket._
|
||||
|
||||
@@ -291,21 +291,21 @@ _Libraries for working with WebSocket._
|
||||
- [picows](https://github.com/tarasko/picows) - Fastest WebSocket clients and servers with a frame level interface for the most demanding use-cases.
|
||||
- [websockets](https://github.com/python-websockets/websockets) - A library for building WebSocket servers and clients with a focus on correctness and simplicity.
|
||||
|
||||
## Template Engines
|
||||
### Template Engines
|
||||
|
||||
_Libraries and tools for templating and lexing._
|
||||
|
||||
- [jinja](https://github.com/pallets/jinja) - A modern and designer friendly templating language.
|
||||
- [mako](https://github.com/sqlalchemy/mako) - Hyperfast and lightweight templating for the Python platform.
|
||||
|
||||
## Web Asset Management
|
||||
### Web Asset Management
|
||||
|
||||
_Tools for managing, compressing and minifying website assets._
|
||||
|
||||
- [django-compressor](https://github.com/django-compressor/django-compressor) - Compresses linked and inline JavaScript or CSS into a single cached file.
|
||||
- [django-storages](https://github.com/jschneier/django-storages) - A collection of custom storage back ends for Django.
|
||||
|
||||
## Authentication
|
||||
### Authentication
|
||||
|
||||
_Libraries for implementing authentication schemes._
|
||||
|
||||
@@ -320,7 +320,7 @@ _Libraries for implementing authentication schemes._
|
||||
- [django-guardian](https://github.com/django-guardian/django-guardian) - Implementation of per object permissions for Django 1.2+
|
||||
- [django-rules](https://github.com/dfunckt/django-rules) - A tiny but powerful app providing object-level permissions to Django, without requiring a database.
|
||||
|
||||
## Admin Panels
|
||||
### Admin Panels
|
||||
|
||||
_Libraries for administrative interfaces._
|
||||
|
||||
@@ -332,7 +332,7 @@ _Libraries for administrative interfaces._
|
||||
- [func-to-web](https://github.com/offerrall/FuncToWeb) - Instantly create web UIs from Python functions using type hints. Zero frontend code required.
|
||||
- [jet-bridge](https://github.com/jet-admin/jet-bridge) - Admin panel framework for any application with nice UI (ex Jet Django).
|
||||
|
||||
## CMS
|
||||
### CMS
|
||||
|
||||
_Content Management Systems._
|
||||
|
||||
@@ -340,7 +340,7 @@ _Content Management Systems._
|
||||
- [indico](https://github.com/indico/indico) - A feature-rich event management system, made @ [CERN](https://en.wikipedia.org/wiki/CERN).
|
||||
- [wagtail](https://github.com/wagtail/wagtail) - A Django content management system.
|
||||
|
||||
## Static Site Generators
|
||||
### Static Site Generators
|
||||
|
||||
_Static site generator is a software that takes some text + templates as input and produces HTML files on the output._
|
||||
|
||||
@@ -350,7 +350,7 @@ _Static site generator is a software that takes some text + templates as input a
|
||||
|
||||
**HTTP & Scraping**
|
||||
|
||||
## HTTP Clients
|
||||
### HTTP Clients
|
||||
|
||||
_Libraries for working with HTTP._
|
||||
|
||||
@@ -361,7 +361,7 @@ _Libraries for working with HTTP._
|
||||
- [requests](https://github.com/psf/requests) - HTTP Requests for Humans.
|
||||
- [urllib3](https://github.com/urllib3/urllib3) - A HTTP library with thread-safe connection pooling, file post support, sanity friendly.
|
||||
|
||||
## Web Scraping
|
||||
### Web Scraping
|
||||
|
||||
_Libraries to automate web scraping and extract web content._
|
||||
|
||||
@@ -377,7 +377,7 @@ _Libraries to automate web scraping and extract web content._
|
||||
- [sumy](https://github.com/miso-belica/sumy) - A module for automatic summarization of text documents and HTML pages.
|
||||
- [trafilatura](https://github.com/adbar/trafilatura) - A tool for gathering text and metadata from the web, with built-in content filtering.
|
||||
|
||||
## Email
|
||||
### Email
|
||||
|
||||
_Libraries for sending and parsing email, and mail server management._
|
||||
|
||||
@@ -386,7 +386,7 @@ _Libraries for sending and parsing email, and mail server management._
|
||||
|
||||
**Database & Storage**
|
||||
|
||||
## ORM
|
||||
### ORM
|
||||
|
||||
_Libraries that implement Object-Relational Mapping or data mapping techniques._
|
||||
|
||||
@@ -404,7 +404,7 @@ _Libraries that implement Object-Relational Mapping or data mapping techniques._
|
||||
- [mongoengine](https://github.com/MongoEngine/mongoengine) - A Python Object-Document-Mapper for working with MongoDB.
|
||||
- [pynamodb](https://github.com/pynamodb/PynamoDB) - A Pythonic interface for [Amazon DynamoDB](https://aws.amazon.com/dynamodb/).
|
||||
|
||||
## Database Drivers
|
||||
### Database Drivers
|
||||
|
||||
_Libraries for connecting and operating databases._
|
||||
|
||||
@@ -425,7 +425,7 @@ _Libraries for connecting and operating databases._
|
||||
- [pymongo](https://github.com/mongodb/mongo-python-driver) - The official Python client for MongoDB.
|
||||
- [redis-py](https://github.com/redis/redis-py) - The Python client for Redis.
|
||||
|
||||
## Database
|
||||
### Database
|
||||
|
||||
_Databases implemented in Python._
|
||||
|
||||
@@ -435,7 +435,7 @@ _Databases implemented in Python._
|
||||
- [tinydb](https://github.com/msiemens/tinydb) - A tiny, document-oriented database.
|
||||
- [ZODB](https://github.com/zopefoundation/ZODB) - A native object database for Python. A key-value and object graph database.
|
||||
|
||||
## Caching
|
||||
### Caching
|
||||
|
||||
_Libraries for caching data._
|
||||
|
||||
@@ -444,7 +444,7 @@ _Libraries for caching data._
|
||||
- [dogpile.cache](https://github.com/sqlalchemy/dogpile.cache) - dogpile.cache is a next generation replacement for Beaker made by the same authors.
|
||||
- [python-diskcache](https://github.com/grantjenks/python-diskcache) - SQLite and file backed cache backend with faster lookups than memcached and redis.
|
||||
|
||||
## Search
|
||||
### Search
|
||||
|
||||
_Libraries and software for indexing and performing search queries on data._
|
||||
|
||||
@@ -452,7 +452,7 @@ _Libraries and software for indexing and performing search queries on data._
|
||||
- [elasticsearch-py](https://github.com/elastic/elasticsearch-py) - The official low-level Python client for [Elasticsearch](https://www.elastic.co/products/elasticsearch).
|
||||
- [pysolr](https://github.com/django-haystack/pysolr) - A lightweight Python wrapper for [Apache Solr](https://lucene.apache.org/solr/).
|
||||
|
||||
## Serialization
|
||||
### Serialization
|
||||
|
||||
_Libraries for serializing complex data types._
|
||||
|
||||
@@ -462,7 +462,7 @@ _Libraries for serializing complex data types._
|
||||
|
||||
**Data & Science**
|
||||
|
||||
## Data Analysis
|
||||
### Data Analysis
|
||||
|
||||
_Libraries for data analysis._
|
||||
|
||||
@@ -483,7 +483,7 @@ _Libraries for data analysis._
|
||||
- [openbb](https://github.com/OpenBB-finance/OpenBB) - A financial data platform for analysts, quants and AI agents.
|
||||
- [yfinance](https://github.com/ranaroussi/yfinance) - Easy Pythonic way to download market and financial data from Yahoo Finance.
|
||||
|
||||
## Data Validation
|
||||
### Data Validation
|
||||
|
||||
_Libraries for validating data. Used for forms in many cases._
|
||||
|
||||
@@ -493,7 +493,7 @@ _Libraries for validating data. Used for forms in many cases._
|
||||
- [pydantic](https://github.com/pydantic/pydantic) - Data validation using Python type hints.
|
||||
- [voluptuous](https://github.com/alecthomas/voluptuous) - A Python data validation library primarily intended for validating data from untrusted sources.
|
||||
|
||||
## Data Visualization
|
||||
### Data Visualization
|
||||
|
||||
_Libraries for visualizing data. Also see [awesome-javascript](https://github.com/sorrycc/awesome-javascript#data-visualization)._
|
||||
|
||||
@@ -516,7 +516,7 @@ _Libraries for visualizing data. Also see [awesome-javascript](https://github.co
|
||||
- [gradio](https://github.com/gradio-app/gradio) - Build and share machine learning apps, all in Python.
|
||||
- [streamlit](https://github.com/streamlit/streamlit) - A framework which lets you build dashboards, generate reports, or create chat apps in minutes.
|
||||
|
||||
## Geolocation
|
||||
### Geolocation
|
||||
|
||||
_Libraries for geocoding addresses and working with latitudes and longitudes._
|
||||
|
||||
@@ -526,7 +526,7 @@ _Libraries for geocoding addresses and working with latitudes and longitudes._
|
||||
- [geopandas](https://github.com/geopandas/geopandas) - Python tools for geographic data (GeoSeries/GeoDataFrame) built on pandas.
|
||||
- [geopy](https://github.com/geopy/geopy) - Python Geocoding Toolbox.
|
||||
|
||||
## Science
|
||||
### Science
|
||||
|
||||
_Libraries for scientific computing. Also see [Python-for-Scientists](https://github.com/TomNicholas/Python-for-Scientists)._
|
||||
|
||||
@@ -557,7 +557,7 @@ _Libraries for scientific computing. Also see [Python-for-Scientists](https://gi
|
||||
- [networkx](https://github.com/networkx/networkx) - A high-productivity software for complex networks.
|
||||
- [shapely](https://github.com/shapely/shapely) - Manipulation and analysis of geometric objects in the Cartesian plane.
|
||||
|
||||
## Quantum Computing
|
||||
### Quantum Computing
|
||||
|
||||
_Libraries for quantum computing._
|
||||
|
||||
@@ -568,7 +568,7 @@ _Libraries for quantum computing._
|
||||
|
||||
**Developer Tools**
|
||||
|
||||
## Algorithms and Design Patterns
|
||||
### Algorithms and Design Patterns
|
||||
|
||||
_Python implementation of data structures, algorithms and design patterns. Also see [awesome-algorithms](https://github.com/tayllan/awesome-algorithms)._
|
||||
|
||||
@@ -580,7 +580,7 @@ _Python implementation of data structures, algorithms and design patterns. Also
|
||||
- [python-patterns](https://github.com/faif/python-patterns) - A collection of design patterns in Python.
|
||||
- [transitions](https://github.com/pytransitions/transitions) - A lightweight, object-oriented finite state machine implementation.
|
||||
|
||||
## Interactive Interpreter
|
||||
### Interactive Interpreter
|
||||
|
||||
_Interactive Python interpreters (REPL)._
|
||||
|
||||
@@ -589,7 +589,7 @@ _Interactive Python interpreters (REPL)._
|
||||
- [marimo](https://github.com/marimo-team/marimo) - Transform data and train models, feels like a next-gen notebook, stored as Git-friendly Python.
|
||||
- [ptpython](https://github.com/prompt-toolkit/ptpython) - Advanced Python REPL built on top of the [python-prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit).
|
||||
|
||||
## Code Analysis
|
||||
### Code Analysis
|
||||
|
||||
_Tools of static analysis, linters and code quality checkers. Also see [awesome-static-analysis](https://github.com/analysis-tools-dev/static-analysis)._
|
||||
|
||||
@@ -619,7 +619,7 @@ _Tools of static analysis, linters and code quality checkers. Also see [awesome-
|
||||
- [monkeytype](https://github.com/Instagram/MonkeyType) - A system for Python that generates static type annotations by collecting runtime types.
|
||||
- [pytype](https://github.com/google/pytype) - Pytype checks and infers types for Python code - without requiring type annotations.
|
||||
|
||||
## Testing
|
||||
### Testing
|
||||
|
||||
_Libraries for testing codebases and generating test data. Also see [awesome-python-testing](https://github.com/cleder/awesome-python-testing)._
|
||||
|
||||
@@ -655,7 +655,7 @@ _Libraries for testing codebases and generating test data. Also see [awesome-pyt
|
||||
- [faker](https://github.com/joke2k/faker) - A Python package that generates fake data.
|
||||
- [mimesis](https://github.com/lk-geimfari/mimesis) - is a Python library that help you generate fake data.
|
||||
|
||||
## Debugging Tools
|
||||
### Debugging Tools
|
||||
|
||||
_Libraries for debugging code._
|
||||
|
||||
@@ -674,7 +674,7 @@ _Libraries for debugging code._
|
||||
- [icecream](https://github.com/gruns/icecream) - Inspect variables, expressions, and program execution with a single, simple function call.
|
||||
- [memory_graph](https://github.com/bterwijn/memory_graph) - Visualize Python data at runtime to debug references, mutability, and aliasing.
|
||||
|
||||
## Build Tools
|
||||
### Build Tools
|
||||
|
||||
_Compile software from source code._
|
||||
|
||||
@@ -685,7 +685,7 @@ _Compile software from source code._
|
||||
- [doit](https://github.com/pydoit/doit) - A task runner and build tool.
|
||||
- [scons](https://github.com/SCons/scons) - A software construction tool.
|
||||
|
||||
## Documentation
|
||||
### Documentation
|
||||
|
||||
_Libraries for generating project documentation._
|
||||
|
||||
@@ -697,7 +697,7 @@ _Libraries for generating project documentation._
|
||||
|
||||
**DevOps**
|
||||
|
||||
## DevOps Tools
|
||||
### DevOps Tools
|
||||
|
||||
_Software and libraries for DevOps._
|
||||
|
||||
@@ -723,7 +723,7 @@ _Software and libraries for DevOps._
|
||||
- [chaostoolkit](https://github.com/chaostoolkit/chaostoolkit) - A Chaos Engineering toolkit & Orchestration for Developers.
|
||||
- [pre-commit](https://github.com/pre-commit/pre-commit) - A framework for managing and maintaining multi-language pre-commit hooks.
|
||||
|
||||
## Distributed Computing
|
||||
### Distributed Computing
|
||||
|
||||
_Frameworks and libraries for Distributed Computing._
|
||||
|
||||
@@ -735,7 +735,7 @@ _Frameworks and libraries for Distributed Computing._
|
||||
- [joblib](https://github.com/joblib/joblib) - A set of tools to provide lightweight pipelining in Python.
|
||||
- [ray](https://github.com/ray-project/ray/) - A system for parallel and distributed Python that unifies the machine learning ecosystem.
|
||||
|
||||
## Task Queues
|
||||
### Task Queues
|
||||
|
||||
_Libraries for working with task queues._
|
||||
|
||||
@@ -744,13 +744,13 @@ _Libraries for working with task queues._
|
||||
- [huey](https://github.com/coleifer/huey) - Little multi-threaded task queue.
|
||||
- [rq](https://github.com/rq/rq) - Simple job queues for Python.
|
||||
|
||||
## Messaging
|
||||
### Messaging
|
||||
|
||||
_Libraries for working with message brokers and event streaming._
|
||||
|
||||
- [faststream](https://github.com/ag2ai/faststream) - A framework for building asynchronous services over Apache Kafka, RabbitMQ, NATS, MQTT and Redis.
|
||||
|
||||
## Job Schedulers
|
||||
### Job Schedulers
|
||||
|
||||
_Libraries for scheduling jobs._
|
||||
|
||||
@@ -761,7 +761,7 @@ _Libraries for scheduling jobs._
|
||||
- [schedule](https://github.com/dbader/schedule) - Python job scheduling for humans.
|
||||
- [SpiffWorkflow](https://github.com/sartography/SpiffWorkflow) - A powerful workflow engine implemented in pure Python.
|
||||
|
||||
## Logging
|
||||
### Logging
|
||||
|
||||
_Libraries for generating and working with logs._
|
||||
|
||||
@@ -770,7 +770,7 @@ _Libraries for generating and working with logs._
|
||||
- [loguru](https://github.com/Delgan/loguru) - Library which aims to bring enjoyable logging in Python.
|
||||
- [structlog](https://github.com/hynek/structlog) - Structured logging made easy.
|
||||
|
||||
## Network Virtualization
|
||||
### Network Virtualization
|
||||
|
||||
_Tools and libraries for Virtual Networking and SDN (Software Defined Networking)._
|
||||
|
||||
@@ -780,7 +780,7 @@ _Tools and libraries for Virtual Networking and SDN (Software Defined Networking
|
||||
|
||||
**CLI & GUI**
|
||||
|
||||
## CLI Development
|
||||
### CLI Development
|
||||
|
||||
_Libraries for building command-line applications._
|
||||
|
||||
@@ -799,7 +799,7 @@ _Libraries for building command-line applications._
|
||||
- [textual](https://github.com/Textualize/textual) - A framework for building interactive user interfaces that run in the terminal and the browser.
|
||||
- [tqdm](https://github.com/tqdm/tqdm) - Fast, extensible progress bar for loops and CLI.
|
||||
|
||||
## CLI Tools
|
||||
### CLI Tools
|
||||
|
||||
_Useful CLI-based tools for productivity._
|
||||
|
||||
@@ -818,7 +818,7 @@ _Useful CLI-based tools for productivity._
|
||||
- [mycli](https://github.com/dbcli/mycli) - MySQL CLI with autocompletion and syntax highlighting.
|
||||
- [pgcli](https://github.com/dbcli/pgcli) - PostgreSQL CLI with autocompletion and syntax highlighting.
|
||||
|
||||
## GUI Development
|
||||
### GUI Development
|
||||
|
||||
_Libraries for working with graphical user interface applications._
|
||||
|
||||
@@ -846,7 +846,7 @@ _Libraries for working with graphical user interface applications._
|
||||
|
||||
**Text & Documents**
|
||||
|
||||
## Text Processing
|
||||
### Text Processing
|
||||
|
||||
_Libraries for parsing and manipulating plain texts._
|
||||
|
||||
@@ -872,7 +872,7 @@ _Libraries for parsing and manipulating plain texts._
|
||||
- [python-user-agents](https://github.com/selwin/python-user-agents) - Browser user agent parser.
|
||||
- [sqlparse](https://github.com/andialbrecht/sqlparse) - A non-validating SQL parser.
|
||||
|
||||
## HTML Manipulation
|
||||
### HTML Manipulation
|
||||
|
||||
_Libraries for working with HTML and XML._
|
||||
|
||||
@@ -884,7 +884,7 @@ _Libraries for working with HTML and XML._
|
||||
- [tinycss2](https://github.com/Kozea/tinycss2) - A low-level CSS parser and generator written in Python.
|
||||
- [xmltodict](https://github.com/martinblech/xmltodict) - Working with XML feel like you are working with JSON.
|
||||
|
||||
## File Format Processing
|
||||
### File Format Processing
|
||||
|
||||
_Libraries for parsing and manipulating specific text formats._
|
||||
|
||||
@@ -918,7 +918,7 @@ _Libraries for parsing and manipulating specific text formats._
|
||||
- [pyyaml](https://github.com/yaml/pyyaml) - YAML implementations for Python.
|
||||
- [tomllib](https://docs.python.org/3/library/tomllib.html) - (Python standard library) Parse TOML files.
|
||||
|
||||
## File Manipulation
|
||||
### File Manipulation
|
||||
|
||||
_Libraries for file manipulation._
|
||||
|
||||
@@ -930,7 +930,7 @@ _Libraries for file manipulation._
|
||||
|
||||
**Media**
|
||||
|
||||
## Image Processing
|
||||
### Image Processing
|
||||
|
||||
_Libraries for manipulating images._
|
||||
|
||||
@@ -943,7 +943,7 @@ _Libraries for manipulating images._
|
||||
- [thumbor](https://github.com/thumbor/thumbor) - A smart imaging service. It enables on-demand crop, re-sizing and flipping of images.
|
||||
- [wand](https://github.com/emcconville/wand) - Python bindings for [MagickWand](https://www.imagemagick.org/script/magick-wand.php), C API for ImageMagick.
|
||||
|
||||
## Audio & Video Processing
|
||||
### Audio & Video Processing
|
||||
|
||||
_Libraries for manipulating audio, video, and their metadata._
|
||||
|
||||
@@ -960,7 +960,7 @@ _Libraries for manipulating audio, video, and their metadata._
|
||||
- [mutagen](https://github.com/quodlibet/mutagen) - A Python module to handle audio metadata.
|
||||
- [tinytag](https://github.com/devsnd/tinytag) - A library for reading music meta data of MP3, OGG, FLAC and Wave files.
|
||||
|
||||
## Game Development
|
||||
### Game Development
|
||||
|
||||
_Awesome game development libraries._
|
||||
|
||||
@@ -973,7 +973,7 @@ _Awesome game development libraries._
|
||||
|
||||
**Python Language**
|
||||
|
||||
## Implementations
|
||||
### Implementations
|
||||
|
||||
_Implementations of Python._
|
||||
|
||||
@@ -984,7 +984,7 @@ _Implementations of Python._
|
||||
- [pyodide](https://github.com/pyodide/pyodide) - Python distribution for the browser and Node.js based on WebAssembly.
|
||||
- [pypy](https://github.com/pypy/pypy) - A very fast and compliant implementation of the Python language.
|
||||
|
||||
## Built-in Classes Enhancement
|
||||
### Built-in Classes Enhancement
|
||||
|
||||
_Libraries for enhancing Python built-in classes._
|
||||
|
||||
@@ -992,7 +992,7 @@ _Libraries for enhancing Python built-in classes._
|
||||
- [bidict](https://github.com/jab/bidict) - Efficient, Pythonic bidirectional map data structures and related functionality.
|
||||
- [box](https://github.com/cdgriffith/Box) - Python dictionaries with advanced dot notation access.
|
||||
|
||||
## Functional Programming
|
||||
### Functional Programming
|
||||
|
||||
_Functional Programming with Python._
|
||||
|
||||
@@ -1003,7 +1003,7 @@ _Functional Programming with Python._
|
||||
- [returns](https://github.com/dry-python/returns) - A set of type-safe monads, transformers, and composition utilities.
|
||||
- [toolz](https://github.com/pytoolz/toolz) - A collection of functional utilities for iterators, functions, and dictionaries. Also available as [cytoolz](https://github.com/pytoolz/cytoolz/) for Cython-accelerated performance.
|
||||
|
||||
## Asynchronous Programming
|
||||
### Asynchronous Programming
|
||||
|
||||
_Libraries for asynchronous, concurrent and parallel execution. Also see [awesome-asyncio](https://github.com/timofurrer/awesome-asyncio)._
|
||||
|
||||
@@ -1017,7 +1017,7 @@ _Libraries for asynchronous, concurrent and parallel execution. Also see [awesom
|
||||
- [twisted](https://github.com/twisted/twisted) - An event-driven networking engine.
|
||||
- [uvloop](https://github.com/MagicStack/uvloop) - Ultra fast asyncio event loop.
|
||||
|
||||
## Date and Time
|
||||
### Date and Time
|
||||
|
||||
_Libraries for working with dates and times._
|
||||
|
||||
@@ -1028,7 +1028,7 @@ _Libraries for working with dates and times._
|
||||
|
||||
**Python Toolchain**
|
||||
|
||||
## Environment Management
|
||||
### Environment Management
|
||||
|
||||
_Libraries for Python version and virtual environment management._
|
||||
|
||||
@@ -1038,7 +1038,7 @@ _Libraries for Python version and virtual environment management._
|
||||
- [uv](https://github.com/astral-sh/uv) - An extremely fast Python version, package and project manager, written in Rust.
|
||||
- [virtualenv](https://github.com/pypa/virtualenv) - A tool to create isolated Python environments.
|
||||
|
||||
## Package Management
|
||||
### Package Management
|
||||
|
||||
_Libraries for package and dependency management._
|
||||
|
||||
@@ -1048,7 +1048,7 @@ _Libraries for package and dependency management._
|
||||
- [poetry](https://github.com/python-poetry/poetry) - Python dependency management and packaging made easy.
|
||||
- [uv](https://github.com/astral-sh/uv) - An extremely fast Python version, package and project manager, written in Rust.
|
||||
|
||||
## Package Repositories
|
||||
### Package Repositories
|
||||
|
||||
_Local PyPI repository server and proxies._
|
||||
|
||||
@@ -1056,7 +1056,7 @@ _Local PyPI repository server and proxies._
|
||||
- [devpi](https://github.com/devpi/devpi) - PyPI server and packaging/testing/release tool.
|
||||
- [warehouse](https://github.com/pypa/warehouse) - Next generation Python Package Repository (PyPI).
|
||||
|
||||
## Distribution
|
||||
### Distribution
|
||||
|
||||
_Libraries to create packaged executables for release distribution._
|
||||
|
||||
@@ -1066,7 +1066,7 @@ _Libraries to create packaged executables for release distribution._
|
||||
- [pyinstaller](https://github.com/pyinstaller/pyinstaller) - Converts Python programs into stand-alone executables (cross-platform).
|
||||
- [shiv](https://github.com/linkedin/shiv) - A command line utility for building fully self-contained zipapps (PEP 441), but with all their dependencies included.
|
||||
|
||||
## Configuration Files
|
||||
### Configuration Files
|
||||
|
||||
_Libraries for storing and parsing configuration options._
|
||||
|
||||
@@ -1078,13 +1078,13 @@ _Libraries for storing and parsing configuration options._
|
||||
|
||||
**Security**
|
||||
|
||||
## Cryptography
|
||||
### Cryptography
|
||||
|
||||
- [cryptography](https://github.com/pyca/cryptography) - A package designed to expose cryptographic primitives and recipes to Python developers.
|
||||
- [paramiko](https://github.com/paramiko/paramiko) - The leading native Python SSHv2 protocol library.
|
||||
- [pynacl](https://github.com/pyca/pynacl) - Python binding to the Networking and Cryptography (NaCl) library.
|
||||
|
||||
## Penetration Testing
|
||||
### Penetration Testing
|
||||
|
||||
_Frameworks and tools for penetration testing._
|
||||
|
||||
@@ -1093,7 +1093,7 @@ _Frameworks and tools for penetration testing._
|
||||
- [sherlock](https://github.com/sherlock-project/sherlock) - Hunt down social media accounts by username across social networks.
|
||||
- [sqlmap](https://github.com/sqlmapproject/sqlmap) - Automatic SQL injection and database takeover tool.
|
||||
|
||||
## Web Security
|
||||
### Web Security
|
||||
|
||||
_Libraries for application-layer web security._
|
||||
|
||||
@@ -1101,14 +1101,14 @@ _Libraries for application-layer web security._
|
||||
|
||||
**Other**
|
||||
|
||||
## Hardware
|
||||
### Hardware
|
||||
|
||||
_Libraries for programming with hardware._
|
||||
|
||||
- [bleak](https://github.com/hbldh/bleak) - A cross platform Bluetooth Low Energy Client for Python using asyncio.
|
||||
- [pynput](https://github.com/moses-palmer/pynput) - A library to control and monitor input devices.
|
||||
|
||||
## Microsoft Windows
|
||||
### Microsoft Windows
|
||||
|
||||
_Python programming on Microsoft Windows._
|
||||
|
||||
@@ -1116,7 +1116,7 @@ _Python programming on Microsoft Windows._
|
||||
- [pywin32](https://github.com/mhammond/pywin32) - Python Extensions for Windows.
|
||||
- [winpython](https://github.com/winpython/winpython) - Portable development environment for Windows 10/11.
|
||||
|
||||
## Miscellaneous
|
||||
### Miscellaneous
|
||||
|
||||
_Useful libraries or tools that don't fit in the categories above._
|
||||
|
||||
@@ -1125,18 +1125,18 @@ _Useful libraries or tools that don't fit in the categories above._
|
||||
- [itsdangerous](https://github.com/pallets/itsdangerous) - Various helpers to pass trusted data to untrusted environments.
|
||||
- [tryton](https://github.com/tryton/tryton) - A general-purpose business framework.
|
||||
|
||||
# Resources
|
||||
## Resources
|
||||
|
||||
Where to discover learning resources or new Python libraries.
|
||||
|
||||
## Newsletters
|
||||
### Newsletters
|
||||
|
||||
- [Awesome Python Newsletter](http://python.libhunt.com/newsletter)
|
||||
- [Pycoder's Weekly](https://pycoders.com/)
|
||||
- [Python Tricks](https://realpython.com/python-tricks/)
|
||||
- [Python Weekly](https://www.pythonweekly.com/)
|
||||
|
||||
## Podcasts
|
||||
### Podcasts
|
||||
|
||||
- [Django Chat](https://djangochat.com/)
|
||||
- [PyPodcats](https://pypodcats.live)
|
||||
@@ -1144,11 +1144,11 @@ Where to discover learning resources or new Python libraries.
|
||||
- [Talk Python To Me](https://talkpython.fm/)
|
||||
- [The Real Python Podcast](https://realpython.com/podcasts/rpp/)
|
||||
|
||||
## Websites
|
||||
### Websites
|
||||
|
||||
- [Python Developer Tooling Handbook](https://pydevtools.com/) - Comprehensive guide to modern Python developer tools covering package management, linting, type checking, testing, and more.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Your contributions are always welcome! Please take a look at the [contribution guidelines](https://github.com/vinta/awesome-python/blob/master/CONTRIBUTING.md) first.
|
||||
|
||||
|
||||
@@ -243,13 +243,14 @@ def write_sitemap_xml(path: Path, urls: Sequence[tuple[str, str]]) -> None:
|
||||
|
||||
def top_level_heading_text(line: str) -> str | None:
|
||||
stripped = line.strip()
|
||||
if not stripped.startswith("# "):
|
||||
match = re.match(r"^(#{1,2})\s+(.+)$", stripped)
|
||||
if match is None:
|
||||
return None
|
||||
return stripped.removeprefix("#").strip().strip("#").strip().strip("*").strip()
|
||||
return match.group(2).strip().strip("#").strip().strip("*").strip()
|
||||
|
||||
|
||||
def extract_categories_body(markdown: str) -> str:
|
||||
"""Return content under the `# Categories` heading, excluding the heading line itself."""
|
||||
"""Return content from `Categories` through `Projects`, excluding later sections."""
|
||||
lines = markdown.splitlines(keepends=True)
|
||||
start_idx = None
|
||||
end_idx = len(lines)
|
||||
@@ -261,7 +262,7 @@ def extract_categories_body(markdown: str) -> str:
|
||||
start_idx = i + 1
|
||||
while start_idx < len(lines) and lines[start_idx].strip() == "":
|
||||
start_idx += 1
|
||||
elif start_idx is not None and i >= start_idx:
|
||||
elif start_idx is not None and heading.lower() in ("resources", "contributing"):
|
||||
end_idx = i
|
||||
break
|
||||
if start_idx is None:
|
||||
|
||||
@@ -114,6 +114,13 @@ def _heading_text(node: SyntaxTreeNode) -> str:
|
||||
return ""
|
||||
|
||||
|
||||
def _heading_level(node: SyntaxTreeNode) -> int | None:
|
||||
"""Return the numeric level for a heading node."""
|
||||
if node.type != "heading" or not node.tag.startswith("h"):
|
||||
return None
|
||||
return int(node.tag[1:])
|
||||
|
||||
|
||||
def _extract_description_children(nodes: list[SyntaxTreeNode]) -> list[SyntaxTreeNode]:
|
||||
"""Extract description children from the first paragraph if it's a single <em> block.
|
||||
|
||||
@@ -303,7 +310,7 @@ def _parse_grouped_sections(
|
||||
) -> list[ParsedGroup]:
|
||||
"""Parse nodes into groups of categories using bold markers as group boundaries.
|
||||
|
||||
Bold-only paragraphs (**Group Name**) delimit groups. H2 headings under each
|
||||
Bold-only paragraphs (**Group Name**) delimit groups. H3 headings under each
|
||||
bold marker become categories within that group. Categories appearing before
|
||||
any bold marker go into an "Other" group.
|
||||
"""
|
||||
@@ -341,7 +348,7 @@ def _parse_grouped_sections(
|
||||
flush_group()
|
||||
current_group_name = bold_name
|
||||
current_cat_body = []
|
||||
elif node.type == "heading" and node.tag == "h2":
|
||||
elif node.type == "heading" and node.tag in ("h2", "h3"):
|
||||
flush_cat()
|
||||
current_cat_name = _heading_text(node)
|
||||
current_cat_body = []
|
||||
@@ -383,7 +390,7 @@ def _parse_sponsor_item(inline: SyntaxTreeNode) -> ParsedSponsor | None:
|
||||
|
||||
|
||||
def parse_sponsors(text: str) -> list[ParsedSponsor]:
|
||||
"""Parse the `# Sponsors` section of README.md into a list of sponsors.
|
||||
"""Parse the `Sponsors` section of README.md into a list of sponsors.
|
||||
|
||||
Expects bullets in the form `**[name](url)**: description`.
|
||||
Returns [] if no Sponsors section exists.
|
||||
@@ -395,14 +402,18 @@ def parse_sponsors(text: str) -> list[ParsedSponsor]:
|
||||
|
||||
start_idx = None
|
||||
end_idx = len(children)
|
||||
start_level = None
|
||||
for i, node in enumerate(children):
|
||||
if node.type == "heading" and node.tag == "h1":
|
||||
title = _heading_text(node).strip().lower()
|
||||
if start_idx is None and title == "sponsors":
|
||||
start_idx = i + 1
|
||||
elif start_idx is not None:
|
||||
end_idx = i
|
||||
break
|
||||
level = _heading_level(node)
|
||||
if level is None:
|
||||
continue
|
||||
title = _heading_text(node).strip().lower()
|
||||
if start_idx is None and title == "sponsors":
|
||||
start_idx = i + 1
|
||||
start_level = level
|
||||
elif start_idx is not None and start_level is not None and level <= start_level:
|
||||
end_idx = i
|
||||
break
|
||||
if start_idx is None:
|
||||
return []
|
||||
|
||||
@@ -426,26 +437,26 @@ def parse_readme(text: str) -> list[ParsedGroup]:
|
||||
"""Parse README.md text into grouped categories.
|
||||
|
||||
Returns a list of ParsedGroup dicts containing nested categories.
|
||||
Content between the thematic break (---) and # Resources or # Contributing
|
||||
is parsed as categories grouped by bold markers (**Group Name**).
|
||||
Content between the Projects heading and Resources or Contributing is parsed
|
||||
as categories grouped by bold markers (**Group Name**).
|
||||
"""
|
||||
md = MarkdownIt("commonmark")
|
||||
tokens = md.parse(text)
|
||||
root = SyntaxTreeNode(tokens)
|
||||
children = root.children
|
||||
|
||||
# Find thematic break (---) and section boundaries in one pass
|
||||
hr_idx = None
|
||||
# Find Projects and section boundaries in one pass.
|
||||
projects_idx = None
|
||||
cat_end_idx = None
|
||||
for i, node in enumerate(children):
|
||||
if hr_idx is None and node.type == "hr":
|
||||
hr_idx = i
|
||||
elif node.type == "heading" and node.tag == "h1":
|
||||
if _heading_level(node) in (1, 2):
|
||||
text_content = _heading_text(node)
|
||||
if cat_end_idx is None and text_content in ("Resources", "Contributing"):
|
||||
if projects_idx is None and text_content == "Projects":
|
||||
projects_idx = i
|
||||
elif cat_end_idx is None and text_content in ("Resources", "Contributing"):
|
||||
cat_end_idx = i
|
||||
if hr_idx is None:
|
||||
if projects_idx is None:
|
||||
return []
|
||||
|
||||
cat_nodes = children[hr_idx + 1 : cat_end_idx or len(children)]
|
||||
cat_nodes = children[projects_idx + 1 : cat_end_idx or len(children)]
|
||||
return _parse_grouped_sections(cat_nodes)
|
||||
|
||||
@@ -137,31 +137,31 @@ class TestBuild:
|
||||
|
||||
Intro.
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
## Widgets
|
||||
### Widgets
|
||||
|
||||
_Widget libraries. Also see [awesome-widgets](https://example.com/widgets)._
|
||||
|
||||
- [w1](https://example.com) - A widget.
|
||||
|
||||
## Gadgets
|
||||
### Gadgets
|
||||
|
||||
_Gadget tools._
|
||||
|
||||
- [g1](https://example.com) - A gadget.
|
||||
|
||||
# Resources
|
||||
## Resources
|
||||
|
||||
Info.
|
||||
|
||||
## Newsletters
|
||||
### Newsletters
|
||||
|
||||
- [NL](https://example.com)
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Help!
|
||||
""")
|
||||
@@ -179,17 +179,17 @@ class TestBuild:
|
||||
|
||||
Intro.
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
## Widgets
|
||||
### Widgets
|
||||
|
||||
- Sync
|
||||
|
||||
- [w1](https://example.com) - A widget.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Help!
|
||||
""")
|
||||
@@ -232,7 +232,7 @@ class TestBuild:
|
||||
|
||||
Intro.
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
@@ -298,28 +298,28 @@ class TestBuild:
|
||||
|
||||
Intro.
|
||||
|
||||
# **Sponsors**
|
||||
## **Sponsors**
|
||||
|
||||
- **[Sponsor](https://sponsor.example.com)**: Sponsored tool.
|
||||
|
||||
> Become a sponsor: [Sponsor us](SPONSORSHIP.md).
|
||||
|
||||
# Categories
|
||||
## Categories
|
||||
|
||||
**Tools**
|
||||
|
||||
- [Widgets](#widgets)
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
## Widgets
|
||||
### Widgets
|
||||
|
||||
- [w1](https://example.com) - A widget.
|
||||
- [w2](https://github.com/owner/w2) - A starred widget.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Help!
|
||||
""")
|
||||
@@ -353,7 +353,7 @@ class TestBuild:
|
||||
assert "## Categories" in llms_txt
|
||||
assert "**Tools**" in llms_txt
|
||||
assert "- [Widgets](#widgets)" in llms_txt
|
||||
assert "## Widgets" in llms_txt
|
||||
assert "### Widgets" in llms_txt
|
||||
assert "- [w1](https://example.com) - A widget." in llms_txt
|
||||
assert "- [w2](https://github.com/owner/w2) - A starred widget. (GitHub stars: 42)" in llms_txt
|
||||
assert llms_txt != readme
|
||||
@@ -363,7 +363,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Only
|
||||
|
||||
@@ -387,7 +387,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Stuff
|
||||
|
||||
@@ -431,7 +431,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Widgets**
|
||||
|
||||
@@ -538,7 +538,7 @@ class TestBuild:
|
||||
|
||||
Intro.
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
@@ -591,7 +591,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**AI & ML**
|
||||
|
||||
@@ -624,7 +624,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Web**
|
||||
|
||||
@@ -659,7 +659,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Web**
|
||||
|
||||
@@ -691,7 +691,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**AI & ML**
|
||||
|
||||
@@ -731,7 +731,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Sneaky </script><script>x=1</script>
|
||||
|
||||
@@ -760,7 +760,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**AI & ML**
|
||||
|
||||
@@ -800,7 +800,7 @@ class TestBuild:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**AI & ML**
|
||||
|
||||
@@ -980,7 +980,7 @@ class TestExtractEntries:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
@@ -1004,7 +1004,7 @@ class TestExtractEntries:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
@@ -1031,7 +1031,7 @@ class TestExtractEntries:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Stdlib
|
||||
|
||||
@@ -1050,7 +1050,7 @@ class TestExtractEntries:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Tools**
|
||||
|
||||
|
||||
@@ -81,35 +81,35 @@ MINIMAL_README = textwrap.dedent("""\
|
||||
|
||||
Some intro text.
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Alpha
|
||||
### Alpha
|
||||
|
||||
_Libraries for alpha stuff._
|
||||
|
||||
- [lib-a](https://example.com/a) - Does A.
|
||||
- [lib-b](https://example.com/b) - Does B.
|
||||
|
||||
## Beta
|
||||
### Beta
|
||||
|
||||
_Tools for beta._
|
||||
|
||||
- [lib-c](https://example.com/c) - Does C.
|
||||
|
||||
# Resources
|
||||
## Resources
|
||||
|
||||
Where to discover resources.
|
||||
|
||||
## Newsletters
|
||||
### Newsletters
|
||||
|
||||
- [News One](https://example.com/n1)
|
||||
- [News Two](https://example.com/n2)
|
||||
|
||||
## Podcasts
|
||||
### Podcasts
|
||||
|
||||
- [Pod One](https://example.com/p1)
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Please contribute!
|
||||
""")
|
||||
@@ -120,11 +120,11 @@ GROUPED_README = textwrap.dedent("""\
|
||||
|
||||
Some intro text.
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Group One**
|
||||
|
||||
## Alpha
|
||||
### Alpha
|
||||
|
||||
_Libraries for alpha stuff._
|
||||
|
||||
@@ -133,25 +133,25 @@ GROUPED_README = textwrap.dedent("""\
|
||||
|
||||
**Group Two**
|
||||
|
||||
## Beta
|
||||
### Beta
|
||||
|
||||
_Tools for beta._
|
||||
|
||||
- [lib-c](https://example.com/c) - Does C.
|
||||
|
||||
## Gamma
|
||||
### Gamma
|
||||
|
||||
- [lib-d](https://example.com/d) - Does D.
|
||||
|
||||
# Resources
|
||||
## Resources
|
||||
|
||||
Where to discover resources.
|
||||
|
||||
## Newsletters
|
||||
### Newsletters
|
||||
|
||||
- [News One](https://example.com/n1)
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Please contribute!
|
||||
""")
|
||||
@@ -191,7 +191,7 @@ class TestParseReadmeSections:
|
||||
all_names.extend(c["name"] for c in g["categories"])
|
||||
assert "Contributing" not in all_names
|
||||
|
||||
def test_no_separator(self):
|
||||
def test_no_projects_heading(self):
|
||||
groups = parse_readme("# Just a heading\n\nSome text.\n")
|
||||
assert groups == []
|
||||
|
||||
@@ -199,19 +199,19 @@ class TestParseReadmeSections:
|
||||
readme = textwrap.dedent("""\
|
||||
# Title
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## NullDesc
|
||||
### NullDesc
|
||||
|
||||
- [item](https://x.com) - Thing.
|
||||
|
||||
# Resources
|
||||
## Resources
|
||||
|
||||
## Tips
|
||||
### Tips
|
||||
|
||||
- [tip](https://x.com)
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Done.
|
||||
""")
|
||||
@@ -225,15 +225,15 @@ class TestParseReadmeSections:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Algos
|
||||
### Algos
|
||||
|
||||
_Algorithms. Also see [awesome-algos](https://example.com)._
|
||||
|
||||
- [lib](https://x.com) - Lib.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Done.
|
||||
""")
|
||||
@@ -273,17 +273,17 @@ class TestParseGroupedReadme:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Empty**
|
||||
|
||||
**HasCats**
|
||||
|
||||
## Cat
|
||||
### Cat
|
||||
|
||||
- [x](https://x.com) - X.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Done.
|
||||
""")
|
||||
@@ -295,15 +295,15 @@ class TestParseGroupedReadme:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
**Note:** This is not a group marker.
|
||||
|
||||
## Cat
|
||||
### Cat
|
||||
|
||||
- [x](https://x.com) - X.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Done.
|
||||
""")
|
||||
@@ -317,19 +317,19 @@ class TestParseGroupedReadme:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Orphan
|
||||
### Orphan
|
||||
|
||||
- [x](https://x.com) - X.
|
||||
|
||||
**A Group**
|
||||
|
||||
## Grouped
|
||||
### Grouped
|
||||
|
||||
- [y](https://x.com) - Y.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Done.
|
||||
""")
|
||||
@@ -405,15 +405,15 @@ class TestParseSectionEntries:
|
||||
readme = textwrap.dedent("""\
|
||||
# T
|
||||
|
||||
---
|
||||
## Projects
|
||||
|
||||
## Async
|
||||
### Async
|
||||
|
||||
- [asyncio](https://x.com) - Async I/O.
|
||||
- [awesome-asyncio](https://y.com)
|
||||
- [trio](https://z.com) - Friendly async.
|
||||
|
||||
# Contributing
|
||||
## Contributing
|
||||
|
||||
Done.
|
||||
""")
|
||||
@@ -480,21 +480,21 @@ class TestParseRealReadme:
|
||||
md = MarkdownIt("commonmark")
|
||||
root = SyntaxTreeNode(md.parse(self.readme_text))
|
||||
|
||||
# Find category section boundaries (between --- and # Resources/Contributing)
|
||||
hr_idx = None
|
||||
# Find category section boundaries (between Projects and Resources/Contributing)
|
||||
projects_idx = None
|
||||
end_idx = None
|
||||
for i, node in enumerate(root.children):
|
||||
if hr_idx is None and node.type == "hr":
|
||||
hr_idx = i
|
||||
elif node.type == "heading" and node.tag == "h1":
|
||||
if node.type == "heading" and node.tag in ("h1", "h2"):
|
||||
text = render_inline_text(node.children[0].children) if node.children else ""
|
||||
if end_idx is None and text in ("Resources", "Contributing"):
|
||||
if projects_idx is None and text == "Projects":
|
||||
projects_idx = i
|
||||
elif end_idx is None and text in ("Resources", "Contributing"):
|
||||
end_idx = i
|
||||
if hr_idx is None:
|
||||
if projects_idx is None:
|
||||
return
|
||||
|
||||
bad = []
|
||||
cat_nodes = root.children[hr_idx + 1 : end_idx or len(root.children)]
|
||||
cat_nodes = root.children[projects_idx + 1 : end_idx or len(root.children)]
|
||||
for node in cat_nodes:
|
||||
if node.type != "bullet_list":
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user