From df05e4329d8a5373cbf96b97ea1977305fecc31b Mon Sep 17 00:00:00 2001 From: liblaf Date: Thu, 4 May 2023 16:07:00 +0800 Subject: [PATCH] fix: add nginx utils --- .envrc | 3 + .github/workflows/ci.yaml | 2 +- .gitignore | 5 +- .pre-commit-config.yaml | 4 +- .vscode/settings.json | 7 + Makefile | 100 +++-- data/github.yaml | 146 +++---- data/websites.yaml | 29 +- docs/awesome-github.md | 234 ++++++------ docs/awesome-websites.md | 92 ++--- docs/index.md | 110 ++++-- main.py | 2 +- poetry.lock | 463 +++++++++++++---------- pyproject.toml | 20 +- requirements.txt | 66 ++-- utils/__init__.py | 3 + utils/__main__.py | 10 +- utils/cmd/__init__.py | 14 + utils/cmd/hello/__init__.py | 5 + utils/cmd/nginx/__init__.py | 16 + utils/cmd/nginx/add/__init__.py | 26 ++ utils/cmd/nginx/add/template.py | 11 + utils/cmd/nginx/const.py | 3 + utils/cmd/nginx/disable/__init__.py | 28 ++ utils/cmd/nginx/enable/__init__.py | 34 ++ utils/cmd/nginx/list/__init__.py | 22 ++ utils/cmd/sort/__init__.py | 12 + utils/cmd/sort/github/__init__.py | 52 +++ utils/cmd/sort/github/template.py | 52 +++ utils/cmd/sort/website/__init__.py | 46 +++ utils/cmd/sort/website/template.py | 74 ++++ utils/{hello => const}/__init__.py | 0 utils/const/yaml.py | 3 + utils/hello/__main__.py | 8 - utils/sort/__init__.py | 37 -- utils/sort/__main__.py | 16 - utils/sort/github/__main__.py | 30 -- utils/sort/github/constants.py | 21 - utils/sort/github/sort.py | 13 - utils/sort/github/template.py | 26 -- utils/sort/json/__init__.py | 0 utils/sort/json/__main__.py | 19 - utils/sort/url/__init__.py | 0 utils/sort/url/__main__.py | 23 -- utils/sort/url/constants.py | 23 -- utils/sort/url/sort.py | 5 - utils/sort/url/template.py | 36 -- utils/sort/yaml/__init__.py | 0 utils/sort/yaml/__main__.py | 19 - utils/utils.py | 3 - utils/{sort/github => utils}/__init__.py | 0 utils/utils/markdown.py | 7 + utils/utils/rich/logging/__init__.py | 14 + utils/utils/rich/logging/style.py | 5 + utils/utils/rich/run.py | 16 + utils/utils/typer.py | 12 + 56 files changed, 1164 insertions(+), 863 deletions(-) create mode 100644 .envrc create mode 100644 .vscode/settings.json create mode 100644 utils/cmd/__init__.py create mode 100644 utils/cmd/hello/__init__.py create mode 100644 utils/cmd/nginx/__init__.py create mode 100644 utils/cmd/nginx/add/__init__.py create mode 100644 utils/cmd/nginx/add/template.py create mode 100644 utils/cmd/nginx/const.py create mode 100644 utils/cmd/nginx/disable/__init__.py create mode 100644 utils/cmd/nginx/enable/__init__.py create mode 100644 utils/cmd/nginx/list/__init__.py create mode 100644 utils/cmd/sort/__init__.py create mode 100644 utils/cmd/sort/github/__init__.py create mode 100644 utils/cmd/sort/github/template.py create mode 100644 utils/cmd/sort/website/__init__.py create mode 100644 utils/cmd/sort/website/template.py rename utils/{hello => const}/__init__.py (100%) create mode 100644 utils/const/yaml.py delete mode 100644 utils/hello/__main__.py delete mode 100644 utils/sort/__init__.py delete mode 100644 utils/sort/__main__.py delete mode 100644 utils/sort/github/__main__.py delete mode 100644 utils/sort/github/constants.py delete mode 100644 utils/sort/github/sort.py delete mode 100644 utils/sort/github/template.py delete mode 100644 utils/sort/json/__init__.py delete mode 100644 utils/sort/json/__main__.py delete mode 100644 utils/sort/url/__init__.py delete mode 100644 utils/sort/url/__main__.py delete mode 100644 utils/sort/url/constants.py delete mode 100644 utils/sort/url/sort.py delete mode 100644 utils/sort/url/template.py delete mode 100644 utils/sort/yaml/__init__.py delete mode 100644 utils/sort/yaml/__main__.py delete mode 100644 utils/utils.py rename utils/{sort/github => utils}/__init__.py (100%) create mode 100644 utils/utils/markdown.py create mode 100644 utils/utils/rich/logging/__init__.py create mode 100644 utils/utils/rich/logging/style.py create mode 100644 utils/utils/rich/run.py create mode 100644 utils/utils/typer.py diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..d5a2f511 --- /dev/null +++ b/.envrc @@ -0,0 +1,3 @@ +layout conda + +source_env_if_exists .envrc.private diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7e65eff5..a15c2e91 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -56,7 +56,7 @@ jobs: - name: Install Dependencies run: poetry install --no-interaction - name: Build Executable - run: poetry run make rename + run: poetry run make dist env: RUNNER_OS: ${{ runner.os }} RUNNER_ARCH: ${{ runner.arch }} diff --git a/.gitignore b/.gitignore index 86bd2cb8..01d2ced2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ ------Initial gitignore.io list---- ------Save to /home/liblaf/.gi_list----- - # Created by https://www.toptal.com/developers/gitignore/api/python # Edit at https://www.toptal.com/developers/gitignore?templates=python @@ -177,3 +174,5 @@ poetry.toml pyrightconfig.json # End of https://www.toptal.com/developers/gitignore/api/python + +.envrc.private diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 521f1afd..972c2957 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,11 +4,11 @@ ci: repos: - repo: https://github.com/commitizen-tools/commitizen - rev: "v2.42.1" + rev: "3.1.0" hooks: - id: commitizen - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v3.0.0-alpha.6" + rev: "v3.0.0-alpha.9-for-vscode" hooks: - id: prettier stages: diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..ef9a7cad --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "cSpell.words": ["typer"], + "files.associations": { + ".envrc": "shellscript", + ".envrc.private": "shellscript" + } +} diff --git a/Makefile b/Makefile index 8b0d0ee1..b8685bef 100644 --- a/Makefile +++ b/Makefile @@ -1,81 +1,73 @@ -NAME := utils.py +NAME := utils -BIN := $(HOME)/.local/bin -BUILD := $(CURDIR)/build -DATA := $(CURDIR)/data -DIST := $(CURDIR)/dist -DOCS := $(CURDIR)/docs -SITE := $(CURDIR)/site +DATA := $(CURDIR)/data +DIST := $(CURDIR)/dist +DOCS := $(CURDIR)/docs + +DOCS_SRC_LIST += $(DOCS)/awesome-github.md +DOCS_SRC_LIST += $(DOCS)/awesome-websites.md +DOCS_SRC_LIST += $(DOCS)/index.md + +OS != echo $(RUNNER_OS) | tr '[:upper:]' '[:lower:]' +ARCH != echo $(RUNNER_ARCH) | tr '[:upper:]' '[:lower:]' + +ifneq ($(and $(OS), $(ARCH)), ) + NAME := $(NAME)-$(OS)-$(ARCH) +endif -OS := $(shell echo $(RUNNER_OS) | tr '[:upper:]' '[:lower:]') -ARCH := $(shell echo $(RUNNER_ARCH) | tr '[:upper:]' '[:lower:]') ifeq ($(OS), windows) EXE := .exe else EXE := endif -TARGET := $(DIST)/$(NAME)$(EXE) -GITHUB_TOKEN := +EXECUTABLE := $(DIST)/$(NAME)$(EXE) -build: $(TARGET) +all: -clean: - $(RM) --recursive $(BUILD) - $(RM) --recursive $(DIST) - $(RM) --recursive $(SITE) - $(RM) $(CURDIR)/*.spec +dist: $(EXECUTABLE) -docs: $(DOCS)/awesome-github.md $(DOCS)/awesome-websites.md $(DOCS)/index.md +docs: $(DOCS_SRC_LIST) -docs-build: $(CURDIR)/mkdocs.yaml docs - mkdocs build --config-file $< --site-dir $(SITE) +docs-build: $(DOCS_SRC_LIST) + mkdocs build -docs-gh-deploy: $(CURDIR)/mkdocs.yaml docs - mkdocs gh-deploy --force --no-history --config-file $< --site-dir $(SITE) +docs-serve: $(DOCS_SRC_LIST) + mkdocs serve -docs-serve: $(CURDIR)/mkdocs.yaml docs - mkdocs serve --config-file $< +docs-gh-deploy: $(DOCS_SRC_LIST) + mkdocs gh-deploy -install: $(TARGET) | $(BIN) - install --target-directory=$(BIN) $< +poetry: $(CURDIR)/poetry.lock $(CURDIR)/requirements.txt -pretty: - isort --profile black $(CURDIR) - black $(CURDIR) +pretty: prettier pretty-python - poetry run utils.py sort yaml $(DATA)/github.yaml - poetry run utils.py sort yaml $(DATA)/websites.yaml - prettier --write $(CURDIR)/**/*.md - prettier --write $(CURDIR)/**/*.yaml +prettier: | $(CURDIR)/.gitignore + prettier --write --ignore-path $| $(CURDIR) -rename: $(TARGET) -ifneq ($(and $(OS), $(ARCH)), ) - mv $< $(DIST)/$(NAME)-$(OS)-$(ARCH)$(EXE) -endif +pretty-python: + isort --profile black $(CURDIR) + black $(CURDIR) -$(BIN): - mkdir --parents $@ +$(CURDIR)/poetry.lock: pyproject.toml + poetry lock -$(DOCS): - mkdir --parents $@ +$(CURDIR)/requirements.txt: $(CURDIR)/poetry.lock + poetry export --output requirements.txt --without-hashes --without-urls -ifeq ($(GITHUB_TOKEN),) - SORT_GITHUB_OPTIONS := -else - SORT_GITHUB_OPTIONS := --token $(GITHUB_TOKEN) -endif -$(DOCS)/awesome-github.md: $(DATA)/github.yaml | $(DOCS) - poetry run utils.py sort github $(SORT_GITHUB_OPTIONS) $< > $@ +$(DOCS)/awesome-github.md: $(DATA)/github.yaml + poetry run utils sort github --in-place --markdown $@ $< + prettier --write $< prettier --write $@ -$(DOCS)/awesome-websites.md: $(DATA)/websites.yaml | $(DOCS) - poetry run utils.py sort url $< > $@ +$(DOCS)/awesome-websites.md: $(DATA)/websites.yaml + poetry run utils sort website --in-place --markdown $@ $< + prettier --write $< prettier --write $@ -$(DOCS)/index.md: $(CURDIR)/main.py | $(DOCS) - typer $< utils docs --name $(NAME) --output $@ +$(DOCS)/index.md: + typer utils.cmd utils docs --output $@ prettier --write $@ -$(TARGET): - pyinstaller --distpath $(DIST) --workpath $(BUILD) --onefile --name $(NAME) $(CURDIR)/main.py +$(EXECUTABLE): $(CURDIR)/main.py + pyinstaller --onefile --name $(NAME) $< diff --git a/data/github.yaml b/data/github.yaml index e7ad91d1..3078c09a 100644 --- a/data/github.yaml +++ b/data/github.yaml @@ -1,127 +1,127 @@ Awesome: - - Kazhnuz/awesome-gnome - - agarrharr/awesome-cli-apps - - avelino/awesome-go + - sindresorhus/awesome + - vinta/awesome-python - awesome-selfhosted/awesome-selfhosted + - avelino/awesome-go + - sindresorhus/awesome-nodejs - fffaraz/awesome-cpp - ibraheemdev/modern-unix - - sindresorhus/awesome - - sindresorhus/awesome-nodejs - - vinta/awesome-python + - agarrharr/awesome-cli-apps + - Kazhnuz/awesome-gnome C/C++: - microsoft/vcpkg CLI: - - BurntSushi/ripgrep - - ClementTsang/bottom - - ImageMagick/ImageMagick - - ajeetdsouza/zoxide - - bitwarden/clients - - boyter/scc - - charmbracelet/glow - - charmbracelet/gum - - charmbracelet/vhs - - cli/cli - - commitizen/cz-cli - - dandavison/delta - - dundee/gdu - - dylanaraps/neofetch - - gokcehan/lf - - httpie/httpie - - jesseduffield/lazygit - - junegunn/fzf - - lsd-rs/lsd - - mermaid-js/mermaid-cli - - muesli/duf - neovim/neovim - - ogham/dog - - orf/gping - - pappasam/toml-sort - - pre-commit/pre-commit + - junegunn/fzf - prettier/prettier - - rclone/rclone + - tldr-pages/tldr - sharkdp/bat + - rclone/rclone + - BurntSushi/ripgrep + - jesseduffield/lazygit + - cli/cli + - tmux/tmux + - httpie/httpie - sharkdp/fd - - sharkdp/hyperfine - stedolan/jq + - dylanaraps/neofetch + - dandavison/delta - tj/git-extras - - tldr-pages/tldr - - tmux/tmux + - sharkdp/hyperfine + - commitizen/cz-cli + - charmbracelet/gum + - charmbracelet/glow + - muesli/duf + - charmbracelet/vhs + - ajeetdsouza/zoxide + - pre-commit/pre-commit + - lsd-rs/lsd + - ImageMagick/ImageMagick - vercel/serve + - orf/gping + - ClementTsang/bottom + - bitwarden/clients + - gokcehan/lf + - ogham/dog + - boyter/scc + - dundee/gdu + - mermaid-js/mermaid-cli + - pappasam/toml-sort Desktop: - - Fndroid/clash_for_windows_pkg - - TheAssassin/AppImageLauncher - - YerongAI/Office-Tool - - agalwood/Motrix - - kovidgoyal/kitty - - libpinyin/ibus-libpinyin - - microsoft/PowerToys - microsoft/vscode - - notofonts/noto-cjk - - pbatard/rufus - - ryanoasis/nerd-fonts + - microsoft/PowerToys - tonsky/FiraCode + - Fndroid/clash_for_windows_pkg - ventoy/Ventoy + - ryanoasis/nerd-fonts + - agalwood/Motrix + - pbatard/rufus + - kovidgoyal/kitty - videolan/vlc - zotero/zotero + - YerongAI/Office-Tool + - TheAssassin/AppImageLauncher + - notofonts/noto-cjk + - libpinyin/ibus-libpinyin GNOME: - micheleg/dash-to-dock - paperwm/PaperWM - paradoxxxzero/gnome-shell-system-monitor-applet - ubuntu/gnome-shell-extension-appindicator Go: - - dsnet/try + - spf13/cobra + - sirupsen/logrus + - stretchr/testify - emirpasic/gods + - mvdan/sh + - mholt/archiver - go-survey/survey + - pterm/pterm - gosimple/slug - - mholt/archiver - - mvdan/sh - otiai10/copy - - pterm/pterm - - sirupsen/logrus - - spf13/cobra - - stretchr/testify + - dsnet/try Node.js: - - ant-design/ant-design - facebook/react + - vuejs/vue - vercel/next.js - - vercel/serve + - ant-design/ant-design - vercel/vercel - - vuejs/vue - - vuepress-theme-hope/vuepress-theme-hope + - vercel/serve - vuepress/vuepress-next + - vuepress-theme-hope/vuepress-theme-hope Python: - - PyCQA/isort + - psf/requests - Textualize/rich - - conda/conda + - pandas-dev/pandas + - psf/black - httpie/httpie + - python-poetry/poetry + - numpy/numpy + - taichi-dev/taichi - matplotlib/matplotlib + - scipy/scipy + - tiangolo/typer - mwaskom/seaborn - - numpy/numpy - - pandas-dev/pandas - - pappasam/toml-sort - pre-commit/pre-commit - - psf/black - - psf/requests - pyinstaller/pyinstaller - pypa/pipx - - python-poetry/poetry + - PyCQA/isort + - conda/conda - pyvista/pyvista - - pyvista/tetgen - - scipy/scipy - - taichi-dev/taichi - - tiangolo/typer - tmbo/questionary + - pyvista/tetgen + - pappasam/toml-sort Self-Hosted: + - squidfunk/mkdocs-material + - upptime/upptime - bastienwirtz/homer - qkqpttgf/OneManager-php - spencerwooo/onedrive-vercel-index - - squidfunk/mkdocs-material - - upptime/upptime - vuepress-theme-hope/vuepress-theme-hope Zsh: - - Game4Move78/zsh-bitwarden - - conda-incubator/conda-zsh-completion - - marlonrichert/zsh-autocomplete - ohmyzsh/ohmyzsh - starship/starship - zsh-users/zsh-syntax-highlighting + - marlonrichert/zsh-autocomplete + - conda-incubator/conda-zsh-completion + - Game4Move78/zsh-bitwarden diff --git a/data/websites.yaml b/data/websites.yaml index 2755b417..6a845bf5 100644 --- a/data/websites.yaml +++ b/data/websites.yaml @@ -11,50 +11,51 @@ Go: - url: https://pkg.go.dev Linux: - url: https://man.archlinux.org - - url: https://repology.org - url: https://wiki.archlinux.org + - url: https://repology.org Python: - - url: https://docs.python.org - url: https://pypi.org + - url: https://docs.python.org Resources: - title: AlternativeTo - Crowdsourced software recommendations url: https://alternativeto.net - url: https://annas-archive.org - url: https://archive.org - url: https://duyaoss.com - - url: https://libraries.io - url: https://scholar.google.com + - url: https://libraries.io + - title: Website Traffic - Check and Analyze Any Website | Similarweb + url: https://www.similarweb.com - url: https://steamunlocked.net - title: "@vposy 的个人主页 - 微博" url: https://weibo.com/vposy - - title: Website Traffic - Check and Analyze Any Website | Similarweb - url: https://www.similarweb.com + - url: https://nav.yibook.org - url: https://ylibrary.org - - url: https://zhelper.net Services: - url: https://app.anonaddy.com - - url: https://faviconkit.com - - url: https://github.com - - url: https://mail.proton.me - url: https://vault.bitwarden.com - - url: https://vercel.com - - url: https://web.telegram.org - url: https://www.cloudflare.com + - url: https://faviconkit.com + - url: https://github.com - url: https://www.namecheap.com - title: Digital Wallets, Money Management, and More | PayPal US url: https://www.paypal.com + - url: https://mail.proton.me + - url: https://web.telegram.org + - url: https://vercel.com - url: https://www.zotero.org Tools: - url: https://chatkit.app + - title: Internet Speed Test - Measure Network Performance | Cloudflare + url: https://speed.cloudflare.com - url: https://coolors.co - url: https://draw.io - url: https://ip.sb - - title: 查看我的 IP 地址 | 查询本机 IP 地址及归属地 | 查看 DNS 出口 IP | 测试 CDN 命中节点 | Sukka | https://ip.skk.moe - url: https://ip.skk.moe - url: https://ipjiance.com - url: https://mermaid.live - url: https://pastebin.com - url: https://regex101.com + - title: 查看我的 IP 地址 | 查询本机 IP 地址及归属地 | 查看 DNS 出口 IP | 测试 CDN 命中节点 | Sukka | https://ip.skk.moe + url: https://ip.skk.moe - url: https://slugify.online - - url: https://speed.cloudflare.com - url: https://titlecase.com diff --git a/docs/awesome-github.md b/docs/awesome-github.md index 3364a876..dc94f161 100644 --- a/docs/awesome-github.md +++ b/docs/awesome-github.md @@ -10,165 +10,165 @@ tag: | Name | Statistics | Description | | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| [awesome](https://github.com/sindresorhus/awesome) | ![GitHub Repo stars](https://img.shields.io/github/stars/sindresorhus/awesome) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/sindresorhus/awesome) | 😎 Awesome lists about all kinds of interesting topics | -| [awesome-python](https://github.com/vinta/awesome-python) | ![GitHub Repo stars](https://img.shields.io/github/stars/vinta/awesome-python) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vinta/awesome-python) | A curated list of awesome Python frameworks, libraries, software and resources | -| [awesome-selfhosted](https://github.com/awesome-selfhosted/awesome-selfhosted) | ![GitHub Repo stars](https://img.shields.io/github/stars/awesome-selfhosted/awesome-selfhosted) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/awesome-selfhosted/awesome-selfhosted) | A list of Free Software network services and web applications which can be hosted on your own servers | -| [awesome-go](https://github.com/avelino/awesome-go) | ![GitHub Repo stars](https://img.shields.io/github/stars/avelino/awesome-go) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/avelino/awesome-go) | A curated list of awesome Go frameworks, libraries and software | -| [awesome-nodejs](https://github.com/sindresorhus/awesome-nodejs) | ![GitHub Repo stars](https://img.shields.io/github/stars/sindresorhus/awesome-nodejs) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/sindresorhus/awesome-nodejs) | :zap: Delightful Node.js packages and resources | -| [awesome-cpp](https://github.com/fffaraz/awesome-cpp) | ![GitHub Repo stars](https://img.shields.io/github/stars/fffaraz/awesome-cpp) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/fffaraz/awesome-cpp) | A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff. | -| [modern-unix](https://github.com/ibraheemdev/modern-unix) | ![GitHub Repo stars](https://img.shields.io/github/stars/ibraheemdev/modern-unix) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ibraheemdev/modern-unix) | A collection of modern/faster/saner alternatives to common unix commands. | -| [awesome-cli-apps](https://github.com/agarrharr/awesome-cli-apps) | ![GitHub Repo stars](https://img.shields.io/github/stars/agarrharr/awesome-cli-apps) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/agarrharr/awesome-cli-apps) | 🖥 📊 🕹 🛠 A curated list of command line apps | -| [awesome-gnome](https://github.com/Kazhnuz/awesome-gnome) | ![GitHub Repo stars](https://img.shields.io/github/stars/Kazhnuz/awesome-gnome) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/Kazhnuz/awesome-gnome) | A curated list of awesome apps, extensions, modules, themes and tools for the Gnome Desktop Environment. | +| [awesome](https://github.com/sindresorhus/awesome) | ![GitHub Repo Stars](https://img.shields.io/github/stars/sindresorhus/awesome) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/sindresorhus/awesome) | 😎 Awesome lists about all kinds of interesting topics | +| [awesome-python](https://github.com/vinta/awesome-python) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vinta/awesome-python) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vinta/awesome-python) | A curated list of awesome Python frameworks, libraries, software and resources | +| [awesome-selfhosted](https://github.com/awesome-selfhosted/awesome-selfhosted) | ![GitHub Repo Stars](https://img.shields.io/github/stars/awesome-selfhosted/awesome-selfhosted) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/awesome-selfhosted/awesome-selfhosted) | A list of Free Software network services and web applications which can be hosted on your own servers | +| [awesome-go](https://github.com/avelino/awesome-go) | ![GitHub Repo Stars](https://img.shields.io/github/stars/avelino/awesome-go) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/avelino/awesome-go) | A curated list of awesome Go frameworks, libraries and software | +| [awesome-nodejs](https://github.com/sindresorhus/awesome-nodejs) | ![GitHub Repo Stars](https://img.shields.io/github/stars/sindresorhus/awesome-nodejs) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/sindresorhus/awesome-nodejs) | :zap: Delightful Node.js packages and resources | +| [awesome-cpp](https://github.com/fffaraz/awesome-cpp) | ![GitHub Repo Stars](https://img.shields.io/github/stars/fffaraz/awesome-cpp) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/fffaraz/awesome-cpp) | A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff. | +| [modern-unix](https://github.com/ibraheemdev/modern-unix) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ibraheemdev/modern-unix) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ibraheemdev/modern-unix) | A collection of modern/faster/saner alternatives to common unix commands. | +| [awesome-cli-apps](https://github.com/agarrharr/awesome-cli-apps) | ![GitHub Repo Stars](https://img.shields.io/github/stars/agarrharr/awesome-cli-apps) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/agarrharr/awesome-cli-apps) | 🖥 📊 🕹 🛠 A curated list of command line apps | +| [awesome-gnome](https://github.com/Kazhnuz/awesome-gnome) | ![GitHub Repo Stars](https://img.shields.io/github/stars/Kazhnuz/awesome-gnome) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/Kazhnuz/awesome-gnome) | A curated list of awesome apps, extensions, modules, themes and tools for the Gnome Desktop Environment. | ## C/C++ | Name | Statistics | Description | | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -| [vcpkg](https://github.com/microsoft/vcpkg) | ![GitHub Repo stars](https://img.shields.io/github/stars/microsoft/vcpkg) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/microsoft/vcpkg) | C++ Library Manager for Windows, Linux, and MacOS | +| [vcpkg](https://github.com/microsoft/vcpkg) | ![GitHub Repo Stars](https://img.shields.io/github/stars/microsoft/vcpkg) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/microsoft/vcpkg) | C++ Library Manager for Windows, Linux, and MacOS | ## CLI | Name | Statistics | Description | | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| [neovim](https://github.com/neovim/neovim) | ![GitHub Repo stars](https://img.shields.io/github/stars/neovim/neovim) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/neovim/neovim) | Vim-fork focused on extensibility and usability | -| [fzf](https://github.com/junegunn/fzf) | ![GitHub Repo stars](https://img.shields.io/github/stars/junegunn/fzf) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/junegunn/fzf) | :cherry_blossom: A command-line fuzzy finder | -| [prettier](https://github.com/prettier/prettier) | ![GitHub Repo stars](https://img.shields.io/github/stars/prettier/prettier) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/prettier/prettier) | Prettier is an opinionated code formatter. | -| [tldr](https://github.com/tldr-pages/tldr) | ![GitHub Repo stars](https://img.shields.io/github/stars/tldr-pages/tldr) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/tldr-pages/tldr) | 📚 Collaborative cheatsheets for console commands | -| [bat](https://github.com/sharkdp/bat) | ![GitHub Repo stars](https://img.shields.io/github/stars/sharkdp/bat) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/sharkdp/bat) | A cat(1) clone with wings. | -| [rclone](https://github.com/rclone/rclone) | ![GitHub Repo stars](https://img.shields.io/github/stars/rclone/rclone) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/rclone/rclone) | "rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Yandex Files | -| [ripgrep](https://github.com/BurntSushi/ripgrep) | ![GitHub Repo stars](https://img.shields.io/github/stars/BurntSushi/ripgrep) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/BurntSushi/ripgrep) | ripgrep recursively searches directories for a regex pattern while respecting your gitignore | -| [lazygit](https://github.com/jesseduffield/lazygit) | ![GitHub Repo stars](https://img.shields.io/github/stars/jesseduffield/lazygit) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/jesseduffield/lazygit) | simple terminal UI for git commands | -| [cli](https://github.com/cli/cli) | ![GitHub Repo stars](https://img.shields.io/github/stars/cli/cli) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/cli/cli) | GitHub’s official command line tool | -| [tmux](https://github.com/tmux/tmux) | ![GitHub Repo stars](https://img.shields.io/github/stars/tmux/tmux) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/tmux/tmux) | tmux source code | -| [httpie](https://github.com/httpie/httpie) | ![GitHub Repo stars](https://img.shields.io/github/stars/httpie/httpie) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/httpie/httpie) | 🥧 HTTPie for Terminal — modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more. | -| [fd](https://github.com/sharkdp/fd) | ![GitHub Repo stars](https://img.shields.io/github/stars/sharkdp/fd) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/sharkdp/fd) | A simple, fast and user-friendly alternative to 'find' | -| [jq](https://github.com/stedolan/jq) | ![GitHub Repo stars](https://img.shields.io/github/stars/stedolan/jq) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/stedolan/jq) | Command-line JSON processor | -| [neofetch](https://github.com/dylanaraps/neofetch) | ![GitHub Repo stars](https://img.shields.io/github/stars/dylanaraps/neofetch) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/dylanaraps/neofetch) | 🖼️ A command-line system information tool written in bash 3.2+ | -| [delta](https://github.com/dandavison/delta) | ![GitHub Repo stars](https://img.shields.io/github/stars/dandavison/delta) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/dandavison/delta) | A syntax-highlighting pager for git, diff, and grep output | -| [git-extras](https://github.com/tj/git-extras) | ![GitHub Repo stars](https://img.shields.io/github/stars/tj/git-extras) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/tj/git-extras) | GIT utilities -- repo summary, repl, changelog population, author commit percentages and more | -| [hyperfine](https://github.com/sharkdp/hyperfine) | ![GitHub Repo stars](https://img.shields.io/github/stars/sharkdp/hyperfine) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/sharkdp/hyperfine) | A command-line benchmarking tool | -| [cz-cli](https://github.com/commitizen/cz-cli) | ![GitHub Repo stars](https://img.shields.io/github/stars/commitizen/cz-cli) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/commitizen/cz-cli) | The commitizen command line utility. #BlackLivesMatter | -| [gum](https://github.com/charmbracelet/gum) | ![GitHub Repo stars](https://img.shields.io/github/stars/charmbracelet/gum) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/charmbracelet/gum) | A tool for glamorous shell scripts 🎀 | -| [glow](https://github.com/charmbracelet/glow) | ![GitHub Repo stars](https://img.shields.io/github/stars/charmbracelet/glow) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/charmbracelet/glow) | Render markdown on the CLI, with pizzazz! 💅🏻 | -| [duf](https://github.com/muesli/duf) | ![GitHub Repo stars](https://img.shields.io/github/stars/muesli/duf) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/muesli/duf) | Disk Usage/Free Utility - a better 'df' alternative | -| [vhs](https://github.com/charmbracelet/vhs) | ![GitHub Repo stars](https://img.shields.io/github/stars/charmbracelet/vhs) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/charmbracelet/vhs) | Your CLI home video recorder 📼 | -| [pre-commit](https://github.com/pre-commit/pre-commit) | ![GitHub Repo stars](https://img.shields.io/github/stars/pre-commit/pre-commit) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pre-commit/pre-commit) | A framework for managing and maintaining multi-language pre-commit hooks. | -| [zoxide](https://github.com/ajeetdsouza/zoxide) | ![GitHub Repo stars](https://img.shields.io/github/stars/ajeetdsouza/zoxide) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ajeetdsouza/zoxide) | A smarter cd command. Supports all major shells. | -| [lsd](https://github.com/lsd-rs/lsd) | ![GitHub Repo stars](https://img.shields.io/github/stars/lsd-rs/lsd) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/lsd-rs/lsd) | The next gen ls command | -| [ImageMagick](https://github.com/ImageMagick/ImageMagick) | ![GitHub Repo stars](https://img.shields.io/github/stars/ImageMagick/ImageMagick) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ImageMagick/ImageMagick) | 🧙‍♂️ ImageMagick 7 | -| [serve](https://github.com/vercel/serve) | ![GitHub Repo stars](https://img.shields.io/github/stars/vercel/serve) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vercel/serve) | Static file serving and directory listing | -| [gping](https://github.com/orf/gping) | ![GitHub Repo stars](https://img.shields.io/github/stars/orf/gping) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/orf/gping) | Ping, but with a graph | -| [bottom](https://github.com/ClementTsang/bottom) | ![GitHub Repo stars](https://img.shields.io/github/stars/ClementTsang/bottom) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ClementTsang/bottom) | Yet another cross-platform graphical process/system monitor. | -| [clients](https://github.com/bitwarden/clients) | ![GitHub Repo stars](https://img.shields.io/github/stars/bitwarden/clients) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/bitwarden/clients) | Bitwarden client applications (web, browser extension, desktop, and cli) | -| [lf](https://github.com/gokcehan/lf) | ![GitHub Repo stars](https://img.shields.io/github/stars/gokcehan/lf) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/gokcehan/lf) | Terminal file manager | -| [dog](https://github.com/ogham/dog) | ![GitHub Repo stars](https://img.shields.io/github/stars/ogham/dog) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ogham/dog) | A command-line DNS client. | -| [scc](https://github.com/boyter/scc) | ![GitHub Repo stars](https://img.shields.io/github/stars/boyter/scc) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/boyter/scc) | Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go | -| [gdu](https://github.com/dundee/gdu) | ![GitHub Repo stars](https://img.shields.io/github/stars/dundee/gdu) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/dundee/gdu) | Fast disk usage analyzer with console interface written in Go | -| [mermaid-cli](https://github.com/mermaid-js/mermaid-cli) | ![GitHub Repo stars](https://img.shields.io/github/stars/mermaid-js/mermaid-cli) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/mermaid-js/mermaid-cli) | Command line tool for the Mermaid library | -| [toml-sort](https://github.com/pappasam/toml-sort) | ![GitHub Repo stars](https://img.shields.io/github/stars/pappasam/toml-sort) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pappasam/toml-sort) | Toml sorting library | +| [neovim](https://github.com/neovim/neovim) | ![GitHub Repo Stars](https://img.shields.io/github/stars/neovim/neovim) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/neovim/neovim) | Vim-fork focused on extensibility and usability | +| [fzf](https://github.com/junegunn/fzf) | ![GitHub Repo Stars](https://img.shields.io/github/stars/junegunn/fzf) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/junegunn/fzf) | :cherry_blossom: A command-line fuzzy finder | +| [prettier](https://github.com/prettier/prettier) | ![GitHub Repo Stars](https://img.shields.io/github/stars/prettier/prettier) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/prettier/prettier) | Prettier is an opinionated code formatter. | +| [tldr](https://github.com/tldr-pages/tldr) | ![GitHub Repo Stars](https://img.shields.io/github/stars/tldr-pages/tldr) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/tldr-pages/tldr) | 📚 Collaborative cheatsheets for console commands | +| [bat](https://github.com/sharkdp/bat) | ![GitHub Repo Stars](https://img.shields.io/github/stars/sharkdp/bat) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/sharkdp/bat) | A cat(1) clone with wings. | +| [rclone](https://github.com/rclone/rclone) | ![GitHub Repo Stars](https://img.shields.io/github/stars/rclone/rclone) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/rclone/rclone) | "rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Yandex Files | +| [ripgrep](https://github.com/BurntSushi/ripgrep) | ![GitHub Repo Stars](https://img.shields.io/github/stars/BurntSushi/ripgrep) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/BurntSushi/ripgrep) | ripgrep recursively searches directories for a regex pattern while respecting your gitignore | +| [lazygit](https://github.com/jesseduffield/lazygit) | ![GitHub Repo Stars](https://img.shields.io/github/stars/jesseduffield/lazygit) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/jesseduffield/lazygit) | simple terminal UI for git commands | +| [cli](https://github.com/cli/cli) | ![GitHub Repo Stars](https://img.shields.io/github/stars/cli/cli) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/cli/cli) | GitHub’s official command line tool | +| [tmux](https://github.com/tmux/tmux) | ![GitHub Repo Stars](https://img.shields.io/github/stars/tmux/tmux) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/tmux/tmux) | tmux source code | +| [httpie](https://github.com/httpie/httpie) | ![GitHub Repo Stars](https://img.shields.io/github/stars/httpie/httpie) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/httpie/httpie) | 🥧 HTTPie for Terminal — modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more. | +| [fd](https://github.com/sharkdp/fd) | ![GitHub Repo Stars](https://img.shields.io/github/stars/sharkdp/fd) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/sharkdp/fd) | A simple, fast and user-friendly alternative to 'find' | +| [jq](https://github.com/stedolan/jq) | ![GitHub Repo Stars](https://img.shields.io/github/stars/stedolan/jq) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/stedolan/jq) | Command-line JSON processor | +| [neofetch](https://github.com/dylanaraps/neofetch) | ![GitHub Repo Stars](https://img.shields.io/github/stars/dylanaraps/neofetch) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/dylanaraps/neofetch) | 🖼️ A command-line system information tool written in bash 3.2+ | +| [delta](https://github.com/dandavison/delta) | ![GitHub Repo Stars](https://img.shields.io/github/stars/dandavison/delta) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/dandavison/delta) | A syntax-highlighting pager for git, diff, and grep output | +| [git-extras](https://github.com/tj/git-extras) | ![GitHub Repo Stars](https://img.shields.io/github/stars/tj/git-extras) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/tj/git-extras) | GIT utilities -- repo summary, repl, changelog population, author commit percentages and more | +| [hyperfine](https://github.com/sharkdp/hyperfine) | ![GitHub Repo Stars](https://img.shields.io/github/stars/sharkdp/hyperfine) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/sharkdp/hyperfine) | A command-line benchmarking tool | +| [cz-cli](https://github.com/commitizen/cz-cli) | ![GitHub Repo Stars](https://img.shields.io/github/stars/commitizen/cz-cli) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/commitizen/cz-cli) | The commitizen command line utility. #BlackLivesMatter | +| [gum](https://github.com/charmbracelet/gum) | ![GitHub Repo Stars](https://img.shields.io/github/stars/charmbracelet/gum) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/charmbracelet/gum) | A tool for glamorous shell scripts 🎀 | +| [glow](https://github.com/charmbracelet/glow) | ![GitHub Repo Stars](https://img.shields.io/github/stars/charmbracelet/glow) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/charmbracelet/glow) | Render markdown on the CLI, with pizzazz! 💅🏻 | +| [duf](https://github.com/muesli/duf) | ![GitHub Repo Stars](https://img.shields.io/github/stars/muesli/duf) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/muesli/duf) | Disk Usage/Free Utility - a better 'df' alternative | +| [vhs](https://github.com/charmbracelet/vhs) | ![GitHub Repo Stars](https://img.shields.io/github/stars/charmbracelet/vhs) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/charmbracelet/vhs) | Your CLI home video recorder 📼 | +| [zoxide](https://github.com/ajeetdsouza/zoxide) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ajeetdsouza/zoxide) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ajeetdsouza/zoxide) | A smarter cd command. Supports all major shells. | +| [pre-commit](https://github.com/pre-commit/pre-commit) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pre-commit/pre-commit) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pre-commit/pre-commit) | A framework for managing and maintaining multi-language pre-commit hooks. | +| [lsd](https://github.com/lsd-rs/lsd) | ![GitHub Repo Stars](https://img.shields.io/github/stars/lsd-rs/lsd) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/lsd-rs/lsd) | The next gen ls command | +| [ImageMagick](https://github.com/ImageMagick/ImageMagick) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ImageMagick/ImageMagick) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ImageMagick/ImageMagick) | 🧙‍♂️ ImageMagick 7 | +| [serve](https://github.com/vercel/serve) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vercel/serve) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vercel/serve) | Static file serving and directory listing | +| [gping](https://github.com/orf/gping) | ![GitHub Repo Stars](https://img.shields.io/github/stars/orf/gping) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/orf/gping) | Ping, but with a graph | +| [bottom](https://github.com/ClementTsang/bottom) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ClementTsang/bottom) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ClementTsang/bottom) | Yet another cross-platform graphical process/system monitor. | +| [clients](https://github.com/bitwarden/clients) | ![GitHub Repo Stars](https://img.shields.io/github/stars/bitwarden/clients) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/bitwarden/clients) | Bitwarden client applications (web, browser extension, desktop, and cli) | +| [lf](https://github.com/gokcehan/lf) | ![GitHub Repo Stars](https://img.shields.io/github/stars/gokcehan/lf) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/gokcehan/lf) | Terminal file manager | +| [dog](https://github.com/ogham/dog) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ogham/dog) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ogham/dog) | A command-line DNS client. | +| [scc](https://github.com/boyter/scc) | ![GitHub Repo Stars](https://img.shields.io/github/stars/boyter/scc) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/boyter/scc) | Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go | +| [gdu](https://github.com/dundee/gdu) | ![GitHub Repo Stars](https://img.shields.io/github/stars/dundee/gdu) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/dundee/gdu) | Fast disk usage analyzer with console interface written in Go | +| [mermaid-cli](https://github.com/mermaid-js/mermaid-cli) | ![GitHub Repo Stars](https://img.shields.io/github/stars/mermaid-js/mermaid-cli) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/mermaid-js/mermaid-cli) | Command line tool for the Mermaid library | +| [toml-sort](https://github.com/pappasam/toml-sort) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pappasam/toml-sort) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pappasam/toml-sort) | Toml sorting library | ## Desktop | Name | Statistics | Description | | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [vscode](https://github.com/microsoft/vscode) | ![GitHub Repo stars](https://img.shields.io/github/stars/microsoft/vscode) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/microsoft/vscode) | Visual Studio Code | -| [PowerToys](https://github.com/microsoft/PowerToys) | ![GitHub Repo stars](https://img.shields.io/github/stars/microsoft/PowerToys) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/microsoft/PowerToys) | Windows system utilities to maximize productivity | -| [FiraCode](https://github.com/tonsky/FiraCode) | ![GitHub Repo stars](https://img.shields.io/github/stars/tonsky/FiraCode) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/tonsky/FiraCode) | Free monospaced font with programming ligatures | -| [clash_for_windows_pkg](https://github.com/Fndroid/clash_for_windows_pkg) | ![GitHub Repo stars](https://img.shields.io/github/stars/Fndroid/clash_for_windows_pkg) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/Fndroid/clash_for_windows_pkg) | A Windows/macOS GUI based on Clash | -| [Ventoy](https://github.com/ventoy/Ventoy) | ![GitHub Repo stars](https://img.shields.io/github/stars/ventoy/Ventoy) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ventoy/Ventoy) | A new bootable USB solution. | -| [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) | ![GitHub Repo stars](https://img.shields.io/github/stars/ryanoasis/nerd-fonts) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ryanoasis/nerd-fonts) | Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more | -| [Motrix](https://github.com/agalwood/Motrix) | ![GitHub Repo stars](https://img.shields.io/github/stars/agalwood/Motrix) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/agalwood/Motrix) | A full-featured download manager. | -| [rufus](https://github.com/pbatard/rufus) | ![GitHub Repo stars](https://img.shields.io/github/stars/pbatard/rufus) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pbatard/rufus) | The Reliable USB Formatting Utility | -| [kitty](https://github.com/kovidgoyal/kitty) | ![GitHub Repo stars](https://img.shields.io/github/stars/kovidgoyal/kitty) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/kovidgoyal/kitty) | Cross-platform, fast, feature-rich, GPU based terminal | -| [vlc](https://github.com/videolan/vlc) | ![GitHub Repo stars](https://img.shields.io/github/stars/videolan/vlc) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/videolan/vlc) | VLC media player - All pull requests are ignored, please follow https://wiki.videolan.org/Sending_Patches_VLC/ | -| [zotero](https://github.com/zotero/zotero) | ![GitHub Repo stars](https://img.shields.io/github/stars/zotero/zotero) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/zotero/zotero) | Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources. | -| [Office-Tool](https://github.com/YerongAI/Office-Tool) | ![GitHub Repo stars](https://img.shields.io/github/stars/YerongAI/Office-Tool) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/YerongAI/Office-Tool) | Office Tool Plus localization projects. | -| [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher) | ![GitHub Repo stars](https://img.shields.io/github/stars/TheAssassin/AppImageLauncher) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/TheAssassin/AppImageLauncher) | Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages | -| [noto-cjk](https://github.com/notofonts/noto-cjk) | ![GitHub Repo stars](https://img.shields.io/github/stars/notofonts/noto-cjk) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/notofonts/noto-cjk) | Noto CJK fonts | -| [ibus-libpinyin](https://github.com/libpinyin/ibus-libpinyin) | ![GitHub Repo stars](https://img.shields.io/github/stars/libpinyin/ibus-libpinyin) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/libpinyin/ibus-libpinyin) | | +| [vscode](https://github.com/microsoft/vscode) | ![GitHub Repo Stars](https://img.shields.io/github/stars/microsoft/vscode) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/microsoft/vscode) | Visual Studio Code | +| [PowerToys](https://github.com/microsoft/PowerToys) | ![GitHub Repo Stars](https://img.shields.io/github/stars/microsoft/PowerToys) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/microsoft/PowerToys) | Windows system utilities to maximize productivity | +| [FiraCode](https://github.com/tonsky/FiraCode) | ![GitHub Repo Stars](https://img.shields.io/github/stars/tonsky/FiraCode) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/tonsky/FiraCode) | Free monospaced font with programming ligatures | +| [clash_for_windows_pkg](https://github.com/Fndroid/clash_for_windows_pkg) | ![GitHub Repo Stars](https://img.shields.io/github/stars/Fndroid/clash_for_windows_pkg) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/Fndroid/clash_for_windows_pkg) | A Windows/macOS GUI based on Clash | +| [Ventoy](https://github.com/ventoy/Ventoy) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ventoy/Ventoy) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ventoy/Ventoy) | A new bootable USB solution. | +| [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ryanoasis/nerd-fonts) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ryanoasis/nerd-fonts) | Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more | +| [Motrix](https://github.com/agalwood/Motrix) | ![GitHub Repo Stars](https://img.shields.io/github/stars/agalwood/Motrix) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/agalwood/Motrix) | A full-featured download manager. | +| [rufus](https://github.com/pbatard/rufus) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pbatard/rufus) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pbatard/rufus) | The Reliable USB Formatting Utility | +| [kitty](https://github.com/kovidgoyal/kitty) | ![GitHub Repo Stars](https://img.shields.io/github/stars/kovidgoyal/kitty) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/kovidgoyal/kitty) | Cross-platform, fast, feature-rich, GPU based terminal | +| [vlc](https://github.com/videolan/vlc) | ![GitHub Repo Stars](https://img.shields.io/github/stars/videolan/vlc) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/videolan/vlc) | VLC media player - All pull requests are ignored, please follow https://wiki.videolan.org/Sending_Patches_VLC/ | +| [zotero](https://github.com/zotero/zotero) | ![GitHub Repo Stars](https://img.shields.io/github/stars/zotero/zotero) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/zotero/zotero) | Zotero is a free, easy-to-use tool to help you collect, organize, annotate, cite, and share your research sources. | +| [Office-Tool](https://github.com/YerongAI/Office-Tool) | ![GitHub Repo Stars](https://img.shields.io/github/stars/YerongAI/Office-Tool) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/YerongAI/Office-Tool) | Office Tool Plus localization projects. | +| [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher) | ![GitHub Repo Stars](https://img.shields.io/github/stars/TheAssassin/AppImageLauncher) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/TheAssassin/AppImageLauncher) | Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages | +| [noto-cjk](https://github.com/notofonts/noto-cjk) | ![GitHub Repo Stars](https://img.shields.io/github/stars/notofonts/noto-cjk) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/notofonts/noto-cjk) | Noto CJK fonts | +| [ibus-libpinyin](https://github.com/libpinyin/ibus-libpinyin) | ![GitHub Repo Stars](https://img.shields.io/github/stars/libpinyin/ibus-libpinyin) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/libpinyin/ibus-libpinyin) | None | ## GNOME | Name | Statistics | Description | | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [dash-to-dock](https://github.com/micheleg/dash-to-dock) | ![GitHub Repo stars](https://img.shields.io/github/stars/micheleg/dash-to-dock) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/micheleg/dash-to-dock) | A dock for the Gnome Shell. This extension moves the dash out of the overview transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops. | -| [PaperWM](https://github.com/paperwm/PaperWM) | ![GitHub Repo stars](https://img.shields.io/github/stars/paperwm/PaperWM) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/paperwm/PaperWM) | Tiled scrollable window management for Gnome Shell | -| [gnome-shell-system-monitor-applet](https://github.com/paradoxxxzero/gnome-shell-system-monitor-applet) | ![GitHub Repo stars](https://img.shields.io/github/stars/paradoxxxzero/gnome-shell-system-monitor-applet) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/paradoxxxzero/gnome-shell-system-monitor-applet) | Display system informations in gnome shell status bar, such as memory usage, cpu usage, network rates… | -| [gnome-shell-extension-appindicator](https://github.com/ubuntu/gnome-shell-extension-appindicator) | ![GitHub Repo stars](https://img.shields.io/github/stars/ubuntu/gnome-shell-extension-appindicator) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ubuntu/gnome-shell-extension-appindicator) | Adds KStatusNotifierItem support to the Shell | +| [dash-to-dock](https://github.com/micheleg/dash-to-dock) | ![GitHub Repo Stars](https://img.shields.io/github/stars/micheleg/dash-to-dock) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/micheleg/dash-to-dock) | A dock for the Gnome Shell. This extension moves the dash out of the overview transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops. | +| [PaperWM](https://github.com/paperwm/PaperWM) | ![GitHub Repo Stars](https://img.shields.io/github/stars/paperwm/PaperWM) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/paperwm/PaperWM) | Tiled scrollable window management for Gnome Shell | +| [gnome-shell-system-monitor-applet](https://github.com/paradoxxxzero/gnome-shell-system-monitor-applet) | ![GitHub Repo Stars](https://img.shields.io/github/stars/paradoxxxzero/gnome-shell-system-monitor-applet) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/paradoxxxzero/gnome-shell-system-monitor-applet) | Display system informations in gnome shell status bar, such as memory usage, cpu usage, network rates… | +| [gnome-shell-extension-appindicator](https://github.com/ubuntu/gnome-shell-extension-appindicator) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ubuntu/gnome-shell-extension-appindicator) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ubuntu/gnome-shell-extension-appindicator) | Adds KStatusNotifierItem support to the Shell | ## Go | Name | Statistics | Description | | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [cobra](https://github.com/spf13/cobra) | ![GitHub Repo stars](https://img.shields.io/github/stars/spf13/cobra) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/spf13/cobra) | A Commander for modern Go CLI interactions | -| [logrus](https://github.com/sirupsen/logrus) | ![GitHub Repo stars](https://img.shields.io/github/stars/sirupsen/logrus) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/sirupsen/logrus) | Structured, pluggable logging for Go. | -| [testify](https://github.com/stretchr/testify) | ![GitHub Repo stars](https://img.shields.io/github/stars/stretchr/testify) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/stretchr/testify) | A toolkit with common assertions and mocks that plays nicely with the standard library | -| [gods](https://github.com/emirpasic/gods) | ![GitHub Repo stars](https://img.shields.io/github/stars/emirpasic/gods) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/emirpasic/gods) | GoDS (Go Data Structures) - Sets, Lists, Stacks, Maps, Trees, Queues, and much more | -| [sh](https://github.com/mvdan/sh) | ![GitHub Repo stars](https://img.shields.io/github/stars/mvdan/sh) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/mvdan/sh) | A shell parser, formatter, and interpreter with bash support; includes shfmt | -| [archiver](https://github.com/mholt/archiver) | ![GitHub Repo stars](https://img.shields.io/github/stars/mholt/archiver) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/mholt/archiver) | Easily create & extract archives, and compress & decompress files of various formats | -| [survey](https://github.com/go-survey/survey) | ![GitHub Repo stars](https://img.shields.io/github/stars/go-survey/survey) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/go-survey/survey) | A golang library for building interactive and accessible prompts with full support for windows and posix terminals. | -| [pterm](https://github.com/pterm/pterm) | ![GitHub Repo stars](https://img.shields.io/github/stars/pterm/pterm) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pterm/pterm) | ✨ #PTerm is a modern Go module to easily beautify console output. Featuring charts, progressbars, tables, trees, text input, select menus and much more 🚀 It's completely configurable and 100% cross-platform compatible. | -| [slug](https://github.com/gosimple/slug) | ![GitHub Repo stars](https://img.shields.io/github/stars/gosimple/slug) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/gosimple/slug) | URL-friendly slugify with multiple languages support. | -| [copy](https://github.com/otiai10/copy) | ![GitHub Repo stars](https://img.shields.io/github/stars/otiai10/copy) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/otiai10/copy) | Go copy directory recursively | -| [try](https://github.com/dsnet/try) | ![GitHub Repo stars](https://img.shields.io/github/stars/dsnet/try) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/dsnet/try) | Simplified error handling in Go | +| [cobra](https://github.com/spf13/cobra) | ![GitHub Repo Stars](https://img.shields.io/github/stars/spf13/cobra) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/spf13/cobra) | A Commander for modern Go CLI interactions | +| [logrus](https://github.com/sirupsen/logrus) | ![GitHub Repo Stars](https://img.shields.io/github/stars/sirupsen/logrus) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/sirupsen/logrus) | Structured, pluggable logging for Go. | +| [testify](https://github.com/stretchr/testify) | ![GitHub Repo Stars](https://img.shields.io/github/stars/stretchr/testify) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/stretchr/testify) | A toolkit with common assertions and mocks that plays nicely with the standard library | +| [gods](https://github.com/emirpasic/gods) | ![GitHub Repo Stars](https://img.shields.io/github/stars/emirpasic/gods) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/emirpasic/gods) | GoDS (Go Data Structures) - Sets, Lists, Stacks, Maps, Trees, Queues, and much more | +| [sh](https://github.com/mvdan/sh) | ![GitHub Repo Stars](https://img.shields.io/github/stars/mvdan/sh) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/mvdan/sh) | A shell parser, formatter, and interpreter with bash support; includes shfmt | +| [archiver](https://github.com/mholt/archiver) | ![GitHub Repo Stars](https://img.shields.io/github/stars/mholt/archiver) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/mholt/archiver) | Easily create & extract archives, and compress & decompress files of various formats | +| [survey](https://github.com/go-survey/survey) | ![GitHub Repo Stars](https://img.shields.io/github/stars/go-survey/survey) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/go-survey/survey) | A golang library for building interactive and accessible prompts with full support for windows and posix terminals. | +| [pterm](https://github.com/pterm/pterm) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pterm/pterm) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pterm/pterm) | ✨ #PTerm is a modern Go module to easily beautify console output. Featuring charts, progressbars, tables, trees, text input, select menus and much more 🚀 It's completely configurable and 100% cross-platform compatible. | +| [slug](https://github.com/gosimple/slug) | ![GitHub Repo Stars](https://img.shields.io/github/stars/gosimple/slug) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/gosimple/slug) | URL-friendly slugify with multiple languages support. | +| [copy](https://github.com/otiai10/copy) | ![GitHub Repo Stars](https://img.shields.io/github/stars/otiai10/copy) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/otiai10/copy) | Go copy directory recursively | +| [try](https://github.com/dsnet/try) | ![GitHub Repo Stars](https://img.shields.io/github/stars/dsnet/try) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/dsnet/try) | Simplified error handling in Go | ## Node.js | Name | Statistics | Description | | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -| [react](https://github.com/facebook/react) | ![GitHub Repo stars](https://img.shields.io/github/stars/facebook/react) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/facebook/react) | The library for web and native user interfaces | -| [vue](https://github.com/vuejs/vue) | ![GitHub Repo stars](https://img.shields.io/github/stars/vuejs/vue) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vuejs/vue) | This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core | -| [next.js](https://github.com/vercel/next.js) | ![GitHub Repo stars](https://img.shields.io/github/stars/vercel/next.js) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vercel/next.js) | The React Framework | -| [ant-design](https://github.com/ant-design/ant-design) | ![GitHub Repo stars](https://img.shields.io/github/stars/ant-design/ant-design) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ant-design/ant-design) | An enterprise-class UI design language and React UI library | -| [vercel](https://github.com/vercel/vercel) | ![GitHub Repo stars](https://img.shields.io/github/stars/vercel/vercel) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vercel/vercel) | Develop. Preview. Ship. | -| [serve](https://github.com/vercel/serve) | ![GitHub Repo stars](https://img.shields.io/github/stars/vercel/serve) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vercel/serve) | Static file serving and directory listing | -| [vuepress-next](https://github.com/vuepress/vuepress-next) | ![GitHub Repo stars](https://img.shields.io/github/stars/vuepress/vuepress-next) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vuepress/vuepress-next) | Repo for VuePress 2 | -| [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope) | ![GitHub Repo stars](https://img.shields.io/github/stars/vuepress-theme-hope/vuepress-theme-hope) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vuepress-theme-hope/vuepress-theme-hope) | A vuepress theme with tons of features✨ | +| [react](https://github.com/facebook/react) | ![GitHub Repo Stars](https://img.shields.io/github/stars/facebook/react) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/facebook/react) | The library for web and native user interfaces | +| [vue](https://github.com/vuejs/vue) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vuejs/vue) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vuejs/vue) | This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/core | +| [next.js](https://github.com/vercel/next.js) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vercel/next.js) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vercel/next.js) | The React Framework | +| [ant-design](https://github.com/ant-design/ant-design) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ant-design/ant-design) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ant-design/ant-design) | An enterprise-class UI design language and React UI library | +| [vercel](https://github.com/vercel/vercel) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vercel/vercel) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vercel/vercel) | Develop. Preview. Ship. | +| [serve](https://github.com/vercel/serve) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vercel/serve) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vercel/serve) | Static file serving and directory listing | +| [vuepress-next](https://github.com/vuepress/vuepress-next) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vuepress/vuepress-next) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vuepress/vuepress-next) | Repo for VuePress 2 | +| [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vuepress-theme-hope/vuepress-theme-hope) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vuepress-theme-hope/vuepress-theme-hope) | A vuepress theme with tons of features✨ | ## Python | Name | Statistics | Description | | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [requests](https://github.com/psf/requests) | ![GitHub Repo stars](https://img.shields.io/github/stars/psf/requests) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/psf/requests) | A simple, yet elegant, HTTP library. | -| [rich](https://github.com/Textualize/rich) | ![GitHub Repo stars](https://img.shields.io/github/stars/Textualize/rich) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/Textualize/rich) | Rich is a Python library for rich text and beautiful formatting in the terminal. | -| [pandas](https://github.com/pandas-dev/pandas) | ![GitHub Repo stars](https://img.shields.io/github/stars/pandas-dev/pandas) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pandas-dev/pandas) | Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more | -| [black](https://github.com/psf/black) | ![GitHub Repo stars](https://img.shields.io/github/stars/psf/black) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/psf/black) | The uncompromising Python code formatter | -| [httpie](https://github.com/httpie/httpie) | ![GitHub Repo stars](https://img.shields.io/github/stars/httpie/httpie) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/httpie/httpie) | 🥧 HTTPie for Terminal — modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more. | -| [poetry](https://github.com/python-poetry/poetry) | ![GitHub Repo stars](https://img.shields.io/github/stars/python-poetry/poetry) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/python-poetry/poetry) | Python packaging and dependency management made easy | -| [numpy](https://github.com/numpy/numpy) | ![GitHub Repo stars](https://img.shields.io/github/stars/numpy/numpy) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/numpy/numpy) | The fundamental package for scientific computing with Python. | -| [taichi](https://github.com/taichi-dev/taichi) | ![GitHub Repo stars](https://img.shields.io/github/stars/taichi-dev/taichi) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/taichi-dev/taichi) | Productive & portable high-performance programming in Python. | -| [matplotlib](https://github.com/matplotlib/matplotlib) | ![GitHub Repo stars](https://img.shields.io/github/stars/matplotlib/matplotlib) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/matplotlib/matplotlib) | matplotlib: plotting with Python | -| [scipy](https://github.com/scipy/scipy) | ![GitHub Repo stars](https://img.shields.io/github/stars/scipy/scipy) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/scipy/scipy) | SciPy library main repository | -| [typer](https://github.com/tiangolo/typer) | ![GitHub Repo stars](https://img.shields.io/github/stars/tiangolo/typer) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/tiangolo/typer) | Typer, build great CLIs. Easy to code. Based on Python type hints. | -| [seaborn](https://github.com/mwaskom/seaborn) | ![GitHub Repo stars](https://img.shields.io/github/stars/mwaskom/seaborn) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/mwaskom/seaborn) | Statistical data visualization in Python | -| [pyinstaller](https://github.com/pyinstaller/pyinstaller) | ![GitHub Repo stars](https://img.shields.io/github/stars/pyinstaller/pyinstaller) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pyinstaller/pyinstaller) | Freeze (package) Python programs into stand-alone executables | -| [pre-commit](https://github.com/pre-commit/pre-commit) | ![GitHub Repo stars](https://img.shields.io/github/stars/pre-commit/pre-commit) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pre-commit/pre-commit) | A framework for managing and maintaining multi-language pre-commit hooks. | -| [pipx](https://github.com/pypa/pipx) | ![GitHub Repo stars](https://img.shields.io/github/stars/pypa/pipx) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pypa/pipx) | Install and Run Python Applications in Isolated Environments | -| [isort](https://github.com/PyCQA/isort) | ![GitHub Repo stars](https://img.shields.io/github/stars/PyCQA/isort) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/PyCQA/isort) | A Python utility / library to sort imports. | -| [conda](https://github.com/conda/conda) | ![GitHub Repo stars](https://img.shields.io/github/stars/conda/conda) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/conda/conda) | A system-level, binary package and environment manager running on all major operating systems and platforms. | -| [pyvista](https://github.com/pyvista/pyvista) | ![GitHub Repo stars](https://img.shields.io/github/stars/pyvista/pyvista) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pyvista/pyvista) | 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK) | -| [questionary](https://github.com/tmbo/questionary) | ![GitHub Repo stars](https://img.shields.io/github/stars/tmbo/questionary) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/tmbo/questionary) | Python library to build pretty command line user prompts ✨Easy to use multi-select lists, confirmations, free text prompts ... | -| [tetgen](https://github.com/pyvista/tetgen) | ![GitHub Repo stars](https://img.shields.io/github/stars/pyvista/tetgen) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pyvista/tetgen) | A Python interface to the C++ TetGen library to generate tetrahedral meshes of any 3D polyhedral domains | -| [toml-sort](https://github.com/pappasam/toml-sort) | ![GitHub Repo stars](https://img.shields.io/github/stars/pappasam/toml-sort) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/pappasam/toml-sort) | Toml sorting library | +| [requests](https://github.com/psf/requests) | ![GitHub Repo Stars](https://img.shields.io/github/stars/psf/requests) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/psf/requests) | A simple, yet elegant, HTTP library. | +| [rich](https://github.com/Textualize/rich) | ![GitHub Repo Stars](https://img.shields.io/github/stars/Textualize/rich) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/Textualize/rich) | Rich is a Python library for rich text and beautiful formatting in the terminal. | +| [pandas](https://github.com/pandas-dev/pandas) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pandas-dev/pandas) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pandas-dev/pandas) | Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more | +| [black](https://github.com/psf/black) | ![GitHub Repo Stars](https://img.shields.io/github/stars/psf/black) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/psf/black) | The uncompromising Python code formatter | +| [httpie](https://github.com/httpie/httpie) | ![GitHub Repo Stars](https://img.shields.io/github/stars/httpie/httpie) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/httpie/httpie) | 🥧 HTTPie for Terminal — modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more. | +| [poetry](https://github.com/python-poetry/poetry) | ![GitHub Repo Stars](https://img.shields.io/github/stars/python-poetry/poetry) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/python-poetry/poetry) | Python packaging and dependency management made easy | +| [numpy](https://github.com/numpy/numpy) | ![GitHub Repo Stars](https://img.shields.io/github/stars/numpy/numpy) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/numpy/numpy) | The fundamental package for scientific computing with Python. | +| [taichi](https://github.com/taichi-dev/taichi) | ![GitHub Repo Stars](https://img.shields.io/github/stars/taichi-dev/taichi) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/taichi-dev/taichi) | Productive & portable high-performance programming in Python. | +| [matplotlib](https://github.com/matplotlib/matplotlib) | ![GitHub Repo Stars](https://img.shields.io/github/stars/matplotlib/matplotlib) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/matplotlib/matplotlib) | matplotlib: plotting with Python | +| [scipy](https://github.com/scipy/scipy) | ![GitHub Repo Stars](https://img.shields.io/github/stars/scipy/scipy) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/scipy/scipy) | SciPy library main repository | +| [typer](https://github.com/tiangolo/typer) | ![GitHub Repo Stars](https://img.shields.io/github/stars/tiangolo/typer) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/tiangolo/typer) | Typer, build great CLIs. Easy to code. Based on Python type hints. | +| [seaborn](https://github.com/mwaskom/seaborn) | ![GitHub Repo Stars](https://img.shields.io/github/stars/mwaskom/seaborn) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/mwaskom/seaborn) | Statistical data visualization in Python | +| [pre-commit](https://github.com/pre-commit/pre-commit) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pre-commit/pre-commit) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pre-commit/pre-commit) | A framework for managing and maintaining multi-language pre-commit hooks. | +| [pyinstaller](https://github.com/pyinstaller/pyinstaller) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pyinstaller/pyinstaller) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pyinstaller/pyinstaller) | Freeze (package) Python programs into stand-alone executables | +| [pipx](https://github.com/pypa/pipx) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pypa/pipx) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pypa/pipx) | Install and Run Python Applications in Isolated Environments | +| [isort](https://github.com/PyCQA/isort) | ![GitHub Repo Stars](https://img.shields.io/github/stars/PyCQA/isort) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/PyCQA/isort) | A Python utility / library to sort imports. | +| [conda](https://github.com/conda/conda) | ![GitHub Repo Stars](https://img.shields.io/github/stars/conda/conda) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/conda/conda) | A system-level, binary package and environment manager running on all major operating systems and platforms. | +| [pyvista](https://github.com/pyvista/pyvista) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pyvista/pyvista) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pyvista/pyvista) | 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK) | +| [questionary](https://github.com/tmbo/questionary) | ![GitHub Repo Stars](https://img.shields.io/github/stars/tmbo/questionary) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/tmbo/questionary) | Python library to build pretty command line user prompts ✨Easy to use multi-select lists, confirmations, free text prompts ... | +| [tetgen](https://github.com/pyvista/tetgen) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pyvista/tetgen) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pyvista/tetgen) | A Python interface to the C++ TetGen library to generate tetrahedral meshes of any 3D polyhedral domains | +| [toml-sort](https://github.com/pappasam/toml-sort) | ![GitHub Repo Stars](https://img.shields.io/github/stars/pappasam/toml-sort) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/pappasam/toml-sort) | Toml sorting library | ## Self-Hosted | Name | Statistics | Description | | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| [mkdocs-material](https://github.com/squidfunk/mkdocs-material) | ![GitHub Repo stars](https://img.shields.io/github/stars/squidfunk/mkdocs-material) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/squidfunk/mkdocs-material) | Documentation that simply works | -| [upptime](https://github.com/upptime/upptime) | ![GitHub Repo stars](https://img.shields.io/github/stars/upptime/upptime) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/upptime/upptime) | ⬆️ Free uptime monitor and status page powered by GitHub | -| [homer](https://github.com/bastienwirtz/homer) | ![GitHub Repo stars](https://img.shields.io/github/stars/bastienwirtz/homer) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/bastienwirtz/homer) | A very simple static homepage for your server. | -| [OneManager-php](https://github.com/qkqpttgf/OneManager-php) | ![GitHub Repo stars](https://img.shields.io/github/stars/qkqpttgf/OneManager-php) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/qkqpttgf/OneManager-php) | An index & manager of Onedrive based on serverless. Can be deployed to Heroku/Glitch/Vercel/Replit/SCF/FG/FC/CFC/PHP web hosting/VPS. | -| [onedrive-vercel-index](https://github.com/spencerwooo/onedrive-vercel-index) | ![GitHub Repo stars](https://img.shields.io/github/stars/spencerwooo/onedrive-vercel-index) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/spencerwooo/onedrive-vercel-index) | OneDrive public directory listing, powered by Vercel and Next.js | -| [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope) | ![GitHub Repo stars](https://img.shields.io/github/stars/vuepress-theme-hope/vuepress-theme-hope) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/vuepress-theme-hope/vuepress-theme-hope) | A vuepress theme with tons of features✨ | +| [mkdocs-material](https://github.com/squidfunk/mkdocs-material) | ![GitHub Repo Stars](https://img.shields.io/github/stars/squidfunk/mkdocs-material) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/squidfunk/mkdocs-material) | Documentation that simply works | +| [upptime](https://github.com/upptime/upptime) | ![GitHub Repo Stars](https://img.shields.io/github/stars/upptime/upptime) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/upptime/upptime) | ⬆️ Free uptime monitor and status page powered by GitHub | +| [homer](https://github.com/bastienwirtz/homer) | ![GitHub Repo Stars](https://img.shields.io/github/stars/bastienwirtz/homer) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/bastienwirtz/homer) | A very simple static homepage for your server. | +| [OneManager-php](https://github.com/qkqpttgf/OneManager-php) | ![GitHub Repo Stars](https://img.shields.io/github/stars/qkqpttgf/OneManager-php) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/qkqpttgf/OneManager-php) | An index & manager of Onedrive based on serverless. Can be deployed to Heroku/Glitch/Vercel/Replit/SCF/FG/FC/CFC/PHP web hosting/VPS. | +| [onedrive-vercel-index](https://github.com/spencerwooo/onedrive-vercel-index) | ![GitHub Repo Stars](https://img.shields.io/github/stars/spencerwooo/onedrive-vercel-index) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/spencerwooo/onedrive-vercel-index) | OneDrive public directory listing, powered by Vercel and Next.js | +| [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope) | ![GitHub Repo Stars](https://img.shields.io/github/stars/vuepress-theme-hope/vuepress-theme-hope) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/vuepress-theme-hope/vuepress-theme-hope) | A vuepress theme with tons of features✨ | ## Zsh | Name | Statistics | Description | | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ohmyzsh](https://github.com/ohmyzsh/ohmyzsh) | ![GitHub Repo stars](https://img.shields.io/github/stars/ohmyzsh/ohmyzsh) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/ohmyzsh/ohmyzsh) | 🙃 A delightful community-driven (with 2,100+ contributors) framework for managing your zsh configuration. Includes 300+ optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc), 140+ themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community. | -| [starship](https://github.com/starship/starship) | ![GitHub Repo stars](https://img.shields.io/github/stars/starship/starship) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/starship/starship) | ☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell! | -| [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) | ![GitHub Repo stars](https://img.shields.io/github/stars/zsh-users/zsh-syntax-highlighting) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/zsh-users/zsh-syntax-highlighting) | Fish shell like syntax highlighting for Zsh. | -| [zsh-autocomplete](https://github.com/marlonrichert/zsh-autocomplete) | ![GitHub Repo stars](https://img.shields.io/github/stars/marlonrichert/zsh-autocomplete) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/marlonrichert/zsh-autocomplete) | 🤖 Real-time type-ahead completion for Zsh. Asynchronous find-as-you-type autocompletion. | -| [conda-zsh-completion](https://github.com/conda-incubator/conda-zsh-completion) | ![GitHub Repo stars](https://img.shields.io/github/stars/conda-incubator/conda-zsh-completion) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/conda-incubator/conda-zsh-completion) | zsh completion for conda | -| [zsh-bitwarden](https://github.com/Game4Move78/zsh-bitwarden) | ![GitHub Repo stars](https://img.shields.io/github/stars/Game4Move78/zsh-bitwarden) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/Game4Move78/zsh-bitwarden) | This plugin provides functions to manage a bitwarden session | +| [ohmyzsh](https://github.com/ohmyzsh/ohmyzsh) | ![GitHub Repo Stars](https://img.shields.io/github/stars/ohmyzsh/ohmyzsh) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/ohmyzsh/ohmyzsh) | 🙃 A delightful community-driven (with 2,100+ contributors) framework for managing your zsh configuration. Includes 300+ optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc), 140+ themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community. | +| [starship](https://github.com/starship/starship) | ![GitHub Repo Stars](https://img.shields.io/github/stars/starship/starship) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/starship/starship) | ☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell! | +| [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) | ![GitHub Repo Stars](https://img.shields.io/github/stars/zsh-users/zsh-syntax-highlighting) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/zsh-users/zsh-syntax-highlighting) | Fish shell like syntax highlighting for Zsh. | +| [zsh-autocomplete](https://github.com/marlonrichert/zsh-autocomplete) | ![GitHub Repo Stars](https://img.shields.io/github/stars/marlonrichert/zsh-autocomplete) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/marlonrichert/zsh-autocomplete) | 🤖 Real-time type-ahead completion for Zsh. Asynchronous find-as-you-type autocompletion. | +| [conda-zsh-completion](https://github.com/conda-incubator/conda-zsh-completion) | ![GitHub Repo Stars](https://img.shields.io/github/stars/conda-incubator/conda-zsh-completion) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/conda-incubator/conda-zsh-completion) | zsh completion for conda | +| [zsh-bitwarden](https://github.com/Game4Move78/zsh-bitwarden) | ![GitHub Repo Stars](https://img.shields.io/github/stars/Game4Move78/zsh-bitwarden) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/Game4Move78/zsh-bitwarden) | This plugin provides functions to manage a bitwarden session | diff --git a/docs/awesome-websites.md b/docs/awesome-websites.md index c42958b9..94b58f59 100644 --- a/docs/awesome-websites.md +++ b/docs/awesome-websites.md @@ -10,84 +10,84 @@ tag: | Favicon | Title | | :----------------------------------------------------------------------------------------------------------------------: | ---------------------------------------------------------------------------------------------------------------------- | -| en.cppreference.com | [cppreference.com](https://en.cppreference.com) | -| github.com | [GitHub - google/sanitizers: AddressSanitizer, ThreadSanitizer, MemorySanitizer](https://github.com/google/sanitizers) | -| llvm.org | [LLVM Language Reference Manual — LLVM 17.0.0git documentation](https://llvm.org/docs/LangRef.html) | -| llvm.org | [LLVM: Class Index](https://llvm.org/doxygen/classes.html) | -| vcpkg.io | [vcpkg - Open source C/C++ dependency manager from Microsoft](https://vcpkg.io) | +| en.cppreference.com | [cppreference.com](https://en.cppreference.com) | +| github.com | [GitHub - google/sanitizers: AddressSanitizer, ThreadSanitizer, MemorySanitizer](https://github.com/google/sanitizers) | +| llvm.org | [LLVM Language Reference Manual — LLVM 17.0.0git documentation](https://llvm.org/docs/LangRef.html) | +| llvm.org | [LLVM: Class Index](https://llvm.org/doxygen/classes.html) | +| vcpkg.io | [vcpkg - Open source C/C++ dependency manager from Microsoft](https://vcpkg.io) | ## Forums | Favicon | Title | | :------------------------------------------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------- | -| stackoverflow.com | [Stack Overflow - Where Developers Learn, Share, & Build Careers](https://stackoverflow.com) | +| stackoverflow.com | [Stack Overflow - Where Developers Learn, Share, & Build Careers](https://stackoverflow.com) | ## Go | Favicon | Title | | :----------------------------------------------------------------------------------------------------: | ----------------------------------------------- | -| pkg.go.dev | [Go Packages - Go Packages](https://pkg.go.dev) | +| pkg.go.dev | [Go Packages - Go Packages](https://pkg.go.dev) | ## Linux | Favicon | Title | | :--------------------------------------------------------------------------------------------------------------------: | ---------------------------------------------- | -| man.archlinux.org | [Arch manual pages](https://man.archlinux.org) | -| wiki.archlinux.org | [ArchWiki](https://wiki.archlinux.org) | -| repology.org | [Repology](https://repology.org) | +| man.archlinux.org | [Arch manual pages](https://man.archlinux.org) | +| wiki.archlinux.org | [ArchWiki](https://wiki.archlinux.org) | +| repology.org | [Repology](https://repology.org) | ## Python | Favicon | Title | | :--------------------------------------------------------------------------------------------------------------: | --------------------------------------------------- | -| pypi.org | [PyPI · The Python Package Index](https://pypi.org) | -| docs.python.org | [3.11.2 Documentation](https://docs.python.org) | +| pypi.org | [PyPI · The Python Package Index](https://pypi.org) | +| docs.python.org | [3.11.3 Documentation](https://docs.python.org) | ## Resources | Favicon | Title | | :--------------------------------------------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------- | -| alternativeto.net | [AlternativeTo - Crowdsourced software recommendations](https://alternativeto.net) | -| annas-archive.org | [Anna’s Archive](https://annas-archive.org) | -| archive.org | [Internet Archive: Digital Library of Free & Borrowable Books, Movies, Music & Wayback Machine](https://archive.org) | -| duyaoss.com | [DuyaoSS-机场测速和简介](https://duyaoss.com) | -| scholar.google.com | [Google Scholar](https://scholar.google.com) | -| libraries.io | [Libraries.io - The Open Source Discovery Service](https://libraries.io) | -| www.similarweb.com | [Website Traffic - Check and Analyze Any Website \| Similarweb](https://www.similarweb.com) | -| steamunlocked.net | [STEAMUNLOCKED » Free Steam Games Pre-installed for PC](https://steamunlocked.net) | -| weibo.com | [@vposy 的个人主页 - 微博](https://weibo.com/vposy) | -| ylibrary.org | [Ylibrary 去中心化图书馆](https://ylibrary.org) | -| zhelper.net | [zhelper](https://zhelper.net) | +| alternativeto.net | [AlternativeTo - Crowdsourced software recommendations](https://alternativeto.net) | +| annas-archive.org | [Anna’s Archive](https://annas-archive.org) | +| archive.org | [Internet Archive: Digital Library of Free & Borrowable Books, Movies, Music & Wayback Machine](https://archive.org) | +| duyaoss.com | [DuyaoSS-机场测速和简介 [SS/SSR/V2Ray/Trojan]](https://duyaoss.com) | +| scholar.google.com | [Google Scholar](https://scholar.google.com) | +| libraries.io | [Libraries.io - The Open Source Discovery Service](https://libraries.io) | +| www.similarweb.com | [Website Traffic - Check and Analyze Any Website \| Similarweb](https://www.similarweb.com) | +| steamunlocked.net | [STEAMUNLOCKED » Free Steam Games Pre-installed for PC](https://steamunlocked.net) | +| weibo.com | [@vposy 的个人主页 - 微博](https://weibo.com/vposy) | +| nav.yibook.org | [网址导航](https://nav.yibook.org) | +| ylibrary.org | [Ylibrary 去中心化图书馆](https://ylibrary.org) | ## Services | Favicon | Title | | :----------------------------------------------------------------------------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------- | -| app.anonaddy.com | [AnonAddy](https://app.anonaddy.com) | -| vault.bitwarden.com | [Bitwarden Web Vault](https://vault.bitwarden.com) | -| www.cloudflare.com | [Cloudflare - The Web Performance & Security Company](https://www.cloudflare.com) | -| faviconkit.com | [Favicon Kit · get and embed high-quality Favicons from any website with this simple API](https://faviconkit.com) | -| github.com | [GitHub: Let’s build from here · GitHub](https://github.com) | -| www.namecheap.com | [Buy a domain name - Register cheap domain names from $0.99 - Namecheap](https://www.namecheap.com) | -| www.paypal.com | [Digital Wallets, Money Management, and More \| PayPal US](https://www.paypal.com) | -| mail.proton.me | [Proton Mail](https://mail.proton.me) | -| web.telegram.org | [Telegram Web](https://web.telegram.org) | -| vercel.com | [Vercel: Develop. Preview. Ship. For the best frontend teams](https://vercel.com) | -| www.zotero.org | [Zotero \| Your personal research assistant](https://www.zotero.org) | +| app.anonaddy.com | [AnonAddy](https://app.anonaddy.com) | +| vault.bitwarden.com | [Bitwarden Web Vault](https://vault.bitwarden.com) | +| www.cloudflare.com | [Cloudflare - The Web Performance & Security Company](https://www.cloudflare.com) | +| faviconkit.com | [Favicon Kit · get and embed high-quality Favicons from any website with this simple API](https://faviconkit.com) | +| github.com | [GitHub: Let’s build from here · GitHub](https://github.com) | +| www.namecheap.com | [Buy a domain name - Register cheap domain names from $0.99 - Namecheap](https://www.namecheap.com) | +| www.paypal.com | [Digital Wallets, Money Management, and More \| PayPal US](https://www.paypal.com) | +| mail.proton.me | [Proton Mail](https://mail.proton.me) | +| web.telegram.org | [Telegram Web](https://web.telegram.org) | +| vercel.com | [Vercel: Develop. Preview. Ship. For the best frontend teams](https://vercel.com) | +| www.zotero.org | [Zotero \| Your personal research assistant](https://www.zotero.org) | ## Tools | Favicon | Title | | :------------------------------------------------------------------------------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------ | -| chatkit.app | [Refined ChatGPT UI with useful features - ChatKit](https://chatkit.app) | -| speed.cloudflare.com | [Internet Speed Test - Measure Network Performance \| Cloudflare](https://speed.cloudflare.com) | -| coolors.co | [Coolors - The super fast color palettes generator!](https://coolors.co) | -| draw.io | [Flowchart Maker & Online Diagram Software](https://draw.io) | -| ip.sb | [IP Address Lookup / IPv4 / IPv6 - IP.SB](https://ip.sb) | -| ipjiance.com | [IP 检测](https://ipjiance.com) | -| mermaid.live | [Online FlowChart & Diagrams Editor - Mermaid Live Editor](https://mermaid.live) | -| pastebin.com | [Pastebin.com - #1 paste tool since 2002!](https://pastebin.com) | -| regex101.com | [regex101: build, test, and debug regex](https://regex101.com) | -| ip.skk.moe | [查看我的 IP 地址 \| 查询本机 IP 地址及归属地 \| 查看 DNS 出口 IP \| 测试 CDN 命中节点 \| Sukka \| https://ip.skk.moe](https://ip.skk.moe) | -| slugify.online | [URL Slug Generator - slugify.online](https://slugify.online) | -| titlecase.com | [TitleCase - Text Conversion Solutions](https://titlecase.com) | +| chatkit.app | [Refined ChatGPT UI with useful features - ChatKit](https://chatkit.app) | +| speed.cloudflare.com | [Internet Speed Test - Measure Network Performance \| Cloudflare](https://speed.cloudflare.com) | +| coolors.co | [Coolors - The super fast color palettes generator!](https://coolors.co) | +| draw.io | [Flowchart Maker & Online Diagram Software](https://draw.io) | +| ip.sb | [IP Address Lookup / IPv4 / IPv6 - IP.SB](https://ip.sb) | +| ipjiance.com | [IP 检测](https://ipjiance.com) | +| mermaid.live | [Online FlowChart & Diagrams Editor - Mermaid Live Editor](https://mermaid.live) | +| pastebin.com | [Pastebin.com - #1 paste tool since 2002!](https://pastebin.com) | +| regex101.com | [regex101: build, test, and debug regex](https://regex101.com) | +| ip.skk.moe | [查看我的 IP 地址 \| 查询本机 IP 地址及归属地 \| 查看 DNS 出口 IP \| 测试 CDN 命中节点 \| Sukka \| https://ip.skk.moe](https://ip.skk.moe) | +| slugify.online | [URL Slug Generator - slugify.online](https://slugify.online) | +| titlecase.com | [TitleCase - Text Conversion Solutions](https://titlecase.com) | diff --git a/docs/index.md b/docs/index.md index 21bdfaa6..f9c18285 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,42 +1,42 @@ -# `utils.py` +# `utils` **Usage**: ```console -$ utils.py [OPTIONS] COMMAND [ARGS]... +$ utils [OPTIONS] COMMAND [ARGS]... ``` **Options**: +- `--install-completion`: Install completion for the current shell. +- `--show-completion`: Show completion for the current shell, to copy it or customize the installation. - `--help`: Show this message and exit. **Commands**: - `hello` +- `nginx` - `sort` -## `utils.py hello` +## `utils hello` **Usage**: ```console -$ utils.py hello [OPTIONS] [NAME] COMMAND [ARGS]... +$ utils hello [OPTIONS] ``` -**Arguments**: - -- `[NAME]`: [default: world] - **Options**: +- `-n, --name TEXT`: [default: world] - `--help`: Show this message and exit. -## `utils.py sort` +## `utils nginx` **Usage**: ```console -$ utils.py sort [OPTIONS] COMMAND [ARGS]... +$ utils nginx [OPTIONS] COMMAND [ARGS]... ``` **Options**: @@ -45,78 +45,126 @@ $ utils.py sort [OPTIONS] COMMAND [ARGS]... **Commands**: -- `github`: Examples: $ utils.py sort github... -- `json` -- `url`: Examples: $ utils.py sort github... -- `yaml` +- `add` +- `disable` +- `enable` +- `list` + +### `utils nginx add` + +**Usage**: -### `utils.py sort github` +```console +$ utils nginx add [OPTIONS] DOMAIN +``` + +**Arguments**: -Examples: -$ utils.py sort github data/github.yaml > docs/awesome-github.md +- `DOMAIN`: [required] + +**Options**: + +- `--port INTEGER`: [default: 8000] +- `--nginx-dir DIRECTORY`: [default: /etc/nginx] +- `--help`: Show this message and exit. + +### `utils nginx disable` **Usage**: ```console -$ utils.py sort github [OPTIONS] [FILEPATH] COMMAND [ARGS]... +$ utils nginx disable [OPTIONS] DOMAIN ``` **Arguments**: -- `[FILEPATH]` +- `DOMAIN`: [required] **Options**: -- `-t, --token TEXT` +- `-d, --nginx-dir DIRECTORY`: [default: /etc/nginx] - `--help`: Show this message and exit. -### `utils.py sort json` +### `utils nginx enable` **Usage**: ```console -$ utils.py sort json [OPTIONS] FILEPATH COMMAND [ARGS]... +$ utils nginx enable [OPTIONS] DOMAIN ``` **Arguments**: -- `FILEPATH`: [required] +- `DOMAIN`: [required] **Options**: +- `-d, --nginx-dir DIRECTORY`: [default: /etc/nginx] - `--help`: Show this message and exit. -### `utils.py sort url` +### `utils nginx list` + +**Usage**: + +```console +$ utils nginx list [OPTIONS] +``` + +**Options**: + +- `-d, --nginx-dir DIRECTORY`: [default: /etc/nginx] +- `--help`: Show this message and exit. + +## `utils sort` + +**Usage**: + +```console +$ utils sort [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +- `--help`: Show this message and exit. + +**Commands**: + +- `github` +- `website` -Examples: -$ utils.py sort github data/github.yaml > docs/awesome-github.md +### `utils sort github` **Usage**: ```console -$ utils.py sort url [OPTIONS] [FILEPATH] COMMAND [ARGS]... +$ utils sort github [OPTIONS] DATA_FILEPATH ``` **Arguments**: -- `[FILEPATH]` +- `DATA_FILEPATH`: [required] **Options**: +- `-i, --in-place` +- `-m, --markdown FILE` +- `-t, --token TEXT`: [env var: GITHUB_TOKEN] - `--help`: Show this message and exit. -### `utils.py sort yaml` +### `utils sort website` **Usage**: ```console -$ utils.py sort yaml [OPTIONS] FILEPATH COMMAND [ARGS]... +$ utils sort website [OPTIONS] DATA_FILEPATH ``` **Arguments**: -- `FILEPATH`: [required] +- `DATA_FILEPATH`: [required] **Options**: +- `-i, --in-place` +- `-m, --markdown FILE` - `--help`: Show this message and exit. diff --git a/main.py b/main.py index 3b90cf57..9f643103 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -from utils.__main__ import app +from utils.cmd import app if __name__ == "__main__": app() diff --git a/poetry.lock b/poetry.lock index 6946a9a6..7c97b860 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "altgraph" @@ -26,14 +26,14 @@ files = [ [[package]] name = "beautifulsoup4" -version = "4.12.0" +version = "4.12.2" description = "Screen-scraping library" category = "main" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, - {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] [package.dependencies] @@ -84,7 +84,6 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -305,33 +304,48 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + [[package]] name = "cryptography" -version = "40.0.1" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:918cb89086c7d98b1b86b9fdb70c712e5a9325ba6f7d7cfb509e784e0cfc6917"}, - {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9618a87212cb5200500e304e43691111570e1f10ec3f35569fdfcd17e28fd797"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4805a4ca729d65570a1b7cac84eac1e431085d40387b7d3bbaa47e39890b88"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dac2d25c47f12a7b8aa60e528bfb3c51c5a6c5a9f7c86987909c6c79765554"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a4e3406cfed6b1f6d6e87ed243363652b2586b2d917b0609ca4f97072994405"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1e0af458515d5e4028aad75f3bb3fe7a31e46ad920648cd59b64d3da842e4356"}, - {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d8aa3609d337ad85e4eb9bb0f8bcf6e4409bfb86e706efa9a027912169e89122"}, - {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cf91e428c51ef692b82ce786583e214f58392399cf65c341bc7301d096fa3ba2"}, - {file = "cryptography-40.0.1-cp36-abi3-win32.whl", hash = "sha256:650883cc064297ef3676b1db1b7b1df6081794c4ada96fa457253c4cc40f97db"}, - {file = "cryptography-40.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a805a7bce4a77d51696410005b3e85ae2839bad9aa38894afc0aa99d8e0c3160"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd033d74067d8928ef00a6b1327c8ea0452523967ca4463666eeba65ca350d4c"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d36bbeb99704aabefdca5aee4eba04455d7a27ceabd16f3b3ba9bdcc31da86c4"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:32057d3d0ab7d4453778367ca43e99ddb711770477c4f072a51b3ca69602780a"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f5d7b79fa56bc29580faafc2ff736ce05ba31feaa9d4735048b0de7d9ceb2b94"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7c872413353c70e0263a9368c4993710070e70ab3e5318d85510cc91cce77e7c"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:28d63d75bf7ae4045b10de5413fb1d6338616e79015999ad9cf6fc538f772d41"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6f2bbd72f717ce33100e6467572abaedc61f1acb87b8d546001328d7f466b778"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cc3a621076d824d75ab1e1e530e66e7e8564e357dd723f2533225d40fe35c60c"}, - {file = "cryptography-40.0.1.tar.gz", hash = "sha256:2803f2f8b1e95f614419926c7e6f55d828afc614ca5ed61543877ae668cc3472"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, ] [package.dependencies] @@ -382,19 +396,19 @@ packaging = "*" [[package]] name = "filelock" -version = "3.10.7" +version = "3.12.0" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, - {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "ghp-import" @@ -704,14 +718,14 @@ files = [ [[package]] name = "mkdocs" -version = "1.4.2" +version = "1.4.3" description = "Project documentation with Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"}, - {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"}, + {file = "mkdocs-1.4.3-py3-none-any.whl", hash = "sha256:6ee46d309bda331aac915cd24aab882c179a933bd9e77b80ce7d2eaaa3f689dd"}, + {file = "mkdocs-1.4.3.tar.gz", hash = "sha256:5955093bbd4dd2e9403c5afaf57324ad8b04f16886512a3ee6ef828956481c57"}, ] [package.dependencies] @@ -768,14 +782,14 @@ pytz = "*" [[package]] name = "mkdocs-material" -version = "9.1.5" +version = "9.1.9" description = "Documentation that simply works" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs_material-9.1.5-py3-none-any.whl", hash = "sha256:981e1ef0250e2fbcc23610e9b20e5f242fe1f808079b9bcfbb6c49aa2999343c"}, - {file = "mkdocs_material-9.1.5.tar.gz", hash = "sha256:744519bca52b1e8fe7c2e80e15ed59baf8948111ec763ae6ae629c409bd16d6e"}, + {file = "mkdocs_material-9.1.9-py3-none-any.whl", hash = "sha256:7db24261cb17400e132c46d17eea712bfe71056d892a9beba32cf68210297141"}, + {file = "mkdocs_material-9.1.9.tar.gz", hash = "sha256:74d8da1371ab3a326868fe47bae3cbc4aa22e93c048b4ca5117e6817b88bd734"}, ] [package.dependencies] @@ -815,14 +829,14 @@ files = [ [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] @@ -851,45 +865,45 @@ files = [ [[package]] name = "pikepdf" -version = "7.1.2" +version = "7.2.0" description = "Read and write PDFs with Python, powered by qpdf" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pikepdf-7.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81950bde71eeaa1fbef72164cf4c78f408250bdb2346e4a69aebe1fe0631c47b"}, - {file = "pikepdf-7.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7b5c328dda0f0f3de4fbfbf3f1f68a85cb957eed00a4bd2f7683a465dc5b5a"}, - {file = "pikepdf-7.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51a9272db7a468476f74c39c0fa5dc6b501e298c709a4b8df8e4b393929d644a"}, - {file = "pikepdf-7.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21521fc51194869027edbdcaf46cf20396344518b122085133c68ddd1dd770f"}, - {file = "pikepdf-7.1.2-cp310-cp310-win32.whl", hash = "sha256:3d88c0ecbfd0df33144cbe348a765f9a82bcc86a7cf18fb19df0d9eab6186398"}, - {file = "pikepdf-7.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:7c7b8f74b144ee0c384a7b82e34d84da89821e0d3f0cf207c5af039c563dce06"}, - {file = "pikepdf-7.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4dd60ae07332b126a4d814955230f1852fcbd905ff72f1d3dde37ab7be192dfa"}, - {file = "pikepdf-7.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:641beb42fdf82cd15e079dd081ba410b54ea552ea81b884cc98885ac5541f73d"}, - {file = "pikepdf-7.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df2a99208cb426d675faaa578a96d6f9b76eee76cb473a267b9ae85078176443"}, - {file = "pikepdf-7.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2400574cf79481683f6ce537ee5d1d7925b71ff4d863a026246cbc34be8aeef0"}, - {file = "pikepdf-7.1.2-cp311-cp311-win32.whl", hash = "sha256:d75dfaf6df6e7394d7865878eaf9f2dca1900ebcf1ab9e681672a12d6c7b329b"}, - {file = "pikepdf-7.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:bb5ec2e06b3085413b69dbf3045a9a05a84d24ed8118221854c5465f6190ab35"}, - {file = "pikepdf-7.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de41f314fa61ab4d2368ab63b7e0f1ad72aab3115cfc90c8e123201fb5c2bcb5"}, - {file = "pikepdf-7.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3af17fac243f6e5fef49c57dc99f858957e4210f1b408e1433aa6be29bc49dfd"}, - {file = "pikepdf-7.1.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4122e2786d8a21eeb47cb9e2eb3a6fd758280e6b3e873844f44e01a3bb5fda1a"}, - {file = "pikepdf-7.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24719a4d1a154afb5fac55920154928f4a68e9c38e30ab0218c632f4fbf448cc"}, - {file = "pikepdf-7.1.2-cp38-cp38-win32.whl", hash = "sha256:966008bbe04ac3f282bc026e8f66903c254c048c01f8a5a06e4f55b4d36605df"}, - {file = "pikepdf-7.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:ca1a654a97d3d0f3340f934420c8c3a5522e43bb97ed25e31f06b618da9d64cd"}, - {file = "pikepdf-7.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17656a15b9ff5868869a79ff40765689a6705d2584e8ab63aff1d0365652b6f1"}, - {file = "pikepdf-7.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87b6a149e39598451d526493ec16f50b67ea899888ee96c14c1545eb1115c53"}, - {file = "pikepdf-7.1.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8a8d24fef8802899f8a6aa89ab2d119da7c6acfaa978bdfdc76854854680a7f"}, - {file = "pikepdf-7.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cca81a93b9486d98335b310fd1352ec62197bf9e3bf2774b822d5d862bde41"}, - {file = "pikepdf-7.1.2-cp39-cp39-win32.whl", hash = "sha256:db2e4e37a226aac13f6000b22612a8ccfb5764f34ad2b48c39eb38b3bb7cfb35"}, - {file = "pikepdf-7.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:1b64ae8d9b35713b317d7a4f429c14202ff9a2c5d63c8200b4fc1401e52c7e10"}, - {file = "pikepdf-7.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:09e142c484179873249f5c8fc50b8a5e66801feb81fc5111463b36b8396faf13"}, - {file = "pikepdf-7.1.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7cfd1bc95fdcece892b2506a9b9229d82a72845e74aa13c6e9578f767da41d1"}, - {file = "pikepdf-7.1.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e95d872385d7226f48ced00b2f56f1c6fd963d1729fa48baf697f6e98748163"}, - {file = "pikepdf-7.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5c5ec0c28b0b01aa5a306fc4be45e9948a4f9699f250c68495e279f02fdee0d0"}, - {file = "pikepdf-7.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1937f88458f183346d863cca71d9c4ea31792db38feba331fde8342473654330"}, - {file = "pikepdf-7.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98ccba51e3a0575d7ffaedc61b58fc10fca28151e2429825a36461253485f45d"}, - {file = "pikepdf-7.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac00e736ee8bc5e59ab7c72498bb895c43cd72bae3fa0cadc163663d578fefd4"}, - {file = "pikepdf-7.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e35056389134d8ed7d85dce798f9f4b498221c9b640fad4f8f2f8462aaade512"}, - {file = "pikepdf-7.1.2.tar.gz", hash = "sha256:b177e8437fe8efdfb7a30c57f361cae1bf2054117856459ca6565c94d32cb5b5"}, + {file = "pikepdf-7.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70f1161dd22ccfcbfd1c460873c95b68b79cf234f0a4e9f37cb565bf436fd85e"}, + {file = "pikepdf-7.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cc8d0be5a62ed9011bb519abc34907b5965b392995043719effc4b6a00e2052"}, + {file = "pikepdf-7.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d410028ef3435a459e55de520d29010ee91e4a40872d9eb2dab86e6730a24e9d"}, + {file = "pikepdf-7.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db8270c940f94d0049420f1a6c05b1f7d326d2abb20493c83f64fde3949404e"}, + {file = "pikepdf-7.2.0-cp310-cp310-win32.whl", hash = "sha256:ebc1b30d646ded58721a5594a5ca457e098fedfd9bcab28de79ad79a119e3537"}, + {file = "pikepdf-7.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6790cf10da642d72703cbe887afb923daa2e0f7cb9467a79fe449dbe228f8942"}, + {file = "pikepdf-7.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6670efe5b9c1548d60348cdd5ce84ca363a3cde22e9cf695f1ce3b3f818e498d"}, + {file = "pikepdf-7.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27a1aea4cae5484cffe4fc5fa761af11f384ca0fd4b2f9114f9ba9717fe4746"}, + {file = "pikepdf-7.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3c97acce9b66a41b2759dc30ef57de8f38c7239c9b0e7a5febc196b764a2567"}, + {file = "pikepdf-7.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7246789dd9071ebcf8c90baebe1eee34ac627e2ea22bf241eff31d32f5ca5df9"}, + {file = "pikepdf-7.2.0-cp311-cp311-win32.whl", hash = "sha256:9fadd1a99754dcd925e37721485d4d1259c7ad3c9073c6b3b0ed12c6e2d2234c"}, + {file = "pikepdf-7.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:26b9bfb99265dfb6deb72574f8cd30e7ffbc2f53237988bb4e167e18d813f510"}, + {file = "pikepdf-7.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b148959f1ad51d236cf6bbc5343beef72c4c60569151221ec06b1d787909222e"}, + {file = "pikepdf-7.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c30776791fad8d57a43c392d8e190afded857c61e49dac471ab74e9e716c441"}, + {file = "pikepdf-7.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e21bce4760c6e64c90b17601a8ce000219677adb264a3c038d2522de032169ca"}, + {file = "pikepdf-7.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:371eb23ac14e6c9947e59e5cea15ea93e61a5714c6b1f99fba948927809605ea"}, + {file = "pikepdf-7.2.0-cp38-cp38-win32.whl", hash = "sha256:f458c4161e76a882a15ade4125a2f92faa7e5ce120d2e6530dd995aa3308971c"}, + {file = "pikepdf-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a07f73f2aac48af46a546e285360d6e595b499075ab78c3b8ca9f5f13d9e876"}, + {file = "pikepdf-7.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dbe2b62e12ff2b47d4e56ebbe16697d0e25bc2c608f4ee5230cf179ebd2a8ab"}, + {file = "pikepdf-7.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7451f176eb9828d8dd7cb3d4e00d4e0aa7f7d7d00331fe640bc20cf3328deb5"}, + {file = "pikepdf-7.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99e483e037f6991be3c4c655454d57324c10ccf41960acd1edd899ebe9a314dd"}, + {file = "pikepdf-7.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3efe4dd2cb417f42865b11e6fc9adb1b6252241bd7a8d891afcaeb2191c285c2"}, + {file = "pikepdf-7.2.0-cp39-cp39-win32.whl", hash = "sha256:f325af78bfb63e305be7f31a3afea47fd33ba035ccb08e89d608d2e88b367349"}, + {file = "pikepdf-7.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d0698a429948e613f810b487318ce88112bc71a67fd76645be140532130e6c86"}, + {file = "pikepdf-7.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:677f04f02535ac398806970544c43c1e2b120d82b027437c467923a16c81d528"}, + {file = "pikepdf-7.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc6a653f0f98076a1e86e4fe58fe36dcf403963ae55c65bfcd28aa1d2d9b1b18"}, + {file = "pikepdf-7.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5155e1127dfe3aacf77a33552f128e9c04e8b61bf585ab2b155d062a524bfd06"}, + {file = "pikepdf-7.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c99838e86c0fc5a215a0588011344477e8f6ec2c5faf48ee3a9da1ba2c2cac5b"}, + {file = "pikepdf-7.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b24b7520c7f40bba4f437ba5111dca99dbd0cca9d3cab0f0a33afa6150091ee3"}, + {file = "pikepdf-7.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4559941b359beb0e90b7d0b8016397ab4700f075f7aa11f2561958a7ce0f8ea"}, + {file = "pikepdf-7.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a150160f7ed97769f3c0e60de5cb031bce04e1f6708916ac1c936774a65cc0c"}, + {file = "pikepdf-7.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0e1607fda03a53a29a4a8e3fbacbde788804c78167ff251e1c1006f89539f306"}, + {file = "pikepdf-7.2.0.tar.gz", hash = "sha256:ad82b836faed0376c725e19d0f8a7c7bef389e8c46683c11bbfc70410bc2e3ee"}, ] [package.dependencies] @@ -985,19 +999,19 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, + {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pycparser" @@ -1031,14 +1045,14 @@ requests = ">=2.14.0" [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -1046,24 +1060,24 @@ plugins = ["importlib-metadata"] [[package]] name = "pyinstaller" -version = "5.9.0" +version = "5.10.1" description = "PyInstaller bundles a Python application and all its dependencies into a single package." category = "dev" optional = false python-versions = "<3.12,>=3.7" files = [ - {file = "pyinstaller-5.9.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:93d7e8443a6b60745d42aa50f08730f6b419410832b4c616c4f1bb315f087661"}, - {file = "pyinstaller-5.9.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3b2c34c3c3ddf38f68d9f5afbed82abe0f89d53014c56892326fef10172ee652"}, - {file = "pyinstaller-5.9.0-py3-none-manylinux2014_i686.whl", hash = "sha256:dcd348b174fd72c4df271790ac582969c9423cb099fe92db9ec131a8a9243d5a"}, - {file = "pyinstaller-5.9.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:4b21b0298db44f5f07fc04d8ff81ec31efa47b72798efaecc4e811c50a102111"}, - {file = "pyinstaller-5.9.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:12ca6567be457826e14416637ea54485a185d0ce7a5a044df0d0daf588fff6d1"}, - {file = "pyinstaller-5.9.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c7dd156c2438f197c168b990bbce03c97d3fb758dd9bbc3ca93626c2f4473a47"}, - {file = "pyinstaller-5.9.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:2ba42038b3bd83e1fba7c8eb9e7cde43bd5938e37ca542c89e8779355d213f52"}, - {file = "pyinstaller-5.9.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d1ff94347183ae3755cfb8f02e64744eb7fe384469bd61e453c6ff59a81665d6"}, - {file = "pyinstaller-5.9.0-py3-none-win32.whl", hash = "sha256:8476538aec8a0a3be4f74b93388bd6989b91cc437ff86d6f0d3a68961176dce6"}, - {file = "pyinstaller-5.9.0-py3-none-win_amd64.whl", hash = "sha256:e7a4c292810285c2466f3bdcb1e03ba2170177ebe3d7054ff1af3bb348bf61a4"}, - {file = "pyinstaller-5.9.0-py3-none-win_arm64.whl", hash = "sha256:6cf6c032c72ef78fd9aa5e47d8952e784db45b2c3f7862bd44a99df68c216f64"}, - {file = "pyinstaller-5.9.0.tar.gz", hash = "sha256:2bde16a8d664e8eba9aa7b84f729f7ab005c1793be4fe1986b3c9cad6c486622"}, + {file = "pyinstaller-5.10.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:247b99c52dc3cf69eba905da30dbca0a8ea309e1058cab44658ac838d9b8f2f0"}, + {file = "pyinstaller-5.10.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:2d16641a495593d174504263b038a6d3d46b3b15a381ccb216cf6cce67723512"}, + {file = "pyinstaller-5.10.1-py3-none-manylinux2014_i686.whl", hash = "sha256:df97aaf1103a1c485aa3c9947792a86675e370f5ce9b436b4a84e34a4180c8d2"}, + {file = "pyinstaller-5.10.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:333b4ffda38d9c0a561c38429dd9848d37aa78f3b8ea8a6f2b2e69a60d523c02"}, + {file = "pyinstaller-5.10.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:6afc7aa4885ffd3e6121a8cf2138830099f874c18cb5869bed8c1a42db82d060"}, + {file = "pyinstaller-5.10.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:85e39e36d03355423636907a26a9bfa06fdc93cb1086441b19d2d0ca448479fa"}, + {file = "pyinstaller-5.10.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:7a1db833bb0302b66ae3ae337fbd5487699658ce869ca4d538b5359b8179e83a"}, + {file = "pyinstaller-5.10.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:bb7de35cd209a0a0358aec761a273ae951d2161c03728f15d9a640d06a88e472"}, + {file = "pyinstaller-5.10.1-py3-none-win32.whl", hash = "sha256:9e9a38f41f8280c8e29b294716992852281b41fbe64ba330ebab671efe27b26d"}, + {file = "pyinstaller-5.10.1-py3-none-win_amd64.whl", hash = "sha256:915a502802c751bafd92d568ac57468ec6cdf252b8308aa9a167bbc2c565ad2d"}, + {file = "pyinstaller-5.10.1-py3-none-win_arm64.whl", hash = "sha256:f677fbc151db1eb00ada94e86ed128e7b359cbd6bf3f6ea815afdde687692d46"}, + {file = "pyinstaller-5.10.1.tar.gz", hash = "sha256:6ecc464bf56919bf2d6bff275f38d85ff08ae747b8ead3a0c26cf85573b3c723"}, ] [package.dependencies] @@ -1080,14 +1094,14 @@ hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] [[package]] name = "pyinstaller-hooks-contrib" -version = "2023.1" +version = "2023.2" description = "Community maintained hooks for PyInstaller" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pyinstaller-hooks-contrib-2023.1.tar.gz", hash = "sha256:ab56c192e7cd4472ff6b840cda4fc42bceccc7fb4234f064fc834a3248c0afdd"}, - {file = "pyinstaller_hooks_contrib-2023.1-py2.py3-none-any.whl", hash = "sha256:d2ea40a7105651aa525bfe5fe309aa264d4d9bb49f839b862243dcf0a56c34cd"}, + {file = "pyinstaller-hooks-contrib-2023.2.tar.gz", hash = "sha256:7fb856a81fd06a717188a3175caa77e902035cc067b00b583c6409c62497b23f"}, + {file = "pyinstaller_hooks_contrib-2023.2-py2.py3-none-any.whl", hash = "sha256:e02c5f0ee3d4f5814588c2128caf5036c058ba764aaf24d957bb5311ad8690ad"}, ] [[package]] @@ -1113,14 +1127,14 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" -version = "9.10" +version = "9.11" description = "Extension pack for Python Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-9.10-py3-none-any.whl", hash = "sha256:31eaa76ce6f96aabfcea98787c2fff2c5c0611b20a53a94213970cfbf05f02b8"}, - {file = "pymdown_extensions-9.10.tar.gz", hash = "sha256:562c38eee4ce3f101ce631b804bfc2177a8a76c7e4dc908871fb6741a90257a7"}, + {file = "pymdown_extensions-9.11-py3-none-any.whl", hash = "sha256:a499191d8d869f30339de86fcf072a787e86c42b6f16f280f5c2cf174182b7f3"}, + {file = "pymdown_extensions-9.11.tar.gz", hash = "sha256:f7e86c1d3981f23d9dc43294488ecb54abadd05b0be4bf8f0e15efc90f7853ff"}, ] [package.dependencies] @@ -1260,84 +1274,112 @@ pyyaml = "*" [[package]] name = "regex" -version = "2023.3.23" +version = "2023.5.5" description = "Alternative regular expression module, to replace re." category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "regex-2023.3.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:845a5e2d84389c4ddada1a9b95c055320070f18bb76512608374aca00d22eca8"}, - {file = "regex-2023.3.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87d9951f5a538dd1d016bdc0dcae59241d15fa94860964833a54d18197fcd134"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae17d3be44c0b3f782c28ae9edd8b47c1f1776d4cabe87edc0b98e1f12b021"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b8eb1e3bca6b48dc721818a60ae83b8264d4089a4a41d62be6d05316ec38e15"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df45fac182ebc3c494460c644e853515cc24f5ad9da05f8ffb91da891bfee879"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7006105b10b59971d3b248ad75acc3651c7e4cf54d81694df5a5130a3c3f7ea"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93f3f1aa608380fe294aa4cb82e2afda07a7598e828d0341e124b8fd9327c715"}, - {file = "regex-2023.3.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787954f541ab95d8195d97b0b8cf1dc304424adb1e07365967e656b92b38a699"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20abe0bdf03630fe92ccafc45a599bca8b3501f48d1de4f7d121153350a2f77d"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11d00c31aeab9a6e0503bc77e73ed9f4527b3984279d997eb145d7c7be6268fd"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d5bbe0e1511b844794a3be43d6c145001626ba9a6c1db8f84bdc724e91131d9d"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ea3c0cb56eadbf4ab2277e7a095676370b3e46dbfc74d5c383bd87b0d6317910"}, - {file = "regex-2023.3.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d895b4c863059a4934d3e874b90998df774644a41b349ebb330f85f11b4ef2c0"}, - {file = "regex-2023.3.23-cp310-cp310-win32.whl", hash = "sha256:9d764514d19b4edcc75fd8cb1423448ef393e8b6cbd94f38cab983ab1b75855d"}, - {file = "regex-2023.3.23-cp310-cp310-win_amd64.whl", hash = "sha256:11d1f2b7a0696dc0310de0efb51b1f4d813ad4401fe368e83c0c62f344429f98"}, - {file = "regex-2023.3.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a9c63cde0eaa345795c0fdeb19dc62d22e378c50b0bc67bf4667cd5b482d98b"}, - {file = "regex-2023.3.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dd7200b4c27b68cf9c9646da01647141c6db09f48cc5b51bc588deaf8e98a797"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22720024b90a6ba673a725dcc62e10fb1111b889305d7c6b887ac7466b74bedb"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b190a339090e6af25f4a5fd9e77591f6d911cc7b96ecbb2114890b061be0ac1"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e76b6fc0d8e9efa39100369a9b3379ce35e20f6c75365653cf58d282ad290f6f"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b8f218bf69a2a15402fde08b08712213a1f4b85a156d90473a6fb6b12b09"}, - {file = "regex-2023.3.23-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2472428efc4127374f494e570e36b30bb5e6b37d9a754f7667f7073e43b0abdd"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c37df2a060cb476d94c047b18572ee2b37c31f831df126c0da3cd9227b39253d"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4479f9e2abc03362df4045b1332d4a2b7885b245a30d4f4b051c4083b97d95d8"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2396e0678167f2d0c197da942b0b3fb48fee2f0b5915a0feb84d11b6686afe6"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75f288c60232a5339e0ff2fa05779a5e9c74e9fc085c81e931d4a264501e745b"}, - {file = "regex-2023.3.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c869260aa62cee21c5eb171a466c0572b5e809213612ef8d495268cd2e34f20d"}, - {file = "regex-2023.3.23-cp311-cp311-win32.whl", hash = "sha256:25f0532fd0c53e96bad84664171969de9673b4131f2297f1db850d3918d58858"}, - {file = "regex-2023.3.23-cp311-cp311-win_amd64.whl", hash = "sha256:5ccfafd98473e007cebf7da10c1411035b7844f0f204015efd050601906dbb53"}, - {file = "regex-2023.3.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6572ff287176c0fb96568adb292674b421fa762153ed074d94b1d939ed92c253"}, - {file = "regex-2023.3.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a610e0adfcb0fc84ea25f6ea685e39e74cbcd9245a72a9a7aab85ff755a5ed27"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086afe222d58b88b62847bdbd92079b4699350b4acab892f88a935db5707c790"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79e29fd62fa2f597a6754b247356bda14b866131a22444d67f907d6d341e10f3"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c07ce8e9eee878a48ebeb32ee661b49504b85e164b05bebf25420705709fdd31"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b036f401895e854de9fefe061518e78d506d8a919cc250dc3416bca03f6f9a"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78ac8dd8e18800bb1f97aad0d73f68916592dddf233b99d2b5cabc562088503a"}, - {file = "regex-2023.3.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:539dd010dc35af935b32f248099e38447bbffc10b59c2b542bceead2bed5c325"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9bf4a5626f2a0ea006bf81e8963f498a57a47d58907eaa58f4b3e13be68759d8"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf86b4328c204c3f315074a61bc1c06f8a75a8e102359f18ce99fbcbbf1951f0"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2848bf76673c83314068241c8d5b7fa9ad9bed866c979875a0e84039349e8fa7"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c125a02d22c555e68f7433bac8449992fa1cead525399f14e47c2d98f2f0e467"}, - {file = "regex-2023.3.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cd1671e9d5ac05ce6aa86874dd8dfa048824d1dbe73060851b310c6c1a201a96"}, - {file = "regex-2023.3.23-cp38-cp38-win32.whl", hash = "sha256:fffe57312a358be6ec6baeb43d253c36e5790e436b7bf5b7a38df360363e88e9"}, - {file = "regex-2023.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:dbb3f87e15d3dd76996d604af8678316ad2d7d20faa394e92d9394dfd621fd0c"}, - {file = "regex-2023.3.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c88e8c226473b5549fe9616980ea7ca09289246cfbdf469241edf4741a620004"}, - {file = "regex-2023.3.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6560776ec19c83f3645bbc5db64a7a5816c9d8fb7ed7201c5bcd269323d88072"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b1fc2632c01f42e06173d8dd9bb2e74ab9b0afa1d698058c867288d2c7a31f3"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdf7ad455f1916b8ea5cdbc482d379f6daf93f3867b4232d14699867a5a13af7"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fc33b27b1d800fc5b78d7f7d0f287e35079ecabe68e83d46930cf45690e1c8c"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c49552dc938e3588f63f8a78c86f3c9c75301e813bca0bef13bdb4b87ccf364"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e152461e9a0aedec7d37fc66ec0fa635eca984777d3d3c3e36f53bf3d3ceb16e"}, - {file = "regex-2023.3.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db034255e72d2995cf581b14bb3fc9c00bdbe6822b49fcd4eef79e1d5f232618"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:55ae114da21b7a790b90255ea52d2aa3a0d121a646deb2d3c6a3194e722fc762"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ef3f528fe1cc3d139508fe1b22523745aa77b9d6cb5b0bf277f48788ee0b993f"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:a81c9ec59ca2303acd1ccd7b9ac409f1e478e40e96f8f79b943be476c5fdb8bb"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cde09c4fdd070772aa2596d97e942eb775a478b32459e042e1be71b739d08b77"}, - {file = "regex-2023.3.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3cd9f5dd7b821f141d3a6ca0d5d9359b9221e4f051ca3139320adea9f1679691"}, - {file = "regex-2023.3.23-cp39-cp39-win32.whl", hash = "sha256:7304863f3a652dab5e68e6fb1725d05ebab36ec0390676d1736e0571ebb713ef"}, - {file = "regex-2023.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:54c3fa855a3f7438149de3211738dd9b5f0c733f48b54ae05aa7fce83d48d858"}, - {file = "regex-2023.3.23.tar.gz", hash = "sha256:dc80df325b43ffea5cdea2e3eaa97a44f3dd298262b1c7fe9dbb2a9522b956a7"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48c9ec56579d4ba1c88f42302194b8ae2350265cb60c64b7b9a88dcb7fbde309"}, + {file = "regex-2023.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f4541550459c08fdd6f97aa4e24c6f1932eec780d58a2faa2068253df7d6ff"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e22e4460f0245b468ee645156a4f84d0fc35a12d9ba79bd7d79bdcd2f9629d"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b870b6f632fc74941cadc2a0f3064ed8409e6f8ee226cdfd2a85ae50473aa94"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:171c52e320fe29260da550d81c6b99f6f8402450dc7777ef5ced2e848f3b6f8f"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad5524c2aedaf9aa14ef1bc9327f8abd915699dea457d339bebbe2f0d218f86"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0f874ee8c0bc820e649c900243c6d1e6dc435b81da1492046716f14f1a2a96"}, + {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e645c757183ee0e13f0bbe56508598e2d9cd42b8abc6c0599d53b0d0b8dd1479"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a4c5da39bca4f7979eefcbb36efea04471cd68db2d38fcbb4ee2c6d440699833"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5e3f4468b8c6fd2fd33c218bbd0a1559e6a6fcf185af8bb0cc43f3b5bfb7d636"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:59e4b729eae1a0919f9e4c0fc635fbcc9db59c74ad98d684f4877be3d2607dd6"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ba73a14e9c8f9ac409863543cde3290dba39098fc261f717dc337ea72d3ebad2"}, + {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bbd5dcb19603ab8d2781fac60114fb89aee8494f4505ae7ad141a3314abb1f9"}, + {file = "regex-2023.5.5-cp310-cp310-win32.whl", hash = "sha256:40005cbd383438aecf715a7b47fe1e3dcbc889a36461ed416bdec07e0ef1db66"}, + {file = "regex-2023.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:59597cd6315d3439ed4b074febe84a439c33928dd34396941b4d377692eca810"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f08276466fedb9e36e5193a96cb944928301152879ec20c2d723d1031cd4ddd"}, + {file = "regex-2023.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd46f30e758629c3ee91713529cfbe107ac50d27110fdcc326a42ce2acf4dafc"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2910502f718828cecc8beff004917dcf577fc5f8f5dd40ffb1ea7612124547b"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:445d6f4fc3bd9fc2bf0416164454f90acab8858cd5a041403d7a11e3356980e8"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18196c16a584619c7c1d843497c069955d7629ad4a3fdee240eb347f4a2c9dbe"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d430a23b661629661f1fe8395be2004006bc792bb9fc7c53911d661b69dd7e"}, + {file = "regex-2023.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a28979cc667e5f82ef433db009184e7ac277844eea0f7f4d254b789517941d"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f764e4dfafa288e2eba21231f455d209f4709436baeebb05bdecfb5d8ddc3d35"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23d86ad2121b3c4fc78c58f95e19173790e22ac05996df69b84e12da5816cb17"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:690a17db524ee6ac4a27efc5406530dd90e7a7a69d8360235323d0e5dafb8f5b"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1ecf3dcff71f0c0fe3e555201cbe749fa66aae8d18f80d2cc4de8e66df37390a"}, + {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811040d7f3dd9c55eb0d8b00b5dcb7fd9ae1761c454f444fd9f37fe5ec57143a"}, + {file = "regex-2023.5.5-cp311-cp311-win32.whl", hash = "sha256:c8c143a65ce3ca42e54d8e6fcaf465b6b672ed1c6c90022794a802fb93105d22"}, + {file = "regex-2023.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:586a011f77f8a2da4b888774174cd266e69e917a67ba072c7fc0e91878178a80"}, + {file = "regex-2023.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b6365703e8cf1644b82104cdd05270d1a9f043119a168d66c55684b1b557d008"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a56c18f21ac98209da9c54ae3ebb3b6f6e772038681d6cb43b8d53da3b09ee81"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b942d8b3ce765dbc3b1dad0a944712a89b5de290ce8f72681e22b3c55f3cc8"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:844671c9c1150fcdac46d43198364034b961bd520f2c4fdaabfc7c7d7138a2dd"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ce65bdeaf0a386bb3b533a28de3994e8e13b464ac15e1e67e4603dd88787fa"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fee0016cc35a8a91e8cc9312ab26a6fe638d484131a7afa79e1ce6165328a135"}, + {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18f05d14f14a812fe9723f13afafefe6b74ca042d99f8884e62dbd34dcccf3e2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:941b3f1b2392f0bcd6abf1bc7a322787d6db4e7457be6d1ffd3a693426a755f2"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:921473a93bcea4d00295799ab929522fc650e85c6b9f27ae1e6bb32a790ea7d3"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:e2205a81f815b5bb17e46e74cc946c575b484e5f0acfcb805fb252d67e22938d"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:385992d5ecf1a93cb85adff2f73e0402dd9ac29b71b7006d342cc920816e6f32"}, + {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:890a09cb0a62198bff92eda98b2b507305dd3abf974778bae3287f98b48907d3"}, + {file = "regex-2023.5.5-cp36-cp36m-win32.whl", hash = "sha256:821a88b878b6589c5068f4cc2cfeb2c64e343a196bc9d7ac68ea8c2a776acd46"}, + {file = "regex-2023.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:7918a1b83dd70dc04ab5ed24c78ae833ae8ea228cef84e08597c408286edc926"}, + {file = "regex-2023.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:338994d3d4ca4cf12f09822e025731a5bdd3a37aaa571fa52659e85ca793fb67"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a69cf0c00c4d4a929c6c7717fd918414cab0d6132a49a6d8fc3ded1988ed2ea"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f5e06df94fff8c4c85f98c6487f6636848e1dc85ce17ab7d1931df4a081f657"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8906669b03c63266b6a7693d1f487b02647beb12adea20f8840c1a087e2dfb5"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fda3e50abad8d0f48df621cf75adc73c63f7243cbe0e3b2171392b445401550"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac2b7d341dc1bd102be849d6dd33b09701223a851105b2754339e390be0627a"}, + {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb2b495dd94b02de8215625948132cc2ea360ae84fe6634cd19b6567709c8ae2"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aa7d032c1d84726aa9edeb6accf079b4caa87151ca9fabacef31fa028186c66d"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d45864693351c15531f7e76f545ec35000d50848daa833cead96edae1665559"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21e90a288e6ba4bf44c25c6a946cb9b0f00b73044d74308b5e0afd190338297c"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:10250a093741ec7bf74bcd2039e697f519b028518f605ff2aa7ac1e9c9f97423"}, + {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b8d0c153f07a953636b9cdb3011b733cadd4178123ef728ccc4d5969e67f3c2"}, + {file = "regex-2023.5.5-cp37-cp37m-win32.whl", hash = "sha256:10374c84ee58c44575b667310d5bbfa89fb2e64e52349720a0182c0017512f6c"}, + {file = "regex-2023.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9b320677521aabf666cdd6e99baee4fb5ac3996349c3b7f8e7c4eee1c00dfe3a"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:afb1c70ec1e594a547f38ad6bf5e3d60304ce7539e677c1429eebab115bce56e"}, + {file = "regex-2023.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf123225945aa58b3057d0fba67e8061c62d14cc8a4202630f8057df70189051"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99757ad7fe5c8a2bb44829fc57ced11253e10f462233c1255fe03888e06bc19"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a623564d810e7a953ff1357f7799c14bc9beeab699aacc8b7ab7822da1e952b8"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced02e3bd55e16e89c08bbc8128cff0884d96e7f7a5633d3dc366b6d95fcd1d6"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cbe6b5be3b9b698d8cc4ee4dee7e017ad655e83361cd0ea8e653d65e469468"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a6e4b0e0531223f53bad07ddf733af490ba2b8367f62342b92b39b29f72735a"}, + {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e9c4f778514a560a9c9aa8e5538bee759b55f6c1dcd35613ad72523fd9175b8"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:256f7f4c6ba145f62f7a441a003c94b8b1af78cee2cccacfc1e835f93bc09426"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd7b68fd2e79d59d86dcbc1ccd6e2ca09c505343445daaa4e07f43c8a9cc34da"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4a5059bd585e9e9504ef9c07e4bc15b0a621ba20504388875d66b8b30a5c4d18"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6893544e06bae009916a5658ce7207e26ed17385149f35a3125f5259951f1bbe"}, + {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c64d5abe91a3dfe5ff250c6bb267ef00dbc01501518225b45a5f9def458f31fb"}, + {file = "regex-2023.5.5-cp38-cp38-win32.whl", hash = "sha256:7923470d6056a9590247ff729c05e8e0f06bbd4efa6569c916943cb2d9b68b91"}, + {file = "regex-2023.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:4035d6945cb961c90c3e1c1ca2feb526175bcfed44dfb1cc77db4fdced060d3e"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50fd2d9b36938d4dcecbd684777dd12a407add4f9f934f235c66372e630772b0"}, + {file = "regex-2023.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d19e57f888b00cd04fc38f5e18d0efbd91ccba2d45039453ab2236e6eec48d4d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd966475e963122ee0a7118ec9024388c602d12ac72860f6eea119a3928be053"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db09e6c18977a33fea26fe67b7a842f706c67cf8bda1450974d0ae0dd63570df"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6164d4e2a82f9ebd7752a06bd6c504791bedc6418c0196cd0a23afb7f3e12b2d"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84397d3f750d153ebd7f958efaa92b45fea170200e2df5e0e1fd4d85b7e3f58a"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3efee9bb53cbe7b285760c81f28ac80dc15fa48b5fe7e58b52752e642553f1"}, + {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:144b5b017646b5a9392a5554a1e5db0000ae637be4971c9747566775fc96e1b2"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1189fbbb21e2c117fda5303653b61905aeeeea23de4a94d400b0487eb16d2d60"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f83fe9e10f9d0b6cf580564d4d23845b9d692e4c91bd8be57733958e4c602956"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:72aa4746993a28c841e05889f3f1b1e5d14df8d3daa157d6001a34c98102b393"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:de2f780c3242ea114dd01f84848655356af4dd561501896c751d7b885ea6d3a1"}, + {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:290fd35219486dfbc00b0de72f455ecdd63e59b528991a6aec9fdfc0ce85672e"}, + {file = "regex-2023.5.5-cp39-cp39-win32.whl", hash = "sha256:732176f5427e72fa2325b05c58ad0b45af341c459910d766f814b0584ac1f9ac"}, + {file = "regex-2023.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:1307aa4daa1cbb23823d8238e1f61292fd07e4e5d8d38a6efff00b67a7cdb764"}, + {file = "regex-2023.5.5.tar.gz", hash = "sha256:7d76a8a1fc9da08296462a18f16620ba73bcbf5909e42383b253ef34d9d5141e"}, ] [[package]] name = "requests" -version = "2.28.2" +version = "2.29.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.29.0-py3-none-any.whl", hash = "sha256:e8f3c9be120d3333921d213eef078af392fba3933ab7ed2d1cba3b56f2568c3b"}, + {file = "requests-2.29.0.tar.gz", hash = "sha256:f2e34a75f4749019bb0e3effb66683630e4ffeaf75819fb51bebef1bf5aef059"}, ] [package.dependencies] @@ -1366,16 +1408,35 @@ files = [ requests = ">=1.0.0" six = "*" +[[package]] +name = "rich" +version = "12.6.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.6.3,<4.0.0" +files = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, +] + +[package.dependencies] +commonmark = ">=0.9.0,<0.10.0" +pygments = ">=2.6.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] + [[package]] name = "setuptools" -version = "67.6.1" +version = "67.7.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, - {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, ] [package.extras] @@ -1383,6 +1444,18 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "shellingham" +version = "1.4.0" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" +files = [ + {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, + {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, +] + [[package]] name = "six" version = "1.16.0" @@ -1409,26 +1482,26 @@ files = [ [[package]] name = "soupsieve" -version = "2.4" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] name = "tldextract" -version = "3.4.0" +version = "3.4.1" description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tldextract-3.4.0-py3-none-any.whl", hash = "sha256:47aa4d8f1a4da79a44529c9a2ddc518663b25d371b805194ec5ce2a5f615ccd2"}, - {file = "tldextract-3.4.0.tar.gz", hash = "sha256:78aef13ac1459d519b457a03f1f74c1bf1c2808122a6bcc0e6840f81ba55ad73"}, + {file = "tldextract-3.4.1-py3-none-any.whl", hash = "sha256:26f646987b01ae2946e7491cce4aaf54129f3489a196a274e6c843ec72968313"}, + {file = "tldextract-3.4.1.tar.gz", hash = "sha256:fa9e50c4a03bede2a1d95dca620d661678484626858ccf388cf9671a0dd497a4"}, ] [package.dependencies] @@ -1437,18 +1510,6 @@ idna = "*" requests = ">=2.1.0" requests-file = ">=1.4" -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - [[package]] name = "typer" version = "0.7.0" @@ -1463,6 +1524,9 @@ files = [ [package.dependencies] click = ">=7.1.1,<9.0.0" +colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} +rich = {version = ">=10.11.0,<13.0.0", optional = true, markers = "extra == \"all\""} +shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} [package.extras] all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] @@ -1470,6 +1534,23 @@ dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2 doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +[[package]] +name = "typer-cli" +version = "0.0.13" +description = "Run Typer scripts with completion, without having to create a package, using Typer CLI." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer_cli-0.0.13-py3-none-any.whl", hash = "sha256:5ae0f99dce8f8f9669137a2c98eb42485cd4412e0ec225c8eb29ce8ac3378731"}, + {file = "typer_cli-0.0.13.tar.gz", hash = "sha256:f5b85764e56fb3fe835ed008ad5bc7db4961f7bcce1f1c1698ac46b6c5d9b86f"}, +] + +[package.dependencies] +colorama = ">=0.4.3,<=0.5.0" +shellingham = ">=1.3.2,<=1.4.0" +typer = ">=0.4.0,<=0.7.0" + [[package]] name = "urllib3" version = "1.26.15" @@ -1632,5 +1713,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = ">=3.10,<3.12" -content-hash = "c184e7f5644e2af4c2b617bcae5cbcf710b8ed599e226c2ebcf07486699c27aa" +python-versions = ">=3.11,<3.12" +content-hash = "de03e8591fc343654a4391d773bf7b679133d712f8c1b334f00aade778e9d3d1" diff --git a/pyproject.toml b/pyproject.toml index b851252f..d1aa33be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,9 +2,6 @@ build-backend = "poetry.core.masonry.api" requires = ["poetry-core"] -[tool.isort] -profile = "black" - [tool.poetry] authors = ["liblaf "] description = "" @@ -17,23 +14,24 @@ version = "0.2.1" [tool.poetry.dependencies] pygithub = "^1.58.1" -python = ">=3.10,<3.12" +python = ">=3.11,<3.12" pyyaml = "^6.0" -typer = "^0.7.0" -tldextract = "^3.4.0" +tldextract = "^3.4.1" +typer = { extras = ["all"], version = "^0.7.0" } urltitle = "^0.3.8" [tool.poetry.group.dev.dependencies] black = "^23.3.0" isort = "^5.12.0" -pyinstaller = "^5.9.0" +pyinstaller = "^5.10.1" +typer-cli = "^0.0.13" [tool.poetry.group.docs.dependencies] lxml = "^4.9.2" -mkdocs = "^1.4.2" -mkdocs-git-committers-plugin-2 = "^1.1.1" +mkdocs = "^1.4.3" +mkdocs-git-committers-plugin-2 = "^1.1.2" mkdocs-git-revision-date-localized-plugin = "^1.2.0" -mkdocs-material = "^9.1.5" +mkdocs-material = "^9.1.9" [tool.poetry.scripts] -"utils.py" = "utils.__main__:app" +utils = "utils.cmd:app" diff --git a/requirements.txt b/requirements.txt index 24bca9bd..337cc853 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,31 +1,35 @@ -beautifulsoup4==4.12.0 ; python_version >= "3.10" and python_version < "3.12" -cachetools==5.3.0 ; python_version >= "3.10" and python_version < "3.12" -certifi==2022.12.7 ; python_version >= "3.10" and python_version < "3.12" -cffi==1.15.1 ; python_version >= "3.10" and python_version < "3.12" -charset-normalizer==3.1.0 ; python_version >= "3.10" and python_version < "3.12" -click==8.1.3 ; python_version >= "3.10" and python_version < "3.12" -colorama==0.4.6 ; python_version >= "3.10" and python_version < "3.12" and platform_system == "Windows" -cryptography==40.0.1 ; python_version >= "3.10" and python_version < "3.12" -deprecated==1.2.13 ; python_version >= "3.10" and python_version < "3.12" -deprecation==2.1.0 ; python_version >= "3.10" and python_version < "3.12" -filelock==3.10.7 ; python_version >= "3.10" and python_version < "3.12" -humanize==4.6.0 ; python_version >= "3.10" and python_version < "3.12" -idna==3.4 ; python_version >= "3.10" and python_version < "3.12" -lxml==4.9.2 ; python_version >= "3.10" and python_version < "3.12" -packaging==23.0 ; python_version >= "3.10" and python_version < "3.12" -pikepdf==7.1.2 ; python_version >= "3.10" and python_version < "3.12" -pillow==9.5.0 ; python_version >= "3.10" and python_version < "3.12" -pycparser==2.21 ; python_version >= "3.10" and python_version < "3.12" -pygithub==1.58.1 ; python_version >= "3.10" and python_version < "3.12" -pyjwt[crypto]==2.6.0 ; python_version >= "3.10" and python_version < "3.12" -pynacl==1.5.0 ; python_version >= "3.10" and python_version < "3.12" -pyyaml==6.0 ; python_version >= "3.10" and python_version < "3.12" -requests-file==1.5.1 ; python_version >= "3.10" and python_version < "3.12" -requests==2.28.2 ; python_version >= "3.10" and python_version < "3.12" -six==1.16.0 ; python_version >= "3.10" and python_version < "3.12" -soupsieve==2.4 ; python_version >= "3.10" and python_version < "3.12" -tldextract==3.4.0 ; python_version >= "3.10" and python_version < "3.12" -typer==0.7.0 ; python_version >= "3.10" and python_version < "3.12" -urllib3==1.26.15 ; python_version >= "3.10" and python_version < "3.12" -urltitle==0.3.8 ; python_version >= "3.10" and python_version < "3.12" -wrapt==1.15.0 ; python_version >= "3.10" and python_version < "3.12" +beautifulsoup4==4.12.2 ; python_version >= "3.11" and python_version < "3.12" +cachetools==5.3.0 ; python_version >= "3.11" and python_version < "3.12" +certifi==2022.12.7 ; python_version >= "3.11" and python_version < "3.12" +cffi==1.15.1 ; python_version >= "3.11" and python_version < "3.12" +charset-normalizer==3.1.0 ; python_version >= "3.11" and python_version < "3.12" +click==8.1.3 ; python_version >= "3.11" and python_version < "3.12" +colorama==0.4.6 ; python_version >= "3.11" and python_version < "3.12" +commonmark==0.9.1 ; python_version >= "3.11" and python_version < "3.12" +cryptography==40.0.2 ; python_version >= "3.11" and python_version < "3.12" +deprecated==1.2.13 ; python_version >= "3.11" and python_version < "3.12" +deprecation==2.1.0 ; python_version >= "3.11" and python_version < "3.12" +filelock==3.12.0 ; python_version >= "3.11" and python_version < "3.12" +humanize==4.6.0 ; python_version >= "3.11" and python_version < "3.12" +idna==3.4 ; python_version >= "3.11" and python_version < "3.12" +lxml==4.9.2 ; python_version >= "3.11" and python_version < "3.12" +packaging==23.1 ; python_version >= "3.11" and python_version < "3.12" +pikepdf==7.2.0 ; python_version >= "3.11" and python_version < "3.12" +pillow==9.5.0 ; python_version >= "3.11" and python_version < "3.12" +pycparser==2.21 ; python_version >= "3.11" and python_version < "3.12" +pygithub==1.58.1 ; python_version >= "3.11" and python_version < "3.12" +pygments==2.15.1 ; python_version >= "3.11" and python_version < "3.12" +pyjwt[crypto]==2.6.0 ; python_version >= "3.11" and python_version < "3.12" +pynacl==1.5.0 ; python_version >= "3.11" and python_version < "3.12" +pyyaml==6.0 ; python_version >= "3.11" and python_version < "3.12" +requests-file==1.5.1 ; python_version >= "3.11" and python_version < "3.12" +requests==2.29.0 ; python_version >= "3.11" and python_version < "3.12" +rich==12.6.0 ; python_version >= "3.11" and python_version < "3.12" +shellingham==1.4.0 ; python_version >= "3.11" and python_version < "3.12" +six==1.16.0 ; python_version >= "3.11" and python_version < "3.12" +soupsieve==2.4.1 ; python_version >= "3.11" and python_version < "3.12" +tldextract==3.4.1 ; python_version >= "3.11" and python_version < "3.12" +typer[all]==0.7.0 ; python_version >= "3.11" and python_version < "3.12" +urllib3==1.26.15 ; python_version >= "3.11" and python_version < "3.12" +urltitle==0.3.8 ; python_version >= "3.11" and python_version < "3.12" +wrapt==1.15.0 ; python_version >= "3.11" and python_version < "3.12" diff --git a/utils/__init__.py b/utils/__init__.py index e69de29b..1f178478 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -0,0 +1,3 @@ +import importlib.metadata + +__version__: str = importlib.metadata.version("utils-py") diff --git a/utils/__main__.py b/utils/__main__.py index 4bc97f4a..a07baa5f 100644 --- a/utils/__main__.py +++ b/utils/__main__.py @@ -1,12 +1,4 @@ -import typer - -from .hello.__main__ import app as app_hello -from .sort.__main__ import app as app_sort - -app = typer.Typer(name="utils.py") -app.add_typer(app_hello) -app.add_typer(app_sort) - +from .cmd import app if __name__ == "__main__": app() diff --git a/utils/cmd/__init__.py b/utils/cmd/__init__.py new file mode 100644 index 00000000..cfd6387a --- /dev/null +++ b/utils/cmd/__init__.py @@ -0,0 +1,14 @@ +import typer + +from utils.utils import typer as typer_utils + +from .hello import main as cmd_hello +from .nginx import app as cmd_nginx +from .sort import app as cmd_sort + +app = typer.Typer(name="utils") + + +typer_utils.add_command(app=app, command=cmd_hello, name="hello") +typer_utils.add_command(app=app, command=cmd_nginx, name="nginx") +typer_utils.add_command(app=app, command=cmd_sort, name="sort") diff --git a/utils/cmd/hello/__init__.py b/utils/cmd/hello/__init__.py new file mode 100644 index 00000000..8ef22f40 --- /dev/null +++ b/utils/cmd/hello/__init__.py @@ -0,0 +1,5 @@ +import typer + + +def main(name: str = typer.Option("world", "-n", "--name")) -> None: + print(f"Hello, {name}!") diff --git a/utils/cmd/nginx/__init__.py b/utils/cmd/nginx/__init__.py new file mode 100644 index 00000000..cb7e3ad8 --- /dev/null +++ b/utils/cmd/nginx/__init__.py @@ -0,0 +1,16 @@ +import typer + +from utils.utils import typer as typer_utils + +from .add import main as cmd_add +from .disable import main as cmd_disable +from .enable import main as cmd_enable +from .list import main as cmd_list + +app = typer.Typer(name="nginx") + + +typer_utils.add_command(app=app, command=cmd_add, name="add") +typer_utils.add_command(app=app, command=cmd_disable, name="disable") +typer_utils.add_command(app=app, command=cmd_enable, name="enable") +typer_utils.add_command(app=app, command=cmd_list, name="list") diff --git a/utils/cmd/nginx/add/__init__.py b/utils/cmd/nginx/add/__init__.py new file mode 100644 index 00000000..dec3ac0f --- /dev/null +++ b/utils/cmd/nginx/add/__init__.py @@ -0,0 +1,26 @@ +from pathlib import Path + +import typer + +from utils.utils.rich.run import run + +from ..const import DEFAULT_NGINX_DIR +from ..enable import main as cmd_enable +from .template import NGINX_CONFIG_TEMPLATE + + +def main( + domain: str = typer.Argument(...), + port: int = typer.Option(8000), + nginx_dir: Path = typer.Option( + DEFAULT_NGINX_DIR, exists=True, file_okay=False, dir_okay=True + ), +) -> None: + config: str = NGINX_CONFIG_TEMPLATE.substitute({"domain": domain, "port": port}) + run( + args=["sudo", "tee", nginx_dir / "sites-available" / domain], + input=bytes(config, encoding="utf-8"), + ) + cmd_enable(domain=domain, nginx_dir=nginx_dir) + run(args=["sudo", "certbot", "--nginx", "-d", domain]) + run(args=["sudo", "nginx", "-s", "reload"]) diff --git a/utils/cmd/nginx/add/template.py b/utils/cmd/nginx/add/template.py new file mode 100644 index 00000000..54e7df99 --- /dev/null +++ b/utils/cmd/nginx/add/template.py @@ -0,0 +1,11 @@ +from string import Template + +NGINX_CONFIG_TEMPLATE: Template = Template( + r"""server { + server_name ${domain}; + location / { + proxy_pass http://127.0.0.1:${port}; + } +} +""" +) diff --git a/utils/cmd/nginx/const.py b/utils/cmd/nginx/const.py new file mode 100644 index 00000000..ed096eda --- /dev/null +++ b/utils/cmd/nginx/const.py @@ -0,0 +1,3 @@ +from pathlib import Path + +DEFAULT_NGINX_DIR: Path = Path("/etc/nginx") diff --git a/utils/cmd/nginx/disable/__init__.py b/utils/cmd/nginx/disable/__init__.py new file mode 100644 index 00000000..4da4253d --- /dev/null +++ b/utils/cmd/nginx/disable/__init__.py @@ -0,0 +1,28 @@ +from pathlib import Path + +import typer + +from utils.utils.rich.run import run + +from ..const import DEFAULT_NGINX_DIR + + +def main( + domain: str = typer.Argument(...), + nginx_dir: Path = typer.Option( + DEFAULT_NGINX_DIR, + "-d", + "--nginx-dir", + exists=True, + file_okay=False, + dir_okay=True, + ), +) -> None: + options: list[str] = ["--interactive", "--verbose"] + args: list[str | Path] = [ + "sudo", + "rm", + *options, + nginx_dir / "sites-enabled" / domain, + ] + run(args=args) diff --git a/utils/cmd/nginx/enable/__init__.py b/utils/cmd/nginx/enable/__init__.py new file mode 100644 index 00000000..6a6a4408 --- /dev/null +++ b/utils/cmd/nginx/enable/__init__.py @@ -0,0 +1,34 @@ +from pathlib import Path + +import typer + +from utils.utils.rich.run import run + +from ..const import DEFAULT_NGINX_DIR + + +def main( + domain: str = typer.Argument(...), + nginx_dir: Path = typer.Option( + DEFAULT_NGINX_DIR, + "-d", + "--nginx-dir", + exists=True, + file_okay=False, + dir_okay=True, + ), +) -> None: + options: list[str] = [ + "--interactive", + "--symbolic", + "--no-target-directory", + "--verbose", + ] + args: list[str | Path] = [ + "sudo", + "ln", + *options, + nginx_dir / "sites-available" / domain, + nginx_dir / "sites-enabled" / domain, + ] + run(args=args) diff --git a/utils/cmd/nginx/list/__init__.py b/utils/cmd/nginx/list/__init__.py new file mode 100644 index 00000000..5b532323 --- /dev/null +++ b/utils/cmd/nginx/list/__init__.py @@ -0,0 +1,22 @@ +from pathlib import Path + +import typer + +from utils.utils.rich.run import run + +from ..const import DEFAULT_NGINX_DIR + + +def main( + nginx_dir: Path = typer.Option( + DEFAULT_NGINX_DIR, + "-d", + "--nginx-dir", + exists=True, + file_okay=False, + dir_okay=True, + ), +) -> None: + options: list[str] = ["--classify", "--human-readable", "-l"] + run(args=["ls", *options, nginx_dir / "sites-available"]) + run(args=["ls", *options, nginx_dir / "sites-enabled"]) diff --git a/utils/cmd/sort/__init__.py b/utils/cmd/sort/__init__.py new file mode 100644 index 00000000..2eab2be0 --- /dev/null +++ b/utils/cmd/sort/__init__.py @@ -0,0 +1,12 @@ +import typer + +from utils.utils import typer as typer_utils + +from .github import main as cmd_github +from .website import main as cmd_website + +app = typer.Typer(name="sort") + + +typer_utils.add_command(app=app, command=cmd_github, name="github") +typer_utils.add_command(app=app, command=cmd_website, name="website") diff --git a/utils/cmd/sort/github/__init__.py b/utils/cmd/sort/github/__init__.py new file mode 100644 index 00000000..e77137f6 --- /dev/null +++ b/utils/cmd/sort/github/__init__.py @@ -0,0 +1,52 @@ +import sys +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path +from typing import Optional + +import typer +import yaml +from github import Github +from github.Repository import Repository + +from utils.const.yaml import DUMP_OPTIONS + +from .template import format_article + + +def main( + data_filepath: Path = typer.Argument( + ..., exists=True, file_okay=True, dir_okay=False, readable=True, writable=False + ), + in_place: bool = typer.Option(False, "-i", "--in-place"), + markdown: Optional[Path] = typer.Option( + None, + "-m", + "--markdown", + exists=False, + file_okay=True, + dir_okay=False, + readable=False, + writable=True, + ), + token: Optional[str] = typer.Option(None, "--token", "-t", envvar="GITHUB_TOKEN"), +) -> None: + data: dict[str, list[str]] = yaml.safe_load(stream=data_filepath.read_text()) + groups: dict[str, list[Repository]] = {} + with ThreadPoolExecutor() as executor: + gh: Github = Github(token) + for group_name, repo_names in data.items(): + repos: list[Repository] = list( + executor.map(lambda repo_name: gh.get_repo(repo_name), repo_names) + ) + repos.sort(key=lambda repo: repo.stargazers_count, reverse=True) + data[group_name] = [repo.full_name for repo in repos] + groups[group_name] = repos + + if in_place: + with data_filepath.open(mode="w") as stream: + yaml.safe_dump(data=data, stream=stream, **DUMP_OPTIONS) + else: + yaml.safe_dump(data=data, stream=sys.stdout, **DUMP_OPTIONS) + + if markdown: + markdown.write_text(format_article(groups=groups)) diff --git a/utils/cmd/sort/github/template.py b/utils/cmd/sort/github/template.py new file mode 100644 index 00000000..775d31f5 --- /dev/null +++ b/utils/cmd/sort/github/template.py @@ -0,0 +1,52 @@ +from string import Template + +from github.Repository import Repository + +FRONTMATTER: str = r""" +--- +title: Awesome GitHub +category: + - Awesome +tag: + - GitHub +--- +""" + + +ITEM_TEMPLATE: Template = Template( + r"| [${name}](${url}) | ![GitHub Repo Stars](https://img.shields.io/github/stars/${full_name}) ![GitHub Commit Activity](https://img.shields.io/github/commit-activity/y/${full_name}) | ${description} |" +) + + +SECTION_TEMPLATE: Template = Template( + r""" +## ${name} + +| Name | Statistics | Description | +| ---- | ---------- | ----------- | +${items} +""" +) + + +def format_item(repo: Repository) -> str: + return ITEM_TEMPLATE.substitute( + { + "description": repo.description, + "full_name": repo.full_name, + "name": repo.name, + "url": repo.html_url, + } + ) + + +def format_section(name: str, repos: list[Repository]) -> str: + items: str = "\n".join(map(format_item, repos)) + return SECTION_TEMPLATE.substitute({"name": name, "items": items}) + + +def format_article(groups: dict[str, list[Repository]]) -> str: + sections: list[str] = [ + format_section(name, groups[name]) for name in sorted(groups.keys()) + ] + return "\n".join([FRONTMATTER, "\n".join(sections)]) diff --git a/utils/cmd/sort/website/__init__.py b/utils/cmd/sort/website/__init__.py new file mode 100644 index 00000000..452dbea9 --- /dev/null +++ b/utils/cmd/sort/website/__init__.py @@ -0,0 +1,46 @@ +import sys +from pathlib import Path +from typing import Optional + +import typer +import yaml +from tldextract import tldextract + +from utils.const.yaml import DUMP_OPTIONS + +from .template import format_article + + +def main( + data_filepath: Path = typer.Argument( + ..., exists=True, file_okay=True, dir_okay=False, readable=True, writable=False + ), + in_place: bool = typer.Option(False, "-i", "--in-place"), + markdown: Optional[Path] = typer.Option( + None, + "-m", + "--markdown", + exists=False, + file_okay=True, + dir_okay=False, + readable=False, + writable=True, + ), +) -> None: + groups: dict[str, list[dict[str, str]]] = yaml.safe_load( + stream=data_filepath.read_text() + ) + + for group_name in groups.keys(): + groups[group_name].sort( + key=lambda website: tldextract.extract(website["url"]).registered_domain + ) + + if in_place: + with data_filepath.open(mode="w") as stream: + yaml.safe_dump(data=groups, stream=stream, **DUMP_OPTIONS) + else: + yaml.safe_dump(data=groups, stream=sys.stdout, **DUMP_OPTIONS) + + if markdown: + markdown.write_text(format_article(groups=groups)) diff --git a/utils/cmd/sort/website/template.py b/utils/cmd/sort/website/template.py new file mode 100644 index 00000000..2936cd93 --- /dev/null +++ b/utils/cmd/sort/website/template.py @@ -0,0 +1,74 @@ +import urllib.parse +from concurrent.futures import ThreadPoolExecutor +from string import Template + +import urltitle +import urltitle.config + +from utils.utils import markdown as markdown_utils + +FAVICON_KIT_API: str = "https://proposed-rose-aardwolf.faviconkit.com" +FAVICON_SIZE: int = 256 + + +FRONTMATTER: str = r""" +--- +title: Awesome Websites +category: + - Awesome +tag: + - Website +--- +""" + + +ITEM_TEMPLATE: Template = Template( + r'| ${netloc} | [${title}](${url}) |' +) + +SECTION_TEMPLATE: Template = Template( + r""" +## ${name} + +| Favicon | Title | +| :-----: | ----- | +${items} +""" +) + + +def format_item(website: dict[str, str]) -> str: + url = website["url"] + + netloc: str = urllib.parse.urlparse(url=url).netloc + website["netloc"] = netloc + + if "favicon" not in website: + website["favicon"] = f"{FAVICON_KIT_API}/{netloc}/{FAVICON_SIZE}" + + if "title" not in website: + reader: urltitle.URLTitleReader = urltitle.URLTitleReader() + title: str = reader.title(url) + website["title"] = title + + return ITEM_TEMPLATE.substitute( + { + "favicon": website["favicon"], + "netloc": website["netloc"], + "title": markdown_utils.escape(website["title"]), + "url": website["url"], + } + ) + + +def format_section(name: str, websites: list[dict[str, str]]) -> str: + with ThreadPoolExecutor() as executor: + items: str = "\n".join(executor.map(format_item, websites)) + return SECTION_TEMPLATE.substitute({"name": name, "items": items}) + + +def format_article(groups: dict[str, list[dict[str, str]]]) -> str: + sections: list[str] = [ + format_section(name, groups[name]) for name in sorted(groups.keys()) + ] + return "\n".join([FRONTMATTER, "\n".join(sections)]) diff --git a/utils/hello/__init__.py b/utils/const/__init__.py similarity index 100% rename from utils/hello/__init__.py rename to utils/const/__init__.py diff --git a/utils/const/yaml.py b/utils/const/yaml.py new file mode 100644 index 00000000..acd099e4 --- /dev/null +++ b/utils/const/yaml.py @@ -0,0 +1,3 @@ +from typing import Any + +DUMP_OPTIONS: dict[str, Any] = {"allow_unicode": True, "sort_keys": True} diff --git a/utils/hello/__main__.py b/utils/hello/__main__.py deleted file mode 100644 index 4c072b5a..00000000 --- a/utils/hello/__main__.py +++ /dev/null @@ -1,8 +0,0 @@ -import typer - -app = typer.Typer(name="hello", invoke_without_command=True) - - -@app.callback() -def main(name: str = typer.Argument("world")) -> None: - print(f"Hello, {name}!") diff --git a/utils/sort/__init__.py b/utils/sort/__init__.py deleted file mode 100644 index cb1d63bd..00000000 --- a/utils/sort/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -import collections -import typing - - -def sort(data: typing.Any) -> typing.Any: - match data: - case dict(): - return sort_dict(data=data) - case list(): - return sort_list(data=data) - case _: - return data - - -def sort_dict(data: dict) -> dict: - result = collections.OrderedDict() - for key in sorted(data.keys()): - result[key] = sort(data[key]) - return dict(result) - - -def sort_list(data: list) -> list: - result: list = list() - for value in data: - result.append(sort(value)) - try: - result = sorted(result) - except: - if isinstance(result[0], dict): - for key in sorted(result[0].keys()): - try: - result = sorted(result, key=lambda x: x[key]) - except: - pass - else: - break - return result diff --git a/utils/sort/__main__.py b/utils/sort/__main__.py deleted file mode 100644 index 69d6af31..00000000 --- a/utils/sort/__main__.py +++ /dev/null @@ -1,16 +0,0 @@ -import typer - -from .github.__main__ import app as app_github -from .json.__main__ import app as app_json -from .url.__main__ import app as app_url -from .yaml.__main__ import app as app_yaml - -app = typer.Typer(name="sort") -app.add_typer(app_github) -app.add_typer(app_json) -app.add_typer(app_url) -app.add_typer(app_yaml) - - -if __name__ == "__main__": - app() diff --git a/utils/sort/github/__main__.py b/utils/sort/github/__main__.py deleted file mode 100644 index 91ebc679..00000000 --- a/utils/sort/github/__main__.py +++ /dev/null @@ -1,30 +0,0 @@ -import typing -from pathlib import Path - -import github.Repository -import typer -import yaml - -from .constants import FRONTMATTER -from .sort import sort_repositories -from .template import format_section - -app = typer.Typer(name="github", invoke_without_command=True) - - -@app.callback() -def main( - filepath: Path = typer.Argument(None), - token: typing.Optional[str] = typer.Option(None, "-t", "--token"), -) -> None: - """ - Examples: - $ utils.py sort github data/github.yaml > docs/awesome-github.md - """ - data: dict = yaml.safe_load(stream=filepath.read_text()) - print(FRONTMATTER) - for key, value in data.items(): - repos: list[github.Repository.Repository] = sort_repositories( - repositories=value, token=token - ) - print(format_section(name=key, repos=repos)) diff --git a/utils/sort/github/constants.py b/utils/sort/github/constants.py deleted file mode 100644 index 64054c0b..00000000 --- a/utils/sort/github/constants.py +++ /dev/null @@ -1,21 +0,0 @@ -FRONTMATTER: str = r""" ---- -title: Awesome GitHub -category: - - Awesome -tag: - - GitHub ---- -""" - - -ITEM_TEMPLATE: str = r"| [${name}](${url}) | ![GitHub Repo stars](https://img.shields.io/github/stars/${full_name}) ![GitHub commit activity](https://img.shields.io/github/commit-activity/y/${full_name}) | ${description} |" - - -SECTION_TEMPLATE: str = r""" -## ${name} - -| Name | Statistics | Description | -| ---- | ---------- | ----------- | -${items} -""" diff --git a/utils/sort/github/sort.py b/utils/sort/github/sort.py deleted file mode 100644 index eeee58cf..00000000 --- a/utils/sort/github/sort.py +++ /dev/null @@ -1,13 +0,0 @@ -import typing - -import github -import github.Repository - - -def sort_repositories( - repositories: list, token: typing.Optional[str] -) -> list[github.Repository.Repository]: - g = github.Github(token) - repos: list[github.Repository.Repository] = [g.get_repo(r) for r in repositories] - repos = sorted(repos, key=lambda r: r.stargazers_count, reverse=True) - return repos diff --git a/utils/sort/github/template.py b/utils/sort/github/template.py deleted file mode 100644 index c65d143d..00000000 --- a/utils/sort/github/template.py +++ /dev/null @@ -1,26 +0,0 @@ -import string - -import github.Repository - -from ...utils import escape_markdown -from .constants import ITEM_TEMPLATE, SECTION_TEMPLATE - - -def format_item(repo: github.Repository.Repository) -> str: - template = string.Template(ITEM_TEMPLATE) - result = template.substitute( - { - "description": escape_markdown(repo.description or ""), - "full_name": repo.full_name, - "name": repo.name, - "url": repo.html_url, - } - ) - return result - - -def format_section(name: str, repos: list[github.Repository.Repository]) -> str: - template = string.Template(SECTION_TEMPLATE) - items = "\n".join([format_item(repo=repo) for repo in repos]) - result = template.substitute({"name": name, "items": items}) - return result diff --git a/utils/sort/json/__init__.py b/utils/sort/json/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/utils/sort/json/__main__.py b/utils/sort/json/__main__.py deleted file mode 100644 index 4cd5b976..00000000 --- a/utils/sort/json/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -import json -from pathlib import Path - -import typer - -from .. import sort - -app = typer.Typer(name="json", invoke_without_command=True) - - -@app.callback() -def main(filepath: Path) -> None: - data = json.loads(filepath.read_text()) - data = sort(data) - filepath.write_text(json.dumps(data, sort_keys=True)) - - -if __name__ == "__main__": - app() diff --git a/utils/sort/url/__init__.py b/utils/sort/url/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/utils/sort/url/__main__.py b/utils/sort/url/__main__.py deleted file mode 100644 index 6b972268..00000000 --- a/utils/sort/url/__main__.py +++ /dev/null @@ -1,23 +0,0 @@ -from pathlib import Path - -import typer -import yaml - -from .constants import FRONTMATTER -from .sort import sort_urls -from .template import format_section - -app = typer.Typer(name="url", invoke_without_command=True) - - -@app.callback() -def main(filepath: Path = typer.Argument(None)) -> None: - """ - Examples: - $ utils.py sort github data/github.yaml > docs/awesome-github.md - """ - data: dict = yaml.safe_load(stream=filepath.read_text()) - print(FRONTMATTER) - for key, value in data.items(): - urls: list[dict] = sort_urls(urls=value) - print(format_section(name=key, urls=urls)) diff --git a/utils/sort/url/constants.py b/utils/sort/url/constants.py deleted file mode 100644 index 98cbc31d..00000000 --- a/utils/sort/url/constants.py +++ /dev/null @@ -1,23 +0,0 @@ -FRONTMATTER: str = r""" ---- -title: Awesome Websites -category: - - Awesome -tag: - - Website ---- -""" - - -ITEM_TEMPLATE: str = ( - r'| ${netloc} | [${title}](${url}) |' -) - - -SECTION_TEMPLATE: str = r""" -## ${name} - -| Favicon | Title | -| :-----: | ----- | -${items} -""" diff --git a/utils/sort/url/sort.py b/utils/sort/url/sort.py deleted file mode 100644 index aded74ec..00000000 --- a/utils/sort/url/sort.py +++ /dev/null @@ -1,5 +0,0 @@ -import tldextract - - -def sort_urls(urls: list[dict]) -> list[dict]: - return sorted(urls, key=lambda u: tldextract.extract(u["url"]).registered_domain) diff --git a/utils/sort/url/template.py b/utils/sort/url/template.py deleted file mode 100644 index e82a5f80..00000000 --- a/utils/sort/url/template.py +++ /dev/null @@ -1,36 +0,0 @@ -import string -import urllib.parse - -import urltitle - -from ...utils import escape_markdown -from .constants import ITEM_TEMPLATE, SECTION_TEMPLATE - - -def format_item(url: dict) -> str: - netloc: str = urllib.parse.urlparse(url["url"]).netloc - if "favicon" not in url: - url["favicon"] = f"https://proposed-rose-aardwolf.faviconkit.com/{netloc}/128" - if "title" not in url: - try: - reader: urltitle.URLTitleReader = urltitle.URLTitleReader() - url["title"] = reader.title(url["url"]) - except: - url["title"] = url["url"] - template = string.Template(ITEM_TEMPLATE) - result = template.substitute( - { - "favicon": url["favicon"], - "netloc": netloc, - "title": escape_markdown(url["title"]), - "url": url["url"], - } - ) - return result - - -def format_section(name: str, urls: list[dict]) -> str: - template = string.Template(SECTION_TEMPLATE) - items = "\n".join([format_item(url) for url in urls]) - result = template.substitute({"name": name, "items": items}) - return result diff --git a/utils/sort/yaml/__init__.py b/utils/sort/yaml/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/utils/sort/yaml/__main__.py b/utils/sort/yaml/__main__.py deleted file mode 100644 index 43cc6a23..00000000 --- a/utils/sort/yaml/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -from pathlib import Path - -import typer -import yaml - -from .. import sort - -app = typer.Typer(name="yaml", invoke_without_command=True) - - -@app.callback() -def main(filepath: Path) -> None: - data = yaml.safe_load(filepath.read_text()) - data = sort(data) - filepath.write_text(yaml.dump(data, allow_unicode=True)) - - -if __name__ == "__main__": - app() diff --git a/utils/utils.py b/utils/utils.py deleted file mode 100644 index a8726759..00000000 --- a/utils/utils.py +++ /dev/null @@ -1,3 +0,0 @@ -def escape_markdown(text: str) -> str: - text = text.replace(r"|", r"\|") - return text diff --git a/utils/sort/github/__init__.py b/utils/utils/__init__.py similarity index 100% rename from utils/sort/github/__init__.py rename to utils/utils/__init__.py diff --git a/utils/utils/markdown.py b/utils/utils/markdown.py new file mode 100644 index 00000000..35d243bf --- /dev/null +++ b/utils/utils/markdown.py @@ -0,0 +1,7 @@ +def escape(text: str) -> str: + """Escape markdown special characters""" + text = text.replace(r"_", r"\_") + text = text.replace(r"*", r"\*") + text = text.replace(r"`", r"\`") + text = text.replace(r"|", r"\|") + return text diff --git a/utils/utils/rich/logging/__init__.py b/utils/utils/rich/logging/__init__.py new file mode 100644 index 00000000..4c26b976 --- /dev/null +++ b/utils/utils/rich/logging/__init__.py @@ -0,0 +1,14 @@ +from typing import Any, Optional + +import rich +from rich.console import Console +from rich.style import Style + + +def log( + *objects: Any, style: Optional[str | Style] = None, prefix: Optional[str] = None +) -> None: + console: Console = rich.get_console() + if prefix: + objects = (f"[reverse] {prefix} [/]", *objects) + console.log(*objects, style=style) diff --git a/utils/utils/rich/logging/style.py b/utils/utils/rich/logging/style.py new file mode 100644 index 00000000..0f0e9cb5 --- /dev/null +++ b/utils/utils/rich/logging/style.py @@ -0,0 +1,5 @@ +from rich.style import Style + +FAIL: Style = Style(color="red", bold=True) +INFO: Style = Style(color="cyan", bold=True) +SUCCESS: Style = Style(color="green", bold=True) diff --git a/utils/utils/rich/run.py b/utils/utils/rich/run.py new file mode 100644 index 00000000..e67aee93 --- /dev/null +++ b/utils/utils/rich/run.py @@ -0,0 +1,16 @@ +import shlex +import subprocess +from pathlib import Path +from typing import Optional, Sequence + +from .logging import log, style + + +def run(args: Sequence[str | Path], input: Optional[bytes] = None) -> None: + command: str = shlex.join(map(str, args)) + log(command, style=style.INFO, prefix="RUN") + completed: subprocess.CompletedProcess = subprocess.run(args=args, input=input) + if completed.returncode != 0: + log(command, style=style.FAIL, prefix=f"FAIL {completed.returncode}") + completed.check_returncode() + log(command, style=style.SUCCESS, prefix="SUCCESS") diff --git a/utils/utils/typer.py b/utils/utils/typer.py new file mode 100644 index 00000000..c1363ad3 --- /dev/null +++ b/utils/utils/typer.py @@ -0,0 +1,12 @@ +from typing import Callable, Optional + +import typer + + +def add_command( + app: typer.Typer, command: Callable, name: Optional[str] = None +) -> None: + if isinstance(command, typer.Typer): + app.add_typer(command, name=name) + else: + app.command(name=name)(command)