diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..11d67aa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ + + + + +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html)(**After we publish 1.0.0**). + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + + + + +## [Unreleased] + +None. + +## [0.0.1b0] - 2023-11-27 [YANKED] + +!!! danger + **This version has security vulnerabilities, please stop using it.** + +[unreleased]: https://github.com/WSH032/fastapi-proxy-lib/compare/v0.0.1b0...HEAD +[0.0.1b0]: https://github.com/WSH032/fastapi-proxy-lib/releases/tag/v0.0.1b0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b4905a0..e646e68 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,55 +1,183 @@ -# Hi 感谢对本项目感兴趣 + + + -## 代码贡献 +# Contributing -> **Note** -> -> 我们最低支持的版本是`python3.8`,你可以随意使用`python3.8`以上的版本。 -> -> 但是请注意,您的代码要能通过`py >= 3.8`的所有版本的代码风格检查与测试。 +> The guide is modified from [mkdocstrings](https://mkdocstrings.github.io/contributing/#contributing) -我们推荐使用[虚拟环境](https://docs.python.org/3/library/venv.html#creating-virtual-environments)来进行开发 +Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. -在激活虚拟环境后,运行[./scripts/init.sh](./scripts/init-dev.sh)来为你初始化: +## Environment setup -- [requirements](./requirements-dev.txt) -- [hatch](https://github.com/pypa/hatch) -- [pre-commit](https://pre-commit.com/) -- [mkdocs-material](https://squidfunk.github.io/mkdocs-material/) +First, `fork` and `clone` the repository, then `cd` to the directory. -## 代码风格 +We use [`hatch`](https://github.com/pypa/hatch) and [`pre-commit`](https://pre-commit.com/) to manage our project. -由于本项目主要是python语言,所以我们只强制要求python代码风格。 +You can install them with: -但是涉及到其他语言(例如 `bash`, `toml` 等)的部分,也请尽力保证样式正确。 +```shell +# https://pypa.github.io/pipx/ +python3 -m pip install --user pipx -> **Note** -> 我们启用了大量而严格的`lint`规则,如果你使用`vscode`,我们推荐你安装[./.vscode/extensions.json](./.vscode/extensions.json)中的插件来帮助你实时检查错误 -> -> 如果你打不过检查器,可以使用`# noqa`和`# type: ignore`来跳过检查 -> -> 当然,这些规则可能过于严格,你可以发起一个`issue`或者`pull request`来讨论是否需要修改规则 +pipx install hatch +pipx install pre-commit +``` -### python代码风格(请查看[./pyproject.toml](./pyproject.toml)了解我们的风格) +Then, initialize the env with: -- [Ruff](https://github.com/astral-sh/ruff): 代码质量检查 -- [Blcak](https://github.com/psf/black): 代码格式规范 -- [Pyright](https://github.com/Microsoft/pyright/): 静态类型检查 +```shell +# Init pre-commit +# https://pre-commit.com/#3-install-the-git-hook-scripts +pre-commit install +pre-commit run --all-files -您需要通过以上检查,`pre-commit` 会确保这点。 +# https://hatch.pypa.io/latest/environment/ +hatch shell +``` -你也可以[手动检查](./scripts/lint.sh)和[自动修复](./scripts/format.sh)。 +That's all! Now, you can start to develop. -> **Note** -> `Pyright`检查将发生两次 -> -> - 在`pre-commit`中,`Pyright`不会检查第三方依赖,并且`python`版本为支持的最低版本 -> - 而在`Github Actions`或[手动检查](./scripts/lint.sh)中,`Pyright`将在激活的虚拟环境中检查所有依赖 +## Code style -## 代码测试 +The source code is in `src/` -测试文件位于[./tests/](./tests/) +We use [Ruff](https://github.com/astral-sh/ruff), [Blcak](https://github.com/psf/black), [Pyright](https://github.com/Microsoft/pyright/) + and [Codespell](https://github.com/codespell-project/codespell) to check our code style and lint. -我们使用`pytest`来完成测试,测试将在`Github Actions`中进行。 +Please check `pyproject.toml` to know our style. -你也可以[手动测试](./scripts/pytest.sh)。 +If you want to format or lint-fix your code, you can use the following command: + +```shell +hatch run lint +``` + +or, with `pre-commit`: + +```shell +pre-commit run -a +``` + +or, dry run: + +```shell +hatch run lint-check +``` + +!!! tip + If you use `VSCode`, we strongly recommend you to install the extensions in `.vscode/extensions.json`.
+ Because our code style rules are quite strict.
+ These extensions can help you know where need to be fixed when coding. + +## Testing + +We use [pytest](https://docs.pytest.org/en/stable/) to test our code. + +The test source code is in `tests/` + +You can run the testing with: + +```shell +hatch run test +``` + +## Documentation + +We use [mkdocs](https://www.mkdocs.org), [mkdocs-material](https://squidfunk.github.io/mkdocs-material), [mkdocstrings](https://mkdocstrings.github.io) to build our documentation. + +The documentation source code is in `docs/`, `mkdocs.yml`, + may be there is also some source code in `scripts/` or somewhere (check `mkdocs.yml` to find that). + +Live-reloading docs: + +```shell +hatch run docs:mkdocs serve +``` + +Build docs: + +```shell +hatch run docs:docs-build +``` + +## PR + +- PRs should target the `main` branch. +- Keep branches up to date by `rebase` before merging. +- Do not add multiple unrelated things in same PR. +- Do not submit PRs where you just take existing lines and reformat them without changing what they do. +- Do not change other parts of the code that are not yours for formatting reasons. +- Do not use your clone's main branch to make a PR - create a branch and PR that. + +### Edit `CHANGELOG.md` + +If you have made the corresponding changes, please record them in `CHANGELOG.md`. + +### Commit message convention + +Commit messages must follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), +or, `pre-commit` may be reject your commit. + +!!! info + If you don't know how to finish these, it's okay, feel free to initiate a PR, I will help you continue. + +## More + +There may still be some useful commands in `pyproject.toml`, you can refer to [hatch/environment/scripts](https://hatch.pypa.io/latest/config/environment/overview/#scripts) to use them. + +!!! info + If you find that the commands given in the above examples are incorrect, please open an issue, we greatly appreciate it. + +--- + +## 😢 + +!!! warning + The following 👇 content is for the maintainers of this project, may be you don't need to read it. + +--- + +## deploy-docs + +please refer to `.github/workflows/docs.yml` + +## CI: lint-test + +please refer to `.github/workflows/lint-test.yml` + +## CI: pre-commit-ci auto-update + +Every Monday, `pre-commit-ci` will send a PR for automatic hook version updates, which will trigger a local `ver_sync` hook. + +The `ver_sync` hook will maintain lint tools version consistency between `.pre-commit-config.yaml` and `pyproject.toml`. + +Please check whether the `ver_sync` works properly, then you can accept the PR. + +## Publish and Release 🚀 + +**^^First, edit `CHANGELOG.md` to record the changes.^^** + +Then, please refer to: + +- `.github/workflows/publish.yml` +- +- + +Update version with: + +```shell +hatch version {new_version} +``` + +It will create a commit and tag automatically, then, push the **tag** to GitHub. + +After that, the `publish.yml` workflow will build and publish the package to PyPI. + +> Don't forget to make a `approve` in environment `pypi` for the workflow. + +Finally, edit the `draft release` created by `publish.yml` workflow, and publish the release. + +!!! warning + The creating of tag needs signature verification,
+ please refer to diff --git a/README.md b/README.md index 8f718df..d0dee23 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,19 @@ + + + + # FastAPI Proxy Lib

