├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .github └── workflows │ └── update-readme.yml ├── .gitignore ├── Makefile ├── README.md ├── duckdb_extension_radar.py ├── img └── duckdb_extension_radar.png ├── poetry.lock ├── pyproject.toml └── test_duckdb_extension_radar.py /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.234.0/containers/python-3/.devcontainer/base.Dockerfile 2 | 3 | # [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster 4 | ARG VARIANT="3.10-bullseye" 5 | FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT} 6 | 7 | # [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 8 | ARG NODE_VERSION="none" 9 | RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi 10 | 11 | # [Optional] If your pip requirements rarely change, uncomment this section to add them to the image. 12 | # COPY requirements.txt /tmp/pip-tmp/ 13 | # RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \ 14 | # && rm -rf /tmp/pip-tmp 15 | 16 | # [Optional] Uncomment this section to install additional OS packages. 17 | # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 18 | # && apt-get -y install --no-install-recommends 19 | 20 | # [Optional] Uncomment this line to install global node packages. 21 | # RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.234.0/containers/python-3 3 | { 4 | "name": "Python 3", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | "context": "..", 8 | "args": { 9 | // Update 'VARIANT' to pick a Python version: 3, 3.10, 3.9, 3.8, 3.7, 3.6 10 | // Append -bullseye or -buster to pin to an OS version. 11 | // Use -bullseye variants on local on arm64/Apple Silicon. 12 | "VARIANT": "3.10-bullseye", 13 | // Options 14 | "NODE_VERSION": "none" 15 | } 16 | }, 17 | 18 | // Set *default* container specific settings.json values on container create. 19 | "settings": { 20 | "python.defaultInterpreterPath": "/usr/local/bin/python", 21 | "python.linting.enabled": true, 22 | "python.linting.pylintEnabled": true, 23 | "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", 24 | "python.formatting.blackPath": "/usr/local/py-utils/bin/black", 25 | "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", 26 | "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", 27 | "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", 28 | "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", 29 | "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", 30 | "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", 31 | "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint" 32 | }, 33 | 34 | // Add the IDs of extensions you want installed when the container is created. 35 | "extensions": [ 36 | "ms-python.python", 37 | "ms-python.vscode-pylance" 38 | ], 39 | 40 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 41 | // "forwardPorts": [], 42 | 43 | // Use 'postCreateCommand' to run commands after the container is created. 44 | "postCreateCommand": "pip3 install poetry && poetry config virtualenvs.create false && poetry install", 45 | 46 | // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 47 | "remoteUser": "root", 48 | "features": { 49 | "git": "os-provided" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /.github/workflows/update-readme.yml: -------------------------------------------------------------------------------- 1 | name: Update README with GitHub repos 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' # Run every day at midnight 6 | 7 | jobs: 8 | update-readme: 9 | runs-on: ubuntu-latest 10 | env: 11 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v2 15 | 16 | - name: Set up Python 17 | uses: actions/setup-python@v2 18 | with: 19 | python-version: '3.10' 20 | 21 | - name: Run image 22 | uses: abatilo/actions-poetry@v2 23 | 24 | - name: Install dependencies 25 | run: poetry install 26 | 27 | - name: Run script 28 | run: poetry run python duckdb_extension_radar.py 29 | 30 | - name: Commit and push changes 31 | uses: stefanzweifel/git-auto-commit-action@v4 32 | with: 33 | commit_message: 'Update README with GitHub repos' 34 | commit_options: '--no-verify' 35 | commit_user_name: 'GitHub Actions' 36 | commit_user_email: 'actions@github.com' 37 | file_pattern: 'README.md' 38 | branch: ${{ github.ref }} 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | __pycache__ 3 | .pytest_cache 4 | .vscode 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | install : 2 | poetry install 3 | 4 | pipeline : 5 | poetry run python duckdb_extension_radar.py 6 | 7 | format : 8 | black . 9 | isort . 10 | 11 | test : 12 | pytest 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![DuckDB Extensions Radar](/img/duckdb_extension_radar.png?raw=true) 2 | # DuckDB Extensions Radar 3 | 4 | This repo contains information about DuckDB extensions found on GitHub. Refreshed daily. Sorted by Created date. 5 | Last refresh **2025-06-02**. 6 | ## ⚠️ Disclaimer 7 | This is a bit hacky and searches for repos containing the string `.duckdb_extension`, so it's not 100% reliable. 8 | Extensions that are not included in the DuckDB core (and are not listed in the output from duckdb_extensions()) are considered unsigned. To install these extensions, you must use the `-unsigned` flag when launching DuckDB. Please be aware that installing unsigned extensions carries potential risks, as this repository does not endorse or guarantee the trustworthiness of any listed extensions. 9 | | Owner | Repository | Stars | Created | Last Updated | About | 10 | |:--------------------|:---------------------------------------------------------------------------------------------------------------------|--------:|:---------------------|:---------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 11 | | santosh-d3vpl3x | [duckdb_extensions](https://github.com/santosh-d3vpl3x/duckdb_extensions) | 23 | 2024-08-26T19:51:42Z | 2025-06-01T22:19:58Z | pip installable duckdb extensions published to pypi | 12 | | ahuarte47 | [duckdb-spatial-raster](https://github.com/ahuarte47/duckdb-spatial-raster) | 4 | 2025-04-11T22:15:16Z | 2025-06-01T22:02:38Z | This is a prototype of a geospatial extension for DuckDB that adds support for working with raster data | 13 | | sahilng | [ducknb](https://github.com/sahilng/ducknb) | 1 | 2025-03-26T16:38:47Z | 2025-06-01T18:26:39Z | VSCode Extension for Apple Silicon Macs that enables DuckDB SQL Notebooks | 14 | | cwida | [duckpgq-extension](https://github.com/cwida/duckpgq-extension) | 209 | 2023-04-05T07:26:55Z | 2025-06-01T13:06:00Z | DuckDB extension that adds support for SQL/PGQ and graph algorithms | 15 | | Query-farm | [shellfs](https://github.com/Query-farm/shellfs) | 71 | 2024-05-16T11:33:01Z | 2025-06-01T12:49:58Z | DuckDB extension allowing shell commands to be used for input and output. | 16 | | open3fs | [duckdb-3fs](https://github.com/open3fs/duckdb-3fs) | 24 | 2025-05-08T02:49:43Z | 2025-06-01T09:36:27Z | DuckDB 3FS Extension | 17 | | MHromiak | [DuckDBServer.py](https://github.com/MHromiak/DuckDBServer.py) | 0 | 2025-06-01T02:07:12Z | 2025-06-01T02:07:16Z | Lightweight Python wrapper around the DuckDB extension, httpserver (extension developed by @quackscience) | 18 | | mehd-io | [duckdb-extension-radar](https://github.com/mehd-io/duckdb-extension-radar) | 97 | 2023-02-24T12:54:44Z | 2025-06-01T00:14:00Z | This repo contains information about DuckDB extensions found on GitHub. Refreshed daily | 19 | | quackscience | [duckdb-extension-pyroscope](https://github.com/quackscience/duckdb-extension-pyroscope) | 17 | 2024-12-09T20:59:13Z | 2025-05-31T19:50:22Z | DuckDB Pyroscope Extension for Continuous Profiling | 20 | | RandomFractals | [duckdb-sql-tools](https://github.com/RandomFractals/duckdb-sql-tools) | 18 | 2022-12-24T15:44:28Z | 2025-05-31T17:36:07Z | DuckDB SQL Tools add DuckDB support to VSCode, and provide database schema and SQL query interfaces for the popular SQLTools extension, SQL query editor, language server, and data processing tools. | 21 | | linux-china | [duckdb-openmetrics](https://github.com/linux-china/duckdb-openmetrics) | 0 | 2025-05-31T10:12:54Z | 2025-05-31T15:44:05Z | A DuckDB extension to query metrics data from Prometheus and OpenMetrics. | 22 | | dais-polymtl | [flockmtl](https://github.com/dais-polymtl/flockmtl) | 220 | 2024-08-27T23:38:21Z | 2025-05-31T11:06:35Z | FlockMTL: DuckDB extension to seamlessly combine analytics and semantic analysis using language models (LMs) | 23 | | Query-farm | [airport](https://github.com/Query-farm/airport) | 236 | 2024-07-06T15:04:31Z | 2025-05-30T23:05:29Z | The Airport extension for DuckDB, enables the use of Arrow Flight with DuckDB | 24 | | duckdb | [duckdb-sqlite](https://github.com/duckdb/duckdb-sqlite) | 236 | 2021-10-12T11:51:06Z | 2025-05-30T16:48:10Z | DuckDB extension to read and write to SQLite databases | 25 | | spiraldb | [duckdb-vortex](https://github.com/spiraldb/duckdb-vortex) | 6 | 2025-04-17T10:30:34Z | 2025-05-30T14:53:38Z | DuckDB extension allowing reading/writing of vortex files | 26 | | duckdb | [duckdb-delta](https://github.com/duckdb/duckdb-delta) | 189 | 2024-05-15T08:03:38Z | 2025-05-30T12:32:13Z | DuckDB extension for Delta Lake | 27 | | duckdb | [extension-template](https://github.com/duckdb/extension-template) | 196 | 2023-02-02T11:52:03Z | 2025-05-30T10:48:42Z | Template for DuckDB extensions to help you develop, test and deploy a custom extension | 28 | | duckdb | [extension-ci-tools](https://github.com/duckdb/extension-ci-tools) | 27 | 2024-02-26T14:59:26Z | 2025-05-30T08:41:11Z | Repository containing reusable workflows / actions for building DuckDB extensions | 29 | | euiko | [duckdb-pgwire](https://github.com/euiko/duckdb-pgwire) | 19 | 2022-11-20T23:04:10Z | 2025-05-30T08:09:59Z | DuckDB extension to allow quacking with PostgreSQL protocol | 30 | | quackscience | [duckdb-extension-httpserver](https://github.com/quackscience/duckdb-extension-httpserver) | 202 | 2024-10-08T20:25:46Z | 2025-05-30T07:31:12Z | DuckDB HTTP API Server and Query Interface in a Community Extension | 31 | | duckdb | [duckdb-azure](https://github.com/duckdb/duckdb-azure) | 59 | 2023-07-06T15:02:30Z | 2025-05-30T06:50:05Z | Azure extension for DuckDB | 32 | | quackscience | [duckdb-extension-redis](https://github.com/quackscience/duckdb-extension-redis) | 4 | 2025-04-19T11:17:55Z | 2025-05-29T16:08:09Z | DuckDB Redis Client community extension | 33 | | Query-farm | [crypto](https://github.com/Query-farm/crypto) | 18 | 2024-06-26T02:00:44Z | 2025-05-29T08:34:32Z | DuckDB Extension for cryptographic hash functions and HMAC | 34 | | DataZooDE | [erpl-web](https://github.com/DataZooDE/erpl-web) | 12 | 2024-06-02T16:16:16Z | 2025-05-29T07:56:28Z | ERPL is a DuckDB extension to connect to API based ecosystems via standard interfaces like OData, GraphQL and REST. This works e.g. for SAP ERP, SAP Ariba, SAP C4C, Microsoft Dynamics and many more. | 35 | | martin-conur | [quackformers](https://github.com/martin-conur/quackformers) | 3 | 2025-04-17T13:19:32Z | 2025-05-29T03:08:12Z | DuckDB NLP extension. | 36 | | Query-farm | [datasketches](https://github.com/Query-farm/datasketches) | 19 | 2024-12-21T17:43:13Z | 2025-05-28T13:15:45Z | Integrates DuckDB with the high-performance Apache DataSketches library. This extension enables users to perform approximate analytics on large-scale datasets using state-of-the-art streaming algorithms, all from within DuckDB. | 37 | | duckdb | [reference-extension-c](https://github.com/duckdb/reference-extension-c) | 4 | 2024-11-23T09:17:21Z | 2025-05-28T09:23:31Z | DuckDB extension for testing the Extension C API | 38 | | Query-farm | [lindel](https://github.com/Query-farm/lindel) | 45 | 2024-06-29T19:55:08Z | 2025-05-28T07:12:23Z | DuckDB Extension Linearization/Delinearization, Z-Order, Hilbert and Morton Curves | 39 | | isaacbrodsky | [duckdb-zipfs](https://github.com/isaacbrodsky/duckdb-zipfs) | 34 | 2025-01-17T16:33:12Z | 2025-05-27T22:37:22Z | DuckDB extension to read files within zip archives. | 40 | | duckdb | [core-extensions](https://github.com/duckdb/core-extensions) | 0 | 2025-02-11T09:37:18Z | 2025-05-26T20:55:30Z | Tracking status of duckdb core extensions | 41 | | Query-farm | [fuzzycomplete](https://github.com/Query-farm/fuzzycomplete) | 16 | 2024-08-29T13:46:00Z | 2025-05-26T20:38:57Z | DuckDB Extension for fuzzy string matching based autocompletion | 42 | | teaguesterling | [duckdb_mcp](https://github.com/teaguesterling/duckdb_mcp) | 0 | 2025-05-26T18:41:12Z | 2025-05-26T18:41:19Z | A simple MCP server extension for DuckDB | 43 | | duckdb | [duckdb-excel](https://github.com/duckdb/duckdb-excel) | 36 | 2024-05-15T20:31:15Z | 2025-05-26T14:55:18Z | Excel extension for DuckDB | 44 | | hatamiarash7 | [duckdb-netquack](https://github.com/hatamiarash7/duckdb-netquack) | 14 | 2025-01-26T06:59:06Z | 2025-05-26T06:20:12Z | DuckDB extension for parsing, extracting, and analyzing domains, URIs, and paths with ease. | 45 | | vincent-chang | [duckdb-hdfs](https://github.com/vincent-chang/duckdb-hdfs) | 4 | 2023-11-08T12:57:22Z | 2025-05-26T06:13:37Z | duckdb hdfs extension | 46 | | duckdb | [duckdb_httpfs_wasm_experiment](https://github.com/duckdb/duckdb_httpfs_wasm_experiment) | 18 | 2023-10-16T11:25:45Z | 2025-05-25T23:25:34Z | HTTPFS extension for DuckDB. Adds support for an HTTPFileSytem and S3FileSystem. | 47 | | DataZooDE | [flapi](https://github.com/DataZooDE/flapi) | 28 | 2024-09-29T14:06:01Z | 2025-05-25T07:10:02Z | API Framework heavily relying on the power of DuckDB and DuckDB extensions. Ready to build performant and cost-efficient APIs on top of BigQuery or Snowflake for AI Agents and Data Apps | 48 | | quackscience | [duckdb-extension-clickhouse-sql](https://github.com/quackscience/duckdb-extension-clickhouse-sql) | 62 | 2024-07-06T10:30:09Z | 2025-05-24T15:21:20Z | DuckDB Community Extension implementing ClickHouse SQL Dialect macros and Custom functions for DuckDB | 49 | | Query-farm | [evalexpr_rhai](https://github.com/Query-farm/evalexpr_rhai) | 17 | 2024-07-05T03:59:36Z | 2025-05-23T16:24:41Z | A DuckDB extension to evaluate the Rhai scripting language as part of SQL. | 50 | | duckdb | [extension-template-c](https://github.com/duckdb/extension-template-c) | 16 | 2024-11-15T09:26:30Z | 2025-05-23T09:30:38Z | (Experimental) C/C++ template for DuckDB extensions based on the C API | 51 | | wfclark5 | [flockmtl](https://github.com/wfclark5/flockmtl) | 0 | 2025-05-13T19:24:24Z | 2025-05-23T03:53:35Z | FlockMTL: DuckDB extension to seamlessly combine analytics and semantic analysis using language models (LMs) | 52 | | quackscience | [duckdb-extension-openprompt](https://github.com/quackscience/duckdb-extension-openprompt) | 48 | 2024-10-20T21:33:51Z | 2025-05-22T21:34:01Z | DuckDB Community Extension to prompt LLMs from SQL | 53 | | fb64 | [duckdb-gcs-extension](https://github.com/fb64/duckdb-gcs-extension) | 0 | 2025-04-23T18:33:00Z | 2025-05-22T20:52:35Z | DuckDB Google Clous Storage extension | 54 | | quackscience | [duckdb-extension-httpclient](https://github.com/quackscience/duckdb-extension-httpclient) | 58 | 2024-10-13T19:02:56Z | 2025-05-22T18:52:27Z | DuckDB HTTP GET/POST Client in a Community Extension | 55 | | DataZooDE | [erpl](https://github.com/DataZooDE/erpl) | 42 | 2023-10-27T14:51:33Z | 2025-05-22T15:38:12Z | ERPL is a DuckDB extension to integrate Enterprise Data in your Data Science and ML pipelines within minutes! ERPL connects DuckDB to SAP ecosystem via standard interfaces. | 56 | | evidence-dev | [duckdb_gsheets](https://github.com/evidence-dev/duckdb_gsheets) | 260 | 2024-10-11T12:11:21Z | 2025-05-22T14:53:16Z | DuckDB extension to read and write Google Sheets using SQL | 57 | | duckdb | [extension-template-rs](https://github.com/duckdb/extension-template-rs) | 63 | 2024-11-07T15:26:47Z | 2025-05-22T10:12:50Z | (Experimental) Template for Rust-based DuckDB extensions | 58 | | Query-farm | [airport-docs](https://github.com/Query-farm/airport-docs) | 0 | 2025-03-17T10:01:59Z | 2025-05-22T00:12:58Z | The documentation for the DuckDB Airport extension. | 59 | | duckdb | [duckdb-sqlsmith](https://github.com/duckdb/duckdb-sqlsmith) | 4 | 2024-05-27T13:32:36Z | 2025-05-21T18:25:17Z | DuckDB SQLsmith extension repository | 60 | | quackscience | [duckdb-extension-cronjob](https://github.com/quackscience/duckdb-extension-cronjob) | 33 | 2024-11-15T18:47:49Z | 2025-05-20T18:36:47Z | DuckDB CronJob Extension | 61 | | hyehudai | [wireduck](https://github.com/hyehudai/wireduck) | 40 | 2025-03-14T13:38:51Z | 2025-05-20T03:09:21Z | Duckdb extension to read pcap files | 62 | | parkerdgabel | [quackML](https://github.com/parkerdgabel/quackML) | 27 | 2024-08-18T18:43:04Z | 2025-05-19T14:15:25Z | A duckDB extension implementing a full service AI/ML enginer | 63 | | duckdb | [arrow](https://github.com/duckdb/arrow) | 42 | 2022-11-01T14:41:47Z | 2025-05-17T10:05:37Z | Extension for DuckDB for functions that require the Apache Arrow dependency | 64 | | askyx | [pg_tpcds](https://github.com/askyx/pg_tpcds) | 1 | 2024-03-31T13:10:53Z | 2025-05-15T17:55:38Z | A plug-and-play postgres extension for testing tpcds, inspired by duckdb | 65 | | ywelsch | [duckdb-prql](https://github.com/ywelsch/duckdb-prql) | 291 | 2023-02-16T15:33:08Z | 2025-05-14T21:18:33Z | PRQL as a DuckDB extension | 66 | | DataBooth | [try-flockmtl](https://github.com/DataBooth/try-flockmtl) | 0 | 2025-05-09T03:00:38Z | 2025-05-12T03:57:04Z | FlockMTL DuckDB extension | 67 | | satur-io | [duckdb-ext](https://github.com/satur-io/duckdb-ext) | 1 | 2025-04-12T07:54:35Z | 2025-05-08T04:45:59Z | DuckDB extension for PHP | 68 | | rob2244 | [duckdb-snowflake](https://github.com/rob2244/duckdb-snowflake) | 6 | 2024-11-07T05:57:05Z | 2025-05-08T00:01:48Z | A duckdb extension which allows querying snowflake directly from duckdb | 69 | | 10adnan75 | [poly-learned-index](https://github.com/10adnan75/poly-learned-index) | 1 | 2025-04-23T23:18:31Z | 2025-05-07T08:15:17Z | Built a DuckDB extension implementing learned indexing using polynomial regression based on Microsoft's ALEX repository. Leveraged DuckDB's extension template to integrate machine learning techniques for indexing, resulting in measurably improved query performance through comprehensive benchmarking. | 70 | | bhargav191098 | [intelligent-duck](https://github.com/bhargav191098/intelligent-duck) | 4 | 2024-04-08T22:42:41Z | 2025-05-07T07:37:33Z | Adding an Alex learned index extension to DuckDB :) | 71 | | Hugoberry | [duckdb-pbix-extension](https://github.com/Hugoberry/duckdb-pbix-extension) | 20 | 2024-03-12T10:01:28Z | 2025-05-05T10:58:37Z | Duckdb extension for parsing the metadata and contents of the embedded data mode in PowerBI pbix files | 72 | | hrbrmstr | [duckdb-pcap](https://github.com/hrbrmstr/duckdb-pcap) | 15 | 2024-08-25T07:46:19Z | 2025-05-01T17:00:23Z | DuckDB extension for readin PCAP files | 73 | | quackscience | [duckdb-extension-pcap](https://github.com/quackscience/duckdb-extension-pcap) | 10 | 2024-12-06T17:49:52Z | 2025-05-01T16:59:27Z | DuckDB PCAP Reader Extension made in Rust | 74 | | quackscience | [copilot-extension-duckdb](https://github.com/quackscience/copilot-extension-duckdb) | 7 | 2024-12-13T20:17:52Z | 2025-04-30T23:04:56Z | DuckDB Copilot Extension | 75 | | cran | [duckspatial](https://github.com/cran/duckspatial) | 0 | 2025-04-19T13:35:21Z | 2025-04-29T19:28:47Z | :exclamation: This is a read-only mirror of the CRAN R package repository. duckspatial — R Interface to 'DuckDB' Database with Spatial Extension. Homepage: https://cidree.github.io/duckspatial/, https://github.com/Cidree/duckspatial Report bugs for this package: https://github.com/Cidree/duckspatial/issues | 76 | | 0xcaff | [duckdb_protobuf](https://github.com/0xcaff/duckdb_protobuf) | 24 | 2024-06-10T07:23:39Z | 2025-04-29T08:41:51Z | a duckdb extension for querying encoded protobuf messages | 77 | | EpsilonPrime | [duckdb-extension-manager](https://github.com/EpsilonPrime/duckdb-extension-manager) | 0 | 2025-04-29T05:36:22Z | 2025-04-29T05:47:03Z | A GitHub action that collects and caches specific versions of DuckDB extensions | 78 | | rupurt | [odbc-scanner-duckdb-extension](https://github.com/rupurt/odbc-scanner-duckdb-extension) | 86 | 2023-05-29T22:21:53Z | 2025-04-28T22:04:55Z | A DuckDB extension to read data directly from databases supporting the ODBC interface | 79 | | krokozyab | [ofquack](https://github.com/krokozyab/ofquack) | 2 | 2025-04-17T21:27:35Z | 2025-04-27T18:57:47Z | Oracle Fusion DuckDB extension | 80 | | mlafeldt | [quack-zig](https://github.com/mlafeldt/quack-zig) | 19 | 2025-01-13T10:12:45Z | 2025-04-20T19:23:15Z | The infamous DuckDB quack extension rewritten in C and built with Zig | 81 | | qleroy | [duckdb_grist](https://github.com/qleroy/duckdb_grist) | 1 | 2025-03-16T07:58:42Z | 2025-04-20T09:36:07Z | DuckDB extension to read and write Grist documents and tables using SQL | 82 | | dacort | [duckdb-athena-extension](https://github.com/dacort/duckdb-athena-extension) | 54 | 2023-02-22T00:06:36Z | 2025-04-19T19:41:09Z | An experimental Athena extension for DuckDB 🐤 | 83 | | maropu | [duckdb_scanner_example](https://github.com/maropu/duckdb_scanner_example) | 0 | 2024-11-23T10:27:36Z | 2025-04-19T09:36:06Z | A minimum scanner extension example for DuckDB | 84 | | softprops | [zig-duckdb-ext](https://github.com/softprops/zig-duckdb-ext) | 11 | 2024-04-28T05:00:09Z | 2025-04-15T02:33:55Z | 🐥 a duckdb extension library for zig | 85 | | yutannihilation | [duckdb-ext-file-dialog](https://github.com/yutannihilation/duckdb-ext-file-dialog) | 11 | 2025-03-31T13:49:14Z | 2025-04-14T13:36:17Z | A DuckDB extension to choose file interactively using native file open dialogs | 86 | | quackscience | [duckdb-extension-clickhouse-native](https://github.com/quackscience/duckdb-extension-clickhouse-native) | 13 | 2024-12-07T22:21:44Z | 2025-04-11T14:33:26Z | Experimental ClickHouse Native Client and Native file reader Extension for DuckDB chsql | 87 | | rustyconover | [duckdb-cron-extension](https://github.com/rustyconover/duckdb-cron-extension) | 25 | 2024-05-28T02:41:03Z | 2025-04-10T18:01:55Z | DuckDB Cron Expression Extension | 88 | | Kayrnt | [duckdb_mysql_scanner](https://github.com/Kayrnt/duckdb_mysql_scanner) | 16 | 2023-06-24T19:58:28Z | 2025-04-09T10:25:46Z | DuckDB extension for MySQL | 89 | | wheretrue | [exon-duckdb](https://github.com/wheretrue/exon-duckdb) | 16 | 2023-04-28T14:30:43Z | 2025-04-04T18:21:55Z | DuckDB Extension for working with bioinformatic data. | 90 | | TheCedarPrince | [DuckDBServer.jl](https://github.com/TheCedarPrince/DuckDBServer.jl) | 1 | 2025-04-01T21:57:37Z | 2025-04-03T19:10:28Z | Lightweight Julia wrapper around the DuckDB extension, httpserver (extension developed by @quackscience) | 91 | | quackscience | [duckstats](https://github.com/quackscience/duckstats) | 2 | 2024-10-27T09:43:18Z | 2025-03-29T06:27:15Z | DuckDB Community Extension Download Stats & Badges | 92 | | jakoch | [duckdb-php-ext](https://github.com/jakoch/duckdb-php-ext) | 0 | 2025-03-21T16:08:45Z | 2025-03-21T16:08:45Z | PHP extension for DuckDB | 93 | | romangershgorin | [duckdb-glue](https://github.com/romangershgorin/duckdb-glue) | 1 | 2025-03-06T10:57:42Z | 2025-03-20T10:58:03Z | Extension to work with AWS Glue from duckdb | 94 | | xevix | [duckdb-autoattach](https://github.com/xevix/duckdb-autoattach) | 1 | 2025-02-26T00:45:40Z | 2025-03-14T00:31:56Z | DuckDB Extension to ATTACH latest files automatically | 95 | | rupurt | [adbc-scanner-duckdb-extension](https://github.com/rupurt/adbc-scanner-duckdb-extension) | 2 | 2023-08-08T03:26:38Z | 2025-03-13T13:45:19Z | A DuckDB extension to read data directly from databases supporting the ADBC interface | 96 | | NickCrews | [libpostal-duckdb](https://github.com/NickCrews/libpostal-duckdb) | 4 | 2023-11-28T21:57:04Z | 2025-03-12T15:11:44Z | A DuckDB WASM extension that wraps libpostal for address parsing | 97 | | mostsignificant | [duckdb_faker](https://github.com/mostsignificant/duckdb_faker) | 1 | 2024-04-06T20:09:33Z | 2025-03-12T14:56:17Z | A simple DuckDB extension for generating fake data | 98 | | xevix | [duckdb-sqruff](https://github.com/xevix/duckdb-sqruff) | 1 | 2025-03-08T23:21:10Z | 2025-03-10T22:49:30Z | DuckDB extension to format SQL using sqruff | 99 | | toppyy | [duckdb-px](https://github.com/toppyy/duckdb-px) | 0 | 2024-12-23T17:14:25Z | 2025-03-09T08:09:12Z | Duckdb extension for querying .px-files | 100 | | bradns | [duckdb-pdf-extension](https://github.com/bradns/duckdb-pdf-extension) | 1 | 2025-02-26T15:41:09Z | 2025-03-08T04:28:30Z | A DuckDB extension to read data from financial PDF files | 101 | | AnyBlox | [duckdb-anyblox](https://github.com/AnyBlox/duckdb-anyblox) | 0 | 2025-03-01T23:04:10Z | 2025-03-02T01:02:19Z | DuckDB extension for AnyBlox | 102 | | definite-app | [duckdb-extensions](https://github.com/definite-app/duckdb-extensions) | 1 | 2025-02-22T02:57:47Z | 2025-02-25T06:37:56Z | 🦆 Custom extensions for DuckDB + Definite | 103 | | drin | [duckdb-skytether](https://github.com/drin/duckdb-skytether) | 0 | 2024-04-29T22:17:18Z | 2025-02-24T19:29:37Z | An integrated repository for duckdb and various development extensions to support skytether functionality. | 104 | | wheretrue | [fasql](https://github.com/wheretrue/fasql) | 21 | 2023-03-17T05:19:17Z | 2025-02-23T04:20:23Z | DuckDB Extension for reading and writing FASTA and FASTQ Files | 105 | | ChannabasavAngadi | [spark_duckDB_extension](https://github.com/ChannabasavAngadi/spark_duckDB_extension) | 0 | 2025-02-17T16:25:52Z | 2025-02-21T02:41:37Z | this extension allows you to write spark df to duckdb hassle free becuase erlier you can not write from spark to duckdb directly because of duckDB's write once but spark write with muliple writer's (so will raise error : lock already set ) with this package you dont need to worrry about all these. | 106 | | quackscience | [duckdb-extension-tsid](https://github.com/quackscience/duckdb-extension-tsid) | 3 | 2024-12-09T14:40:58Z | 2025-02-20T04:35:56Z | TSID Extension for DuckDB | 107 | | quackscience | [duckdb-community-macros](https://github.com/quackscience/duckdb-community-macros) | 1 | 2024-12-15T00:36:54Z | 2025-02-20T04:35:18Z | DuckDB Macro URL Shortner for Webmacro Extension | 108 | | quackscience | [duckdb-kton-extension](https://github.com/quackscience/duckdb-kton-extension) | 2 | 2025-02-10T10:42:29Z | 2025-02-20T04:33:26Z | DuckDB KTON extension | 109 | | quackscience | [duckdb-extension-dht](https://github.com/quackscience/duckdb-extension-dht) | 5 | 2024-11-12T12:39:47Z | 2025-02-20T04:32:26Z | WIP DuckDB DHT Client Extension | 110 | | Coco-Alemana | [duckdb_hyper](https://github.com/Coco-Alemana/duckdb_hyper) | 0 | 2025-02-19T03:53:59Z | 2025-02-19T03:54:05Z | A DuckDB extension for Tableau's Hyper file type | 111 | | KaratayBerkay | [duckdb-postgres-extension](https://github.com/KaratayBerkay/duckdb-postgres-extension) | 1 | 2025-02-18T14:13:14Z | 2025-02-18T16:43:52Z | Duckdb integrated and no extension postgres compare | 112 | | ajzo90 | [duckdb-extension-xxhash](https://github.com/ajzo90/duckdb-extension-xxhash) | 3 | 2024-09-16T06:38:35Z | 2025-02-18T07:52:13Z | DuckDB Extension for xxhash functions | 113 | | teaguesterling | [geneducks](https://github.com/teaguesterling/geneducks) | 0 | 2024-11-13T03:33:21Z | 2025-02-17T05:26:56Z | DuckDB extension for working with common genetics file types | 114 | | taniabogatsch | [goofy-duck](https://github.com/taniabogatsch/goofy-duck) | 4 | 2024-09-25T11:46:50Z | 2025-02-16T09:34:44Z | A small Go extension for DuckDB | 115 | | quackscience | [duckdb-extension-kafquack](https://github.com/quackscience/duckdb-extension-kafquack) | 9 | 2024-12-16T01:40:12Z | 2025-02-14T23:09:49Z | Experimental DuckDB Kafka Consumer Extension | 116 | | dforsber | [duckdb-kton-extension](https://github.com/dforsber/duckdb-kton-extension) | 0 | 2025-02-05T20:31:29Z | 2025-02-10T10:52:31Z | DuckDB KTON extension | 117 | | toukoudo | [simple-duckdb-vscode-extension](https://github.com/toukoudo/simple-duckdb-vscode-extension) | 0 | 2025-02-09T02:31:34Z | 2025-02-09T04:03:54Z | A very simple VSCode extension with DuckDB-wasm | 118 | | Smallhi | [duckdb-odps](https://github.com/Smallhi/duckdb-odps) | 1 | 2025-02-03T03:23:44Z | 2025-02-08T03:05:58Z | duckdb extension for odps(MaxCompute) of aliyun | 119 | | Mause | [duckdb-deltatable-extension](https://github.com/Mause/duckdb-deltatable-extension) | 95 | 2022-09-30T06:10:58Z | 2025-02-06T12:26:20Z | A purely experimental DuckDB Deltalake extension | 120 | | slvoinea | [duckdb-strict-cast](https://github.com/slvoinea/duckdb-strict-cast) | 0 | 2025-01-20T09:12:56Z | 2025-02-03T15:45:01Z | A DuckDB extension that offer a strict cast function for strings to decimals and integers. | 121 | | rupurt | [duckdb-airport-extension-nix](https://github.com/rupurt/duckdb-airport-extension-nix) | 0 | 2025-02-01T19:46:50Z | 2025-02-01T22:31:34Z | Nix flake for the DuckDB Airport extension | 122 | | LeoMaurice | [readstat-duckdb](https://github.com/LeoMaurice/readstat-duckdb) | 2 | 2024-12-16T16:41:21Z | 2025-02-01T19:03:25Z | Trying to create a wrapper of readstat in Rust to be an extension of duckdb to read canonical statistics software files (sas, spss, state) | 123 | | quackscience | [duckdb-extension-rs-tsid](https://github.com/quackscience/duckdb-extension-rs-tsid) | 2 | 2024-12-06T15:50:59Z | 2025-02-01T19:03:20Z | DuckDB Community Extension generating Time-Sorted Unique Identifiers (TSID) | 124 | | quackscience | [duckdb-extension-wvlet](https://github.com/quackscience/duckdb-extension-wvlet) | 5 | 2024-11-23T14:40:31Z | 2025-02-01T19:03:12Z | Wvlet flow-style query language in a DuckDB Extension | 125 | | joeirimpan | [duckdb-fnv](https://github.com/joeirimpan/duckdb-fnv) | 4 | 2024-08-23T15:43:27Z | 2025-02-01T19:02:31Z | Duckdb extension to calculate fnv hash, fnv partition bucket for a given hash. | 126 | | rupurt | [duckdb-extension-template-zig](https://github.com/rupurt/duckdb-extension-template-zig) | 28 | 2024-02-25T03:42:59Z | 2025-02-01T16:01:59Z | A Zig template for building DuckDB extensions | 127 | | yajirobee | [duckdb_msgpack_extension](https://github.com/yajirobee/duckdb_msgpack_extension) | 2 | 2023-09-28T04:03:15Z | 2025-01-29T11:59:59Z | DuckDB extension to retrieve MessagePack format data | 128 | | dazzleduck-admin | [duckdb-extension](https://github.com/dazzleduck-admin/duckdb-extension) | 0 | 2025-01-28T17:38:42Z | 2025-01-28T17:38:48Z | DuckDB extension | 129 | | hannes | [curl](https://github.com/hannes/curl) | 7 | 2024-10-18T14:03:37Z | 2025-01-12T21:58:20Z | duckdb extension for curl | 130 | | quackscience | [duckdb-extension-clickhouse-system](https://github.com/quackscience/duckdb-extension-clickhouse-system) | 4 | 2025-01-03T20:03:12Z | 2025-01-08T16:01:38Z | DuckDB Community Extension emulating the ClickHouse system table | 131 | | blackrez | [litegeo](https://github.com/blackrez/litegeo) | 2 | 2024-01-17T20:44:04Z | 2024-12-31T16:03:15Z | Lite geo is an extension for duckdb adding some geometric functions in duckdb. Based on the excellent and fast tg library. | 132 | | teaguesterling | [duckdb-extension-graphql-client](https://github.com/teaguesterling/duckdb-extension-graphql-client) | 0 | 2024-12-31T02:50:56Z | 2024-12-31T02:55:16Z | A graphql client extension for duckdb | 133 | | alitrack | [duckdb_python](https://github.com/alitrack/duckdb_python) | 0 | 2024-11-26T03:53:48Z | 2024-12-30T22:31:03Z | Python extension for DuckDB | 134 | | salomartin | [duckdb-vscode-runner](https://github.com/salomartin/duckdb-vscode-runner) | 0 | 2024-12-11T20:34:53Z | 2024-12-11T20:34:58Z | A powerful Visual Studio Code extension that provides seamless integration with DuckDB, featuring live query execution and advanced result visualization capabilities. | 135 | | michael-doubez | [duckdb_smb](https://github.com/michael-doubez/duckdb_smb) | 0 | 2024-12-10T20:43:13Z | 2024-12-11T08:00:43Z | DuckDB Extension to access samba files | 136 | | Ezzaldin97 | [tiny-semantic-caching](https://github.com/Ezzaldin97/tiny-semantic-caching) | 5 | 2024-05-31T18:41:14Z | 2024-12-09T08:28:06Z | using Ollama and Duckdb Vector Search Extension to build in Memory Semantic Caching Database | 137 | | ahmad1284 | [devops-demo](https://github.com/ahmad1284/devops-demo) | 0 | 2024-12-05T14:01:55Z | 2024-12-05T14:45:44Z | Building duckdb from the source in order to add required extensions. | 138 | | joseph-njogu | [devops-demo](https://github.com/joseph-njogu/devops-demo) | 0 | 2024-12-05T13:36:01Z | 2024-12-05T14:14:40Z | Building duckdb from the source in order to add required extensions. | 139 | | jishrup | [RadixSpline](https://github.com/jishrup/RadixSpline) | 0 | 2024-11-27T03:52:35Z | 2024-11-29T22:41:22Z | Adding RadixSpline Indexing as an extension into DuckDB | 140 | | jishrup | [DuckDB](https://github.com/jishrup/DuckDB) | 0 | 2024-11-27T22:08:26Z | 2024-11-28T04:20:02Z | Added functionality to support fetching entire column as vector for supporting RadixSpline Index as an extension in DuckDB | 141 | | samansmink | [extension-template-c](https://github.com/samansmink/extension-template-c) | 3 | 2024-11-12T21:44:25Z | 2024-11-17T01:58:02Z | (Experimental) Extension template for C++/C based extension using DuckDB's C API | 142 | | daranzolin | [datasf-to-duckdb](https://github.com/daranzolin/datasf-to-duckdb) | 1 | 2024-11-15T04:23:38Z | 2024-11-15T04:48:52Z | Chrome Extension to open DataSF resources in DuckDB Shell | 143 | | Smallhi | [duckdb-roaringbitmap](https://github.com/Smallhi/duckdb-roaringbitmap) | 0 | 2024-10-30T05:09:26Z | 2024-11-12T14:34:38Z | duckdb roaringbitmap extension | 144 | | samansmink | [extension-template-rs](https://github.com/samansmink/extension-template-rs) | 4 | 2024-09-16T11:26:22Z | 2024-11-10T01:05:25Z | PoC for a Rust-based extension template for DuckDB based on the Extension C API | 145 | | lmangani | [ducktorrent-extension](https://github.com/lmangani/ducktorrent-extension) | 1 | 2024-10-27T14:33:32Z | 2024-11-02T17:48:48Z | Peer Discovery Extension for DuckDB | 146 | | itsknk | [duckdb_extension_tryout](https://github.com/itsknk/duckdb_extension_tryout) | 0 | 2024-10-30T19:32:11Z | 2024-10-30T20:26:40Z | trying out stuff with duckdb extensions | 147 | | Smallhi | [duckdb-bsi](https://github.com/Smallhi/duckdb-bsi) | 0 | 2024-10-30T05:10:11Z | 2024-10-30T05:10:17Z | duckdb bit-sliced index extension | 148 | | BGameiro2000 | [ROOT4DuckDB](https://github.com/BGameiro2000/ROOT4DuckDB) | 0 | 2024-10-29T09:50:05Z | 2024-10-29T09:52:59Z | Proof-of-concept DuckDB extension for read-only access to CERN ROOT files. | 149 | | circle-queue | [vscode-syntax-highlight-duckdb-in-python](https://github.com/circle-queue/vscode-syntax-highlight-duckdb-in-python) | 0 | 2024-10-17T18:54:40Z | 2024-10-23T08:29:55Z | A VSCode extension for formatting DuckDB SQL strings in .py files | 150 | | samansmink | [url-parse-extension](https://github.com/samansmink/url-parse-extension) | 2 | 2024-03-22T13:27:44Z | 2024-10-09T08:27:14Z | Demo extension for DuckDB blogpost | 151 | | mostsignificant | [duckdb_xml](https://github.com/mostsignificant/duckdb_xml) | 1 | 2024-04-11T20:48:55Z | 2024-10-09T08:24:39Z | A DuckDB extension for reading XML files | 152 | | ttanay | [duckdb-vector](https://github.com/ttanay/duckdb-vector) | 9 | 2023-08-16T17:35:13Z | 2024-10-09T08:22:39Z | Vector extension for duckdb | 153 | | opensourceworks-org | [notmongo](https://github.com/opensourceworks-org/notmongo) | 0 | 2024-09-21T15:13:24Z | 2024-09-30T08:23:52Z | A json api extension for duckdb. | 154 | | rupurt | [record-duckdb-extension](https://github.com/rupurt/record-duckdb-extension) | 6 | 2023-06-14T04:11:24Z | 2024-09-23T05:51:17Z | A DuckDB extension to read/write records from binary or text encoded files | 155 | | ximonsson | [duckdb_ext](https://github.com/ximonsson/duckdb_ext) | 0 | 2024-09-08T19:50:34Z | 2024-09-08T19:50:39Z | My extensions for DuckDB | 156 | | samansmink | [aws](https://github.com/samansmink/aws) | 2 | 2023-03-14T11:40:50Z | 2024-08-23T23:46:49Z | DuckDB AWS extension | 157 | | johanlaursen | [oml_extension](https://github.com/johanlaursen/oml_extension) | 0 | 2023-11-09T14:11:24Z | 2024-08-22T12:46:28Z | Oml extension for Duckdb for Advanced Datasystems course | 158 | | bqbooster | [duckdb_bigquery_scanner](https://github.com/bqbooster/duckdb_bigquery_scanner) | 4 | 2024-04-19T22:40:20Z | 2024-08-18T20:46:02Z | DuckDB BigQuery FDW extension | 159 | | cgumpert | [duckdb-avro](https://github.com/cgumpert/duckdb-avro) | 0 | 2024-08-07T17:48:04Z | 2024-08-07T17:48:10Z | Extension to load Avro data into duckdb | 160 | | Smallhi | [duckdb-maxcompute](https://github.com/Smallhi/duckdb-maxcompute) | 0 | 2024-07-21T09:15:23Z | 2024-07-21T09:15:27Z | duckdb extension for maxcompute of aliyun | 161 | | rustyconover | [duckdb-cron-expression-extension](https://github.com/rustyconover/duckdb-cron-expression-extension) | 0 | 2024-07-13T11:40:19Z | 2024-07-13T11:40:25Z | DuckDB Extension for Cron Expressions | 162 | | nydasco | [dbt_with_dagster_and_turntable](https://github.com/nydasco/dbt_with_dagster_and_turntable) | 0 | 2024-06-29T03:09:48Z | 2024-06-29T03:09:48Z | An extension of the dbt_with_duckdb repo, adding Dagster for orchestration and Turntable for field lineage | 163 | | jghoman | [duckdb-apachedatasketches-extension](https://github.com/jghoman/duckdb-apachedatasketches-extension) | 0 | 2024-06-23T20:40:13Z | 2024-06-25T01:39:50Z | Extension for accessing Apache Datasketches methods through DuckDB | 164 | | Angus-Toms | [QuackML](https://github.com/Angus-Toms/QuackML) | 2 | 2023-12-18T15:04:39Z | 2024-06-19T13:28:35Z | Source code for an ML extension for DuckDB - MInf project @ The University of Edinburgh | 165 | | arjunbajaj | [libduckdb-alpine](https://github.com/arjunbajaj/libduckdb-alpine) | 0 | 2024-06-14T17:25:28Z | 2024-06-14T17:26:03Z | `libduckdb.so` and `sqlite_scanner.duckdb_extension` compiled for Alpine Linux | 166 | | barnardh | [extension-template](https://github.com/barnardh/extension-template) | 0 | 2024-06-12T07:38:44Z | 2024-06-12T07:38:50Z | DuckDB extension template | 167 | | MichaelBelousov | [duckdb-test-extension](https://github.com/MichaelBelousov/duckdb-test-extension) | 0 | 2024-06-01T18:19:09Z | 2024-06-05T22:08:49Z | test duckdb extension. The intent is to test how possible an IFC file backend is possible. | 168 | | raywill | [duckfly](https://github.com/raywill/duckfly) | 0 | 2024-05-27T03:24:09Z | 2024-05-27T03:24:14Z | Test duckdb extension | 169 | | zmajeed | [hack_duckdb_gql](https://github.com/zmajeed/hack_duckdb_gql) | 0 | 2024-05-16T06:19:52Z | 2024-05-16T14:18:20Z | A DuckDB extension that runs GQL queries on a graph stored in relational tables | 170 | | samansmink | [delta-kernel-testing](https://github.com/samansmink/delta-kernel-testing) | 1 | 2024-03-13T14:09:35Z | 2024-05-15T13:08:24Z | Testing out delta kernel in duckdb extension | 171 | | murfffi | [sampleduck](https://github.com/murfffi/sampleduck) | 0 | 2024-03-21T13:07:11Z | 2024-03-21T13:07:17Z | DuckDB extensions with aggregation functions for sampled data | 172 | | rupurt | [duckdb-extension-ftpfs](https://github.com/rupurt/duckdb-extension-ftpfs) | 1 | 2023-07-27T04:53:46Z | 2024-03-13T11:31:24Z | FTP file system extension for DuckDB | 173 | | vincent-chang | [duckdb-hdfs-docker](https://github.com/vincent-chang/duckdb-hdfs-docker) | 0 | 2024-01-13T04:55:41Z | 2024-01-14T15:31:18Z | DuckDB Hadoopfs Extension Docker | 174 | | joseph-njogu | [duckdb](https://github.com/joseph-njogu/duckdb) | 0 | 2024-01-12T06:12:54Z | 2024-01-12T06:12:54Z | Building duckdb from the source in order to add required extensions. | 175 | | maartenbosteels | [duckdb-docker-apple-silicon](https://github.com/maartenbosteels/duckdb-docker-apple-silicon) | 0 | 2023-11-30T10:08:03Z | 2023-11-30T10:20:46Z | Use duckdb extensions in a container on Apple Silicon (Apple M1, M2 or Mx) | 176 | | nikso-itu | [duckdb-oml](https://github.com/nikso-itu/duckdb-oml) | 0 | 2023-11-02T16:24:02Z | 2023-11-07T22:36:39Z | OML extension for DuckDB. Enables the loading of OML files into DuckDB. Created as part of the course named "Advanced Data Systems" at ITU. | 177 | | felix-schott | [duckdb-spatial-bug](https://github.com/felix-schott/duckdb-spatial-bug) | 0 | 2023-10-15T09:34:42Z | 2023-10-15T09:41:16Z | Minimal example to reproduce DuckDB spatial extension shapefile export bug | 178 | | Kayrnt | [duckdb-extension-workflow](https://github.com/Kayrnt/duckdb-extension-workflow) | 1 | 2023-08-26T01:06:16Z | 2023-08-31T08:38:36Z | DuckDB extension workflow diagrams | 179 | | rupurt | [cobol-copybook-duckdb-extension](https://github.com/rupurt/cobol-copybook-duckdb-extension) | 0 | 2023-08-16T04:18:54Z | 2023-08-16T04:18:59Z | A DuckDB extension to read mainframe record files given a COBOL copybook schema | 180 | | samansmink | [extension-workflows](https://github.com/samansmink/extension-workflows) | 0 | 2023-08-03T07:47:07Z | 2023-08-03T07:47:07Z | Contains reusable github workflows for DuckDB extensions | 181 | | jimexist | [duckdb-hnsw](https://github.com/jimexist/duckdb-hnsw) | 1 | 2023-04-21T06:43:52Z | 2023-08-02T02:31:02Z | Duckdb extension supporting ANN search based on HNSW | 182 | | spoke-data | [duckdb-extension-spoke](https://github.com/spoke-data/duckdb-extension-spoke) | 1 | 2023-07-31T15:10:00Z | 2023-07-31T17:11:08Z | DuckDB extension for Spoke. The universal data connector | 183 | | rupurt | [duckdb-extension-memphis](https://github.com/rupurt/duckdb-extension-memphis) | 0 | 2023-07-31T01:18:47Z | 2023-07-31T01:18:52Z | Memphis DuckDB extension | 184 | | samansmink | [azure-extension](https://github.com/samansmink/azure-extension) | 0 | 2023-05-24T11:37:55Z | 2023-07-06T16:47:23Z | Experimental Azure DuckDB extension | 185 | | statlib | [duckdb-windows-extensions](https://github.com/statlib/duckdb-windows-extensions) | 0 | 2023-06-19T08:56:30Z | 2023-06-20T20:13:52Z | DuckDB extensions for Windows users | 186 | | jpmmcneill | [fmri-duckdb](https://github.com/jpmmcneill/fmri-duckdb) | 0 | 2023-03-06T11:50:19Z | 2023-03-06T23:45:14Z | FMRI Extension for duckdb | 187 | | jexp | [duckdb-brace-of-ducks](https://github.com/jexp/duckdb-brace-of-ducks) | 0 | 2023-02-06T01:37:57Z | 2023-02-06T01:38:02Z | testing duckdb extension functions | -------------------------------------------------------------------------------- /duckdb_extension_radar.py: -------------------------------------------------------------------------------- 1 | import os 2 | from datetime import date 3 | 4 | import pandas as pd 5 | import requests 6 | from dotenv import load_dotenv 7 | from loguru import logger 8 | 9 | load_dotenv() 10 | GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") 11 | 12 | 13 | def run_graphql_query(query: str): 14 | """Helper function to run a GraphQL query using requests""" 15 | url = "https://api.github.com/graphql" 16 | headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"} 17 | response = requests.post(url, json={"query": query}, headers=headers) 18 | if response.status_code == 200: 19 | return response.json() 20 | else: 21 | raise Exception( 22 | f"Query failed to run by returning code of {response.status_code}. {response.text}" 23 | ) 24 | 25 | 26 | def search_github_repos(extension: str): 27 | """Perform a paginated GraphQL search for repositories containing files with the specific extension""" 28 | repos = [] 29 | has_next_page = True 30 | cursor = None # Start with no cursor 31 | page_count = 0 32 | 33 | while has_next_page: 34 | page_count += 1 35 | pagination_part = f', after: "{cursor}"' if cursor else "" 36 | query = f""" 37 | query {{ 38 | search(query: "extension:{extension}", type: REPOSITORY, first: 10{pagination_part}) {{ 39 | edges {{ 40 | cursor 41 | node {{ 42 | ... on Repository {{ 43 | name 44 | url 45 | description 46 | stargazers {{ 47 | totalCount 48 | }} 49 | createdAt 50 | updatedAt 51 | owner {{ 52 | login 53 | }} 54 | }} 55 | }} 56 | }} 57 | pageInfo {{ 58 | endCursor 59 | hasNextPage 60 | }} 61 | }} 62 | }} 63 | """ 64 | result = run_graphql_query(query) 65 | edges = result["data"]["search"]["edges"] 66 | for edge in edges: 67 | repos.append( 68 | { 69 | "Repository": edge["node"]["name"], 70 | "Url": edge["node"]["url"], 71 | "About": edge["node"]["description"], 72 | "Stars": edge["node"]["stargazers"]["totalCount"], 73 | "Created": edge["node"]["createdAt"], 74 | "Last Updated": edge["node"]["updatedAt"], 75 | "Owner": edge["node"]["owner"]["login"], 76 | } 77 | ) 78 | page_info = result["data"]["search"]["pageInfo"] 79 | has_next_page = page_info["hasNextPage"] 80 | cursor = page_info["endCursor"] 81 | 82 | if has_next_page: 83 | logger.info( 84 | f"Fetching next page of results, total pages: {page_count}, total repositories fetched: {len(repos)}" 85 | ) 86 | 87 | logger.info( 88 | f"Total pages processed: {page_count}, Total repositories found: {len(repos)}" 89 | ) 90 | return pd.DataFrame(repos) 91 | 92 | 93 | def generate_readme(df: pd.DataFrame): 94 | # Transform the Repository column into a markdown link string using the Url column 95 | df["Repository"] = df.apply( 96 | lambda row: f"[{row['Repository']}]({row['Url']})", axis=1 97 | ) 98 | # Select the columns to display, including the new Owner column 99 | df = df[ 100 | [ 101 | "Owner", # Include the owner column 102 | "Repository", 103 | "Stars", 104 | "Created", 105 | "Last Updated", # Updated to reflect actual data column name from GraphQL 106 | "About", 107 | ] 108 | ] 109 | # Sort by Last Updated date 110 | sorted_df = df.copy() 111 | sorted_df.sort_values(by="Last Updated", ascending=False, inplace=True) 112 | # Generate a nice table in Markdown format 113 | table_md = sorted_df.to_markdown(index=False) 114 | # Add header and description 115 | header = "![DuckDB Extensions Radar](/img/duckdb_extension_radar.png?raw=true)\n" 116 | header += "# DuckDB Extensions Radar\n" 117 | description = f'\nThis repo contains information about DuckDB extensions found on GitHub. Refreshed daily. Sorted by Created date. \n Last refresh **{date.today().strftime("%Y-%m-%d")}**.' 118 | warning = "## ⚠️ Disclaimer\nThis is a bit hacky and searches for repos containing the string `.duckdb_extension`, so it's not 100% reliable.\nExtensions that are not included in the DuckDB core (and are not listed in the output from duckdb_extensions()) are considered unsigned. To install these extensions, you must use the `-unsigned` flag when launching DuckDB. Please be aware that installing unsigned extensions carries potential risks, as this repository does not endorse or guarantee the trustworthiness of any listed extensions." 119 | readme_md = f"{header}{description}\n{warning}\n{table_md}" 120 | # Write the README file 121 | with open("README.md", "w", encoding="utf-8") as f: 122 | f.write(readme_md) 123 | 124 | 125 | if __name__ == "__main__": 126 | logger.info("Starting the search for repositories with .duckdb_extension files") 127 | df = search_github_repos("duckdb_extension") 128 | logger.info("Generating the README file") 129 | generate_readme(df) 130 | -------------------------------------------------------------------------------- /img/duckdb_extension_radar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mehd-io/duckdb-extension-radar/e4bc9da30551593d4419e132840a60d14e761856/img/duckdb_extension_radar.png -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "black" 5 | version = "23.1.0" 6 | description = "The uncompromising code formatter." 7 | category = "dev" 8 | optional = false 9 | python-versions = ">=3.7" 10 | files = [ 11 | {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, 12 | {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, 13 | {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, 14 | {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, 15 | {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, 16 | {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, 17 | {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, 18 | {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, 19 | {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, 20 | {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, 21 | {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, 22 | {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, 23 | {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, 24 | {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, 25 | {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, 26 | {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, 27 | {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, 28 | {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, 29 | {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, 30 | {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, 31 | {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, 32 | {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, 33 | {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, 34 | {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, 35 | {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, 36 | ] 37 | 38 | [package.dependencies] 39 | click = ">=8.0.0" 40 | mypy-extensions = ">=0.4.3" 41 | packaging = ">=22.0" 42 | pathspec = ">=0.9.0" 43 | platformdirs = ">=2" 44 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 45 | 46 | [package.extras] 47 | colorama = ["colorama (>=0.4.3)"] 48 | d = ["aiohttp (>=3.7.4)"] 49 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 50 | uvloop = ["uvloop (>=0.15.2)"] 51 | 52 | [[package]] 53 | name = "certifi" 54 | version = "2022.12.7" 55 | description = "Python package for providing Mozilla's CA Bundle." 56 | category = "main" 57 | optional = false 58 | python-versions = ">=3.6" 59 | files = [ 60 | {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, 61 | {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, 62 | ] 63 | 64 | [[package]] 65 | name = "charset-normalizer" 66 | version = "3.0.1" 67 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 68 | category = "main" 69 | optional = false 70 | python-versions = "*" 71 | files = [ 72 | {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, 73 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, 74 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, 75 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, 76 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, 77 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, 78 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, 79 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, 80 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, 81 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, 82 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, 83 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, 84 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, 85 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, 86 | {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, 87 | {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, 88 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, 89 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, 90 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, 91 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, 92 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, 93 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, 94 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, 95 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, 96 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, 97 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, 98 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, 99 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, 100 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, 101 | {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, 102 | {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, 103 | {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, 104 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, 105 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, 106 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, 107 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, 108 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, 109 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, 110 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, 111 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, 112 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, 113 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, 114 | {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, 115 | {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, 116 | {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, 117 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, 118 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, 119 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, 120 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, 121 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, 122 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, 123 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, 124 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, 125 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, 126 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, 127 | {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, 128 | {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, 129 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, 130 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, 131 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, 132 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, 133 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, 134 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, 135 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, 136 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, 137 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, 138 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, 139 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, 140 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, 141 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, 142 | {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, 143 | {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, 144 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, 145 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, 146 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, 147 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, 148 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, 149 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, 150 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, 151 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, 152 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, 153 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, 154 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, 155 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, 156 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, 157 | {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, 158 | {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, 159 | {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, 160 | ] 161 | 162 | [[package]] 163 | name = "click" 164 | version = "8.1.3" 165 | description = "Composable command line interface toolkit" 166 | category = "dev" 167 | optional = false 168 | python-versions = ">=3.7" 169 | files = [ 170 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 171 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 172 | ] 173 | 174 | [package.dependencies] 175 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 176 | 177 | [[package]] 178 | name = "colorama" 179 | version = "0.4.6" 180 | description = "Cross-platform colored terminal text." 181 | category = "main" 182 | optional = false 183 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 184 | files = [ 185 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 186 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 187 | ] 188 | 189 | [[package]] 190 | name = "idna" 191 | version = "3.4" 192 | description = "Internationalized Domain Names in Applications (IDNA)" 193 | category = "main" 194 | optional = false 195 | python-versions = ">=3.5" 196 | files = [ 197 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 198 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 199 | ] 200 | 201 | [[package]] 202 | name = "isort" 203 | version = "5.12.0" 204 | description = "A Python utility / library to sort Python imports." 205 | category = "dev" 206 | optional = false 207 | python-versions = ">=3.8.0" 208 | files = [ 209 | {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, 210 | {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, 211 | ] 212 | 213 | [package.extras] 214 | colors = ["colorama (>=0.4.3)"] 215 | pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] 216 | plugins = ["setuptools"] 217 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 218 | 219 | [[package]] 220 | name = "loguru" 221 | version = "0.7.0" 222 | description = "Python logging made (stupidly) simple" 223 | category = "main" 224 | optional = false 225 | python-versions = ">=3.5" 226 | files = [ 227 | {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, 228 | {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, 229 | ] 230 | 231 | [package.dependencies] 232 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} 233 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} 234 | 235 | [package.extras] 236 | dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] 237 | 238 | [[package]] 239 | name = "mypy-extensions" 240 | version = "1.0.0" 241 | description = "Type system extensions for programs checked with the mypy type checker." 242 | category = "dev" 243 | optional = false 244 | python-versions = ">=3.5" 245 | files = [ 246 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 247 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 248 | ] 249 | 250 | [[package]] 251 | name = "numpy" 252 | version = "1.24.2" 253 | description = "Fundamental package for array computing in Python" 254 | category = "main" 255 | optional = false 256 | python-versions = ">=3.8" 257 | files = [ 258 | {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, 259 | {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, 260 | {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, 261 | {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, 262 | {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, 263 | {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, 264 | {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, 265 | {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, 266 | {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, 267 | {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, 268 | {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, 269 | {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, 270 | {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, 271 | {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, 272 | {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, 273 | {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, 274 | {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, 275 | {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, 276 | {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, 277 | {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, 278 | {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, 279 | {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, 280 | {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, 281 | {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, 282 | {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, 283 | {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, 284 | {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, 285 | {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, 286 | ] 287 | 288 | [[package]] 289 | name = "packaging" 290 | version = "23.0" 291 | description = "Core utilities for Python packages" 292 | category = "dev" 293 | optional = false 294 | python-versions = ">=3.7" 295 | files = [ 296 | {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, 297 | {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, 298 | ] 299 | 300 | [[package]] 301 | name = "pandas" 302 | version = "1.5.3" 303 | description = "Powerful data structures for data analysis, time series, and statistics" 304 | category = "main" 305 | optional = false 306 | python-versions = ">=3.8" 307 | files = [ 308 | {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, 309 | {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, 310 | {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, 311 | {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, 312 | {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, 313 | {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, 314 | {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, 315 | {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, 316 | {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, 317 | {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, 318 | {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, 319 | {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, 320 | {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, 321 | {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, 322 | {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, 323 | {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, 324 | {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, 325 | {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, 326 | {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, 327 | {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, 328 | {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, 329 | {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, 330 | {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, 331 | {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, 332 | {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, 333 | {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, 334 | {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, 335 | ] 336 | 337 | [package.dependencies] 338 | numpy = [ 339 | {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, 340 | {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, 341 | ] 342 | python-dateutil = ">=2.8.1" 343 | pytz = ">=2020.1" 344 | 345 | [package.extras] 346 | test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] 347 | 348 | [[package]] 349 | name = "pathspec" 350 | version = "0.11.0" 351 | description = "Utility library for gitignore style pattern matching of file paths." 352 | category = "dev" 353 | optional = false 354 | python-versions = ">=3.7" 355 | files = [ 356 | {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, 357 | {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, 358 | ] 359 | 360 | [[package]] 361 | name = "platformdirs" 362 | version = "3.0.0" 363 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 364 | category = "dev" 365 | optional = false 366 | python-versions = ">=3.7" 367 | files = [ 368 | {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, 369 | {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, 370 | ] 371 | 372 | [package.extras] 373 | docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] 374 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] 375 | 376 | [[package]] 377 | name = "python-dateutil" 378 | version = "2.8.2" 379 | description = "Extensions to the standard Python datetime module" 380 | category = "main" 381 | optional = false 382 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 383 | files = [ 384 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 385 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 386 | ] 387 | 388 | [package.dependencies] 389 | six = ">=1.5" 390 | 391 | [[package]] 392 | name = "python-dotenv" 393 | version = "1.0.0" 394 | description = "Read key-value pairs from a .env file and set them as environment variables" 395 | category = "main" 396 | optional = false 397 | python-versions = ">=3.8" 398 | files = [ 399 | {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, 400 | {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, 401 | ] 402 | 403 | [package.extras] 404 | cli = ["click (>=5.0)"] 405 | 406 | [[package]] 407 | name = "pytz" 408 | version = "2022.7.1" 409 | description = "World timezone definitions, modern and historical" 410 | category = "main" 411 | optional = false 412 | python-versions = "*" 413 | files = [ 414 | {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, 415 | {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, 416 | ] 417 | 418 | [[package]] 419 | name = "requests" 420 | version = "2.28.2" 421 | description = "Python HTTP for Humans." 422 | category = "main" 423 | optional = false 424 | python-versions = ">=3.7, <4" 425 | files = [ 426 | {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, 427 | {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, 428 | ] 429 | 430 | [package.dependencies] 431 | certifi = ">=2017.4.17" 432 | charset-normalizer = ">=2,<4" 433 | idna = ">=2.5,<4" 434 | urllib3 = ">=1.21.1,<1.27" 435 | 436 | [package.extras] 437 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 438 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 439 | 440 | [[package]] 441 | name = "six" 442 | version = "1.16.0" 443 | description = "Python 2 and 3 compatibility utilities" 444 | category = "main" 445 | optional = false 446 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 447 | files = [ 448 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 449 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 450 | ] 451 | 452 | [[package]] 453 | name = "tabulate" 454 | version = "0.9.0" 455 | description = "Pretty-print tabular data" 456 | category = "main" 457 | optional = false 458 | python-versions = ">=3.7" 459 | files = [ 460 | {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, 461 | {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, 462 | ] 463 | 464 | [package.extras] 465 | widechars = ["wcwidth"] 466 | 467 | [[package]] 468 | name = "tomli" 469 | version = "2.0.1" 470 | description = "A lil' TOML parser" 471 | category = "dev" 472 | optional = false 473 | python-versions = ">=3.7" 474 | files = [ 475 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 476 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 477 | ] 478 | 479 | [[package]] 480 | name = "urllib3" 481 | version = "1.26.14" 482 | description = "HTTP library with thread-safe connection pooling, file post, and more." 483 | category = "main" 484 | optional = false 485 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 486 | files = [ 487 | {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, 488 | {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, 489 | ] 490 | 491 | [package.extras] 492 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] 493 | secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] 494 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 495 | 496 | [[package]] 497 | name = "win32-setctime" 498 | version = "1.1.0" 499 | description = "A small Python utility to set file creation time on Windows" 500 | category = "main" 501 | optional = false 502 | python-versions = ">=3.5" 503 | files = [ 504 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 505 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 506 | ] 507 | 508 | [package.extras] 509 | dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] 510 | 511 | [metadata] 512 | lock-version = "2.0" 513 | python-versions = "^3.10" 514 | content-hash = "c65ccd43124ada540c7d6693801fcf0ac98aeafd85b5451fb15963dba81966f6" 515 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "duckdb-extension-radar" 3 | version = "0.1.0" 4 | description = "Scans DuckDB extensions repos and display it in a nice README" 5 | authors = ["mehd-io "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.10" 10 | pandas = "^1.5.3" 11 | tabulate = "^0.9.0" 12 | requests = "^2.28.2" 13 | python-dotenv = "^1.0.0" 14 | loguru = "^0.7.0" 15 | 16 | 17 | [tool.poetry.group.dev.dependencies] 18 | black = "^23.1.0" 19 | isort = "^5.12.0" 20 | 21 | [build-system] 22 | requires = ["poetry-core"] 23 | build-backend = "poetry.core.masonry.api" 24 | -------------------------------------------------------------------------------- /test_duckdb_extension_radar.py: -------------------------------------------------------------------------------- 1 | import os 2 | from unittest.mock import MagicMock, patch 3 | 4 | import pandas as pd 5 | import pytest 6 | 7 | # Import your functions from the module where they are defined 8 | from duckdb_extension_radar import run_graphql_query, search_github_repos 9 | 10 | 11 | @pytest.fixture 12 | def mock_response(): 13 | """Prepare a mock response to mimic the GraphQL API.""" 14 | return { 15 | "data": { 16 | "search": { 17 | "edges": [ 18 | { 19 | "node": { 20 | "name": "Repo1", 21 | "url": "https://github.com/user/Repo1", 22 | "description": "Description of Repo1", 23 | "stargazers": {"totalCount": 42}, 24 | "createdAt": "2020-01-01T00:00:00Z", 25 | "updatedAt": "2020-01-02T00:00:00Z", 26 | "owner": {"login": "user"}, 27 | } 28 | } 29 | ], 30 | "pageInfo": {"endCursor": "abc123", "hasNextPage": False}, 31 | } 32 | } 33 | } 34 | 35 | 36 | @patch("requests.post") 37 | def test_run_graphql_query(mock_post, mock_response): 38 | """Test the GraphQL query execution with dynamic token handling.""" 39 | mock_post.return_value.status_code = 200 40 | mock_post.return_value.json.return_value = mock_response 41 | token = os.getenv("GITHUB_TOKEN", "None") # Fetch token or use "None" if not set 42 | 43 | query = "query { viewer { login }}" 44 | run_graphql_query(query) 45 | # Check that requests.post was called correctly, accounting for dynamic token 46 | mock_post.assert_called_once_with( 47 | "https://api.github.com/graphql", 48 | json={"query": query}, 49 | headers={"Authorization": f"Bearer {token}"}, 50 | ) 51 | 52 | 53 | @pytest.fixture 54 | def graphql_responses(): 55 | """Simulate GraphQL responses for multiple pages.""" 56 | return [ 57 | { # First page 58 | "data": { 59 | "search": { 60 | "edges": [ 61 | { 62 | "node": { 63 | "name": "Repo1", 64 | "url": "https://github.com/user/Repo1", 65 | "description": "First repository", 66 | "stargazers": {"totalCount": 10}, 67 | "createdAt": "2021-01-01T00:00:00Z", 68 | "updatedAt": "2021-01-02T00:00:00Z", 69 | "owner": {"login": "user1"}, 70 | }, 71 | "cursor": "cursor1", 72 | } 73 | ], 74 | "pageInfo": {"endCursor": "cursor1", "hasNextPage": True}, 75 | } 76 | } 77 | }, 78 | { # Second page 79 | "data": { 80 | "search": { 81 | "edges": [ 82 | { 83 | "node": { 84 | "name": "Repo2", 85 | "url": "https://github.com/user/Repo2", 86 | "description": "Second repository", 87 | "stargazers": {"totalCount": 20}, 88 | "createdAt": "2022-02-01T00:00:00Z", 89 | "updatedAt": "2022-02-02T00:00:00Z", 90 | "owner": {"login": "user2"}, 91 | }, 92 | "cursor": "cursor2", 93 | } 94 | ], 95 | "pageInfo": {"endCursor": "cursor2", "hasNextPage": False}, 96 | } 97 | } 98 | }, 99 | ] 100 | 101 | 102 | @patch("duckdb_extension_radar.run_graphql_query") 103 | def test_search_github_repos(mock_run_query, graphql_responses): 104 | """Test the repository search and pagination handling.""" 105 | mock_run_query.side_effect = ( 106 | graphql_responses # Use side_effect to simulate sequence of responses 107 | ) 108 | 109 | result_df = search_github_repos("dummy_extension") 110 | 111 | # Define what the expected DataFrame should look like with the correct column order 112 | expected_df = pd.DataFrame( 113 | { 114 | "Repository": ["Repo1", "Repo2"], 115 | "Url": ["https://github.com/user/Repo1", "https://github.com/user/Repo2"], 116 | "About": ["First repository", "Second repository"], 117 | "Stars": [10, 20], 118 | "Created": ["2021-01-01T00:00:00Z", "2022-02-01T00:00:00Z"], 119 | "Last Updated": ["2021-01-02T00:00:00Z", "2022-02-02T00:00:00Z"], 120 | "Owner": ["user1", "user2"], 121 | } 122 | ) 123 | 124 | pd.testing.assert_frame_equal(result_df, expected_df) 125 | --------------------------------------------------------------------------------