HTTP/WebSocket proxy for starlette/FastAPI

-| | | -| ------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| CI/CD | [![CI: lint-test]][CI: lint-test#link] [![CI: docs]][CI: docs#link] | +| | | +| - | - | +| CI/CD | [![CI: lint-test]][CI: lint-test#link] [![pre-commit.ci status]][pre-commit.ci status#link]
[![CI: docs]][CI: docs#link] [![CI: publish]][CI: publish#link] | | Code | [![codecov]][codecov#link] [![Code style: black]][Code style: black#link] [![Ruff]][Ruff#link] [![Checked with pyright]][Checked with pyright#link] | -| Package | [![Python-Version]][Python-Version#link] | -| Meta | [![Hatch project]][Hatch project#link] [![GitHub License]][GitHub License#link] | +| Package | [![PyPI - Version]][PyPI#link] [![PyPI - Downloads]][PyPI#link] [![PyPI - Python Version]][PyPI#link] | +| Meta | [![Hatch project]][Hatch project#link] [![GitHub License]][GitHub License#link] | --- @@ -48,13 +52,12 @@ So, it perfectly supports all features of [httpx.AsyncClient](https://www.python > !!! note > > We follow semantic versioning.
-> This is a young project, and before 1.0.0, there may be changes in the API (though we try to avoid that).
-> We recommend pinning to any minor versions, such as 0.1.x. - -Pypi will come soon, please install from github temporarily: +> This is a young project, and before 1.0.0, there may be changes in the API (we try to avoid that).
+> We will release security updates at any time, please try to keep the version updated, instead of pinning to the old version.
+> pin to `major version` is recommended. ```shell -pip install fastapi-proxy-lib[standard]@git+https://github.com/WSH032/fastapi-proxy-lib.git +pip install fastapi-proxy-lib ``` Perhaps you've noticed that we're installing `fastapi-proxy-lib[standard]` instead of `fastapi-proxy-lib`. The difference is: @@ -82,18 +85,22 @@ uvicorn main:app --host 127.0.0.1 --port 8000 Then, visit `http://127.0.0.1:8000/bar?baz=1`, you will get the response from `http://www.example.com/foo/bar?baz=1`. -For support with `FastAPI router` or only using `Starlette`, please **visit to our [documentation 📚](https://wsh032.github.io/fastapi-proxy-lib/) for more details**. +**[Continue, please visit to our documentation 📚 for more details](https://wsh032.github.io/fastapi-proxy-lib/)**: + +- support for `FastAPI router` +- only `Starlette` dependency +- `WebSocket` proxy ## development - If you find any issues, please don't hesitate to [open an issue](https://github.com/WSH032/fastapi-proxy-lib/issues). - If you need assistance, feel free to [start a discussion](https://github.com/WSH032/fastapi-proxy-lib/discussions). -- [Welcome PR](https://github.com/WSH032/fastapi-proxy-lib/pulls) +- Follow our `CONTRIBUTING.md`, [PR Welcome!](https://github.com/WSH032/fastapi-proxy-lib/pulls) +- Security 😰❗: We value any security vulnerabilities, [please report to us privately](https://github.com/WSH032/fastapi-proxy-lib/security), pretty appreciated for that. English is not the native language of the author (me), so if you find any areas for improvement in the documentation, your feedback is welcome. -If you think this project helpful, consider giving it a star ![GitHub Repo stars](https://img.shields.io/github/stars/wsh032/fastapi-proxy-lib?style=social) - , which makes me happy. :smile: +If you think this project helpful, consider giving it a star ![GitHub Repo stars](https://img.shields.io/github/stars/wsh032/fastapi-proxy-lib?style=social), which makes me happy. :smile: ## License @@ -101,12 +108,16 @@ This project is licensed under the terms of the *Apache License 2.0*. + [CI: lint-test]: https://github.com/WSH032/fastapi-proxy-lib/actions/workflows/lint-test.yml/badge.svg?branch=main [CI: lint-test#link]: https://github.com/WSH032/fastapi-proxy-lib/actions/workflows/lint-test.yml [CI: docs]: https://github.com/WSH032/fastapi-proxy-lib/actions/workflows/docs.yml/badge.svg?branch=main [CI: docs#link]: https://github.com/WSH032/fastapi-proxy-lib/actions/workflows/docs.yml -[Python-Version]: https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2FWSH032%2Ffastapi-proxy%2Fmain%2Fpyproject.toml&logo=python&logoColor=gold&label=Python -[Python-Version#link]: https://github.com/WSH032/fastapi-proxy-lib/blob/main/pyproject.toml +[CI: publish]: https://github.com/WSH032/fastapi-proxy-lib/actions/workflows/publish.yml/badge.svg?branch=main +[CI: publish#link]: https://github.com/WSH032/fastapi-proxy-lib/actions/workflows/publish.yml +[pre-commit.ci status]: https://results.pre-commit.ci/badge/github/WSH032/fastapi-proxy-lib/main.svg +[pre-commit.ci status#link]: https://results.pre-commit.ci/latest/github/WSH032/fastapi-proxy-lib/main + [Code style: black]: https://img.shields.io/badge/code%20style-black-000000.svg [Code style: black#link]: https://github.com/psf/black [GitHub License]: https://img.shields.io/github/license/WSH032/fastapi-proxy-lib?color=9400d3 @@ -115,6 +126,12 @@ This project is licensed under the terms of the *Apache License 2.0*. [Ruff#link]: https://github.com/astral-sh/ruff [Checked with pyright]: https://microsoft.github.io/pyright/img/pyright_badge.svg [Checked with pyright#link]: https://microsoft.github.io/pyright + +[PyPI - Version]: https://img.shields.io/pypi/v/fastapi-proxy-lib?logo=pypi&label=PyPI&logoColor=gold +[PyPI - Downloads]: https://img.shields.io/pypi/dm/fastapi-proxy-lib?color=blue&label=Downloads&logo=pypi&logoColor=gold +[PyPI - Python Version]: https://img.shields.io/pypi/pyversions/fastapi-proxy-lib?logo=python&label=Python&logoColor=gold +[PyPI#link]: https://pypi.org/project/fastapi-proxy-lib + [Hatch project]: https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg [Hatch project#link]: https://github.com/pypa/hatch [codecov]: https://codecov.io/gh/WSH032/fastapi-proxy-lib/graph/badge.svg?token=62QQU06E8X diff --git a/docs/CHANGELOG/CHANGELOG.md b/docs/CHANGELOG/CHANGELOG.md new file mode 100644 index 0000000..786b75d --- /dev/null +++ b/docs/CHANGELOG/CHANGELOG.md @@ -0,0 +1 @@ +--8<-- "CHANGELOG.md" diff --git a/docs/CONTRIBUTING/CONTRIBUTING.md b/docs/CONTRIBUTING/CONTRIBUTING.md new file mode 100644 index 0000000..ea38c9b --- /dev/null +++ b/docs/CONTRIBUTING/CONTRIBUTING.md @@ -0,0 +1 @@ +--8<-- "CONTRIBUTING.md" diff --git a/docs/Usage/Security.md b/docs/Usage/Security.md index b31fb82..6c3376f 100644 --- a/docs/Usage/Security.md +++ b/docs/Usage/Security.md @@ -14,12 +14,12 @@ If you do not explicitly specify it, `ForwardHttpProxy` will issue a warning and - If you want to accept all proxy requests (**never do this on a public server**), you can do it like this: ```python - proxy_filter = lambda _: None + proxy_filter = lambda *_: None ``` - If you want to implement your own proxy filter, please refer to the [fastapi_proxy_lib.core.tool.ProxyFilterProto][]. -## `http` vs `https` +## `http`/`ws` vs `https`/`wss` !!! danger **Never use a server with the HTTPS protocol to proxy a target server (`base_url`) with the HTTP protocol !** diff --git a/docs/images/rocket-24.svg b/docs/images/rocket-24.svg new file mode 100644 index 0000000..8660bbf --- /dev/null +++ b/docs/images/rocket-24.svg @@ -0,0 +1 @@ + diff --git a/mkdocs.yml b/mkdocs.yml index 29fc1cb..3411c78 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -10,6 +10,9 @@ edit_uri: edit/main/docs/ theme: name: material + icon: + logo: octicons/rocket-24 + favicon: images/rocket-24.svg features: - content.code.copy - content.code.annotate @@ -126,6 +129,7 @@ watch: - src/fastapi_proxy_lib - README.md - CONTRIBUTING.md + - CHANGELOG.md validation: omitted_files: warn @@ -142,3 +146,7 @@ nav: - Usage/Advanced-and-Starlette.md - Usage/Security.md - API Reference: reference/ + - CONTRIBUTING: + - CONTRIBUTING/CONTRIBUTING.md + - CHANGELOG: + - CHANGELOG/CHANGELOG.md diff --git a/pyproject.toml b/pyproject.toml index 4e11f07..d81819b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,8 +63,8 @@ source = "regex_commit" commit_extra_args = ["-e"] path = "src/fastapi_proxy_lib/__init__.py" # NOTE: `chore` is required by commitlint -commit_message = "chore(version): 🚀 bump version {current_version} → {new_version}" -tag_message = "🚀 bump version {current_version} → {new_version}" +commit_message = "chore(version): 🚀 bump version v{current_version} → v{new_version}" +tag_message = "🚀 bump version v{current_version} → v{new_version}" # NOTE: `v` prefix is required by github `publish.yml` action tag_name = "v{new_version}" diff --git a/scripts/init-dev.sh b/scripts/init-dev.sh deleted file mode 100644 index 4cfae8b..0000000 --- a/scripts/init-dev.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -cd "$(dirname ${0})/.." - -pipx install pre-commit -pipx install hatch - -# Init pre-commit -# https://pre-commit.com/#3-install-the-git-hook-scripts -pre-commit install -pre-commit run --all-files - -# https://hatch.pypa.io/latest/environment/ -hatch shell diff --git a/src/fastapi_proxy_lib/__init__.py b/src/fastapi_proxy_lib/__init__.py index 1caa8ae..de07d3e 100644 --- a/src/fastapi_proxy_lib/__init__.py +++ b/src/fastapi_proxy_lib/__init__.py @@ -1,3 +1,7 @@ """fastapi_proxy_lib package.""" + +# DO NOT EDIT THE `__version__` MANUALLY. +# Use `hatch version {new_version}` instead. +# Refer to `CONTRIBUTING.md` for more info. __version__ = "0.0.1b0"