<!-- Improved compatibility of back to top link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->
<a name="readme-top"></a>
<!-- PROJECT SHIELDS -->
<!--
*** I'm using markdown "reference style" links for readability.
*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).
*** See the bottom of this document for the declaration of the reference variables
*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.
*** https://www.markdownguide.org/basic-syntax/#reference-style-links
-->
<!-- PROJECT LOGO -->
<br />
<div align="center">
<h3 align="center">Plombery</h3>
<p align="center">
带有舒适易用 Web UI 的 Python 任务调度程序
<br />
现已提供非官方的中文版本
<br />
<br />
<a href="https://lucafaggianelli.github.io/plombery/"><strong>官方网站 (英文) »</strong></a>
<br />
<a href="https://yhdsl.github.io/plombery/"><strong>非官方网站 (中文) »</strong></a>
<br />
<br />
<a href="https://github.com/yhdsl/plombery">GitHub</a>
·
<a href="https://github.com/yhdsl/plombery/issues">报告错误</a>
</p>
</div>
<!-- ABOUT THE PROJECT -->
## 关于 Plombery 项目
Plombery 是一个开源的 Python 任务调度程序,带有简洁易用的 Web UI 和 REST API。
如果你想重复执行 Python 脚本并监控运行状态,那么这便是适合你的工具!
<figure>
<img src="https://github.com/yhdsl/plombery/raw/main/docs/assets/images/screenshot.png" alt="Plombery 屏幕截图">
</figure>
> Plombery 项目尚处于起步阶段,因此可以通过大家的反馈和帮助来改进和完善!
> 如果你喜欢它,请为原始的 Plombery 项目点点 Star 🌟!
> 如果你想要某个功能或发现错误,请提交 issue。
## 关于此中文项目
[Plombery](https://github.com/lucafaggianelli/plombery) 是一个允许定时执行 Python 脚本的项目,
并且自带一个美观的 Web UI 进行可视化控制
相比于其它开源调度项目,
Plombery 构造语法简单,并且没有其它复杂的设计或概念,
并且**完全**开源,不需要考虑任何付费内容
但由于 Plombery 项目并不支持 i18n,
我手动修改了项目内硬编码的文本,
将 Web UI 和邮件文本更改为中文页面
此外,Plombery 项目的文档也进行了汉化,
其中补充说明了本中文项目额外添加的配置项
## 功能
- ⏰ 基于 [APScheduler](https://github.com/agronholm/apscheduler) 的任务调度功能 (支持 Interval, Cron 和 Date 触发器)
- 💻 内置 Web UI, 无需额外使用 HTML/JS/CSS 进行开发
- 👩💻🐍 仅用纯 Python 语法定义管道和任务
- 🎛️ 可以使用 [Pydantic](https://docs.pydantic.dev/) 为管道提供参数
- 👉 可以在 Web UI 中手动运行管道
- 🔐 可以设置 OAuth2 提供保护
- 🔍 通过日志和输出数据便捷调试每次运行
- 📩 对管道进行监控,并在出现问题时收到告警通知
- 💣 使用 REST API 进行集成开发
什么时候不该使用:
- 你需要很高的可扩展性,并且希望在分布式系统上运行
- 你想要一个无代码工具,或者你不想使用 Python 进行编写
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
### 开发语言
[![Python][Python]][Python-url]
[![TypeScript][TypeScript]][TypeScript-url]
[![React][React.js]][React-url]
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
<!-- GETTING STARTED -->
## 🚀 快速开始
单击进入 👉 [中文文档](https://yhdsl.github.io/plombery/) 快速入门 Plombery。
## 🎮 在 GitHub Codespaces 上尝试
在 GitHub Codespaces 上使用演示管道尝试 Plombery:
<figure align="center">
<img src="https://github.com/yhdsl/plombery/raw/main/docs/assets/images/codespaces.png" alt="在 GitHub Codespaces 上尝试">
</figure>
Codespaces 是一个运行在云中的开发环境,因此你无需克隆、安装依赖等便可以运行,
操作流程如下:
- 前往 [yhdsl/plombery](https://github.com/yhdsl/plombery) GitHub 页面
- 点击右上角绿色的 **Code** 按钮
- 选择 **Codespaces** 页面
- 点击 *create new codespace from main* 或使用已有的代码空间
- 接下来会打开一个 `github.dev` 页面, 请等待环境搭建
- 当代码空间准备完成后,你会看到一个类似 VSCode 的页面
- 一些代码将在终端内执行以构建前端页面等,请耐心等待
- 如果一切顺利,一个 Plombery 页面将在新标签页中打开
- 任何对 Python 代码的更改均会实时相应在 Plombery 页面内,就像在你本地的笔记本电脑上开发一样
## 🧐 向我展示代码!
这是一个极简的管道代码:
<figure align="center">
<img src="https://github.com/yhdsl/plombery/raw/main/docs/assets/images/minimal-code.png" alt="极简管道代码" width="80%">
<figcaption>我知道你想看看!</figcaption>
</figure>
<!-- ROADMAP -->
## 🛣 路线图
查看 [open issues](https://github.com/yhdsl/plombery/issues) 获取完整的建议的功能 (和已知的错误) 清单。
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
<!-- CONTRIBUTING -->
## 👩💻 贡献
正是诸多贡献者的努力让开源社区成为了学习、启发和创造的绝佳场所。
我们**非常感谢**你的任何贡献。
如果你有任何改进的建议,请 fork 原始的 Plombery 仓库并为其创建 pull request。
你也可以直接创建一个带有 "enhancement" 标签的 issue。
别忘了给原始的 Plombery 项目点点 Star!再次感谢!
1. Fork 项目
2. 创建你的新功能分叉 (`git checkout -b feature/AmazingFeature`)
3. 提交你的修改 (`git commit -m 'Add some AmazingFeature'`)
4. 向分支推送修改 (`git push origin feature/AmazingFeature`)
5. 创建一个 Pull Request
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
### 开发
克隆此 repo 的一个分支并设置开发环境。
创建一个 python 虚拟环境:
```sh
python -m venv .venv
# 使用 Mac/Linux 操作系统
source .venv/bin/activate
# 使用 Win 操作系统
.venv/Script/activate
```
并安装依赖项:
```sh
pip install -r requirements.txt
pip install -r requirements-dev.txt
```
> 本中文项目已经补齐了原始的 Plombery 仓库中丢失的 `requirements.txt` 文件
> 当前你也可以从 `pyproject.toml` 中安装
出于开发的目的,运行示例程序将很有帮助:
```sh
cd examples/
# 为示例程序创建一个虚拟环境
python -m venv .venv
source .venv/bin/activate
pip install -r requirements
./run.sh
# 或者在 Win 操作系统上使用 ./run.ps1
```
React 前端位于 `frontend/` 文件夹下,
进入该文件夹并安装依赖:
```sh
cd frontend/
# 原始的 Plombery 仓库使用 yarn 做为包管理器
# 接下来的命令将安装依赖项
# 如果你是克隆的本中文仓库
# 请改用下面的 npm 命令
yarn
```
```sh
cd frontend/
# 如果你是克隆的本中文仓库
# 请改用 npm 命令
npm install
```
运行开发服务器:
```sh
yarn dev
```
```sh
npm run dev
```
构建前端
```sh
yarn run build
```
```sh
npm run build
```
### 文档
文档网站基于 MkDocs Material 开发,
其中源代码位于 `docs/` 文件夹下,
而配置储存在 `mkdocs.yml` 文件内。
要运行本地开发服务器,请执行:
```
mkdocs serve
```
### 测试
测试套件基于 `pytest`编写,因此仅需执行:
```sh
pytest
```
为了获取测试覆盖率,请执行:
```sh
coverage run -m pytest
coverage report -m
```
<!-- LICENSE -->
## 开源协议
本中文项目与原始的 Plombery 仓库一样, 采用 MTL 协议发布。
请参阅本中文项目和原始 Plombery 仓库下的 `LICENSE.txt` 文件获取更多信息。
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
<!-- CONTACT -->
## 链接
- 原始 Plombery 项目: [https://github.com/lucafaggianelli/plombery](https://github.com/lucafaggianelli/plombery)
- 本中文项目: [https://github.com/yhdsl/plombery](https://github.com/yhdsl/plombery)
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
<!-- ACKNOWLEDGMENTS -->
## 致谢
Plombery 建立在以下令人惊叹的技术之上:
- [FastAPI](https://fastapi.tiangolo.com/)
- [Pydantic](https://docs.pydantic.dev/)
- [APScheduler](https://apscheduler.readthedocs.io/)
- [Apprise](https://github.com/caronc/apprise)
- [React](https://react.dev/)
- [Vite](https://vitejs.dev/)
- [Tremor](https://www.tremor.so/)
<p align="right">(<a href="#readme-top">返回顶部</a>)</p>
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-url]: https://reactjs.org/
[Python]: https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=yellow
[Python-url]: https://www.python.org/
[TypeScript]: https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white
[TypeScript-url]: https://www.typescriptlang.org/
Raw data
{
"_id": null,
"home_page": null,
"name": "plombery-chinese",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "pipeline, task-scheduler, apscheduler, orchestrator, web-ui, fastapi, pydantic, plombery, chinese",
"author": null,
"author_email": "yhdsl <56674878+yhdsl@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/36/e2/15c05db365ad4cfb110c71a137bfea4a69636aeac982fb52f6905f90fb87/plombery_chinese-0.4.1.tar.gz",
"platform": null,
"description": "<!-- Improved compatibility of back to top link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->\n\n<a name=\"readme-top\"></a>\n\n<!-- PROJECT SHIELDS -->\n<!--\n*** I'm using markdown \"reference style\" links for readability.\n*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).\n*** See the bottom of this document for the declaration of the reference variables\n*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.\n*** https://www.markdownguide.org/basic-syntax/#reference-style-links\n-->\n\n<!-- PROJECT LOGO -->\n<br />\n<div align=\"center\">\n<h3 align=\"center\">Plombery</h3>\n\n <p align=\"center\">\n \u5e26\u6709\u8212\u9002\u6613\u7528 Web UI \u7684 Python \u4efb\u52a1\u8c03\u5ea6\u7a0b\u5e8f\n <br />\n \u73b0\u5df2\u63d0\u4f9b\u975e\u5b98\u65b9\u7684\u4e2d\u6587\u7248\u672c\n <br />\n <br />\n <a href=\"https://lucafaggianelli.github.io/plombery/\"><strong>\u5b98\u65b9\u7f51\u7ad9 (\u82f1\u6587) \u00bb</strong></a>\n <br />\n <a href=\"https://yhdsl.github.io/plombery/\"><strong>\u975e\u5b98\u65b9\u7f51\u7ad9 (\u4e2d\u6587) \u00bb</strong></a>\n <br />\n <br />\n <a href=\"https://github.com/yhdsl/plombery\">GitHub</a>\n \u00b7\n <a href=\"https://github.com/yhdsl/plombery/issues\">\u62a5\u544a\u9519\u8bef</a>\n </p>\n</div>\n\n<!-- ABOUT THE PROJECT -->\n\n## \u5173\u4e8e Plombery \u9879\u76ee\n\nPlombery \u662f\u4e00\u4e2a\u5f00\u6e90\u7684 Python \u4efb\u52a1\u8c03\u5ea6\u7a0b\u5e8f\uff0c\u5e26\u6709\u7b80\u6d01\u6613\u7528\u7684 Web UI \u548c REST API\u3002\n\u5982\u679c\u4f60\u60f3\u91cd\u590d\u6267\u884c Python \u811a\u672c\u5e76\u76d1\u63a7\u8fd0\u884c\u72b6\u6001\uff0c\u90a3\u4e48\u8fd9\u4fbf\u662f\u9002\u5408\u4f60\u7684\u5de5\u5177\uff01\n\n<figure>\n <img src=\"https://github.com/yhdsl/plombery/raw/main/docs/assets/images/screenshot.png\" alt=\"Plombery \u5c4f\u5e55\u622a\u56fe\">\n</figure>\n\n> Plombery \u9879\u76ee\u5c1a\u5904\u4e8e\u8d77\u6b65\u9636\u6bb5\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u5927\u5bb6\u7684\u53cd\u9988\u548c\u5e2e\u52a9\u6765\u6539\u8fdb\u548c\u5b8c\u5584\uff01\n> \u5982\u679c\u4f60\u559c\u6b22\u5b83\uff0c\u8bf7\u4e3a\u539f\u59cb\u7684 Plombery \u9879\u76ee\u70b9\u70b9 Star \ud83c\udf1f!\n> \u5982\u679c\u4f60\u60f3\u8981\u67d0\u4e2a\u529f\u80fd\u6216\u53d1\u73b0\u9519\u8bef\uff0c\u8bf7\u63d0\u4ea4 issue\u3002\n\n## \u5173\u4e8e\u6b64\u4e2d\u6587\u9879\u76ee\n\n[Plombery](https://github.com/lucafaggianelli/plombery) \u662f\u4e00\u4e2a\u5141\u8bb8\u5b9a\u65f6\u6267\u884c Python \u811a\u672c\u7684\u9879\u76ee\uff0c\n\u5e76\u4e14\u81ea\u5e26\u4e00\u4e2a\u7f8e\u89c2\u7684 Web UI \u8fdb\u884c\u53ef\u89c6\u5316\u63a7\u5236\n\n\u76f8\u6bd4\u4e8e\u5176\u5b83\u5f00\u6e90\u8c03\u5ea6\u9879\u76ee\uff0c\nPlombery \u6784\u9020\u8bed\u6cd5\u7b80\u5355\uff0c\u5e76\u4e14\u6ca1\u6709\u5176\u5b83\u590d\u6742\u7684\u8bbe\u8ba1\u6216\u6982\u5ff5\uff0c\n\u5e76\u4e14**\u5b8c\u5168**\u5f00\u6e90\uff0c\u4e0d\u9700\u8981\u8003\u8651\u4efb\u4f55\u4ed8\u8d39\u5185\u5bb9\n\n\u4f46\u7531\u4e8e Plombery \u9879\u76ee\u5e76\u4e0d\u652f\u6301 i18n\uff0c\n\u6211\u624b\u52a8\u4fee\u6539\u4e86\u9879\u76ee\u5185\u786c\u7f16\u7801\u7684\u6587\u672c\uff0c\n\u5c06 Web UI \u548c\u90ae\u4ef6\u6587\u672c\u66f4\u6539\u4e3a\u4e2d\u6587\u9875\u9762\n\n\u6b64\u5916\uff0cPlombery \u9879\u76ee\u7684\u6587\u6863\u4e5f\u8fdb\u884c\u4e86\u6c49\u5316\uff0c\n\u5176\u4e2d\u8865\u5145\u8bf4\u660e\u4e86\u672c\u4e2d\u6587\u9879\u76ee\u989d\u5916\u6dfb\u52a0\u7684\u914d\u7f6e\u9879\n\n## \u529f\u80fd\n\n- \u23f0 \u57fa\u4e8e [APScheduler](https://github.com/agronholm/apscheduler) \u7684\u4efb\u52a1\u8c03\u5ea6\u529f\u80fd (\u652f\u6301 Interval\uff0c Cron \u548c Date \u89e6\u53d1\u5668)\n- \ud83d\udcbb \u5185\u7f6e Web UI, \u65e0\u9700\u989d\u5916\u4f7f\u7528 HTML/JS/CSS \u8fdb\u884c\u5f00\u53d1\n- \ud83d\udc69\u200d\ud83d\udcbb\ud83d\udc0d \u4ec5\u7528\u7eaf Python \u8bed\u6cd5\u5b9a\u4e49\u7ba1\u9053\u548c\u4efb\u52a1\n- \ud83c\udf9b\ufe0f \u53ef\u4ee5\u4f7f\u7528 [Pydantic](https://docs.pydantic.dev/) \u4e3a\u7ba1\u9053\u63d0\u4f9b\u53c2\u6570\n- \ud83d\udc49 \u53ef\u4ee5\u5728 Web UI \u4e2d\u624b\u52a8\u8fd0\u884c\u7ba1\u9053\n- \ud83d\udd10 \u53ef\u4ee5\u8bbe\u7f6e OAuth2 \u63d0\u4f9b\u4fdd\u62a4\n- \ud83d\udd0d \u901a\u8fc7\u65e5\u5fd7\u548c\u8f93\u51fa\u6570\u636e\u4fbf\u6377\u8c03\u8bd5\u6bcf\u6b21\u8fd0\u884c\n- \ud83d\udce9 \u5bf9\u7ba1\u9053\u8fdb\u884c\u76d1\u63a7\uff0c\u5e76\u5728\u51fa\u73b0\u95ee\u9898\u65f6\u6536\u5230\u544a\u8b66\u901a\u77e5\n- \ud83d\udca3 \u4f7f\u7528 REST API \u8fdb\u884c\u96c6\u6210\u5f00\u53d1\n\n\u4ec0\u4e48\u65f6\u5019\u4e0d\u8be5\u4f7f\u7528:\n\n- \u4f60\u9700\u8981\u5f88\u9ad8\u7684\u53ef\u6269\u5c55\u6027\uff0c\u5e76\u4e14\u5e0c\u671b\u5728\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e0a\u8fd0\u884c\n- \u4f60\u60f3\u8981\u4e00\u4e2a\u65e0\u4ee3\u7801\u5de5\u5177\uff0c\u6216\u8005\u4f60\u4e0d\u60f3\u4f7f\u7528 Python \u8fdb\u884c\u7f16\u5199\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n### \u5f00\u53d1\u8bed\u8a00\n\n[![Python][Python]][Python-url]\n[![TypeScript][TypeScript]][TypeScript-url]\n[![React][React.js]][React-url]\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n<!-- GETTING STARTED -->\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n\u5355\u51fb\u8fdb\u5165 \ud83d\udc49 [\u4e2d\u6587\u6587\u6863](https://yhdsl.github.io/plombery/) \u5feb\u901f\u5165\u95e8 Plombery\u3002\n\n## \ud83c\udfae \u5728 GitHub Codespaces \u4e0a\u5c1d\u8bd5\n\n\u5728 GitHub Codespaces \u4e0a\u4f7f\u7528\u6f14\u793a\u7ba1\u9053\u5c1d\u8bd5 Plombery:\n\n<figure align=\"center\">\n <img src=\"https://github.com/yhdsl/plombery/raw/main/docs/assets/images/codespaces.png\" alt=\"\u5728 GitHub Codespaces \u4e0a\u5c1d\u8bd5\">\n</figure>\n\nCodespaces \u662f\u4e00\u4e2a\u8fd0\u884c\u5728\u4e91\u4e2d\u7684\u5f00\u53d1\u73af\u5883\uff0c\u56e0\u6b64\u4f60\u65e0\u9700\u514b\u9686\u3001\u5b89\u88c5\u4f9d\u8d56\u7b49\u4fbf\u53ef\u4ee5\u8fd0\u884c\uff0c\n\u64cd\u4f5c\u6d41\u7a0b\u5982\u4e0b:\n\n- \u524d\u5f80 [yhdsl/plombery](https://github.com/yhdsl/plombery) GitHub \u9875\u9762\n- \u70b9\u51fb\u53f3\u4e0a\u89d2\u7eff\u8272\u7684 **Code** \u6309\u94ae\n- \u9009\u62e9 **Codespaces** \u9875\u9762\n- \u70b9\u51fb *create new codespace from main* \u6216\u4f7f\u7528\u5df2\u6709\u7684\u4ee3\u7801\u7a7a\u95f4\n- \u63a5\u4e0b\u6765\u4f1a\u6253\u5f00\u4e00\u4e2a `github.dev` \u9875\u9762, \u8bf7\u7b49\u5f85\u73af\u5883\u642d\u5efa\n- \u5f53\u4ee3\u7801\u7a7a\u95f4\u51c6\u5907\u5b8c\u6210\u540e\uff0c\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u7c7b\u4f3c VSCode \u7684\u9875\u9762\n- \u4e00\u4e9b\u4ee3\u7801\u5c06\u5728\u7ec8\u7aef\u5185\u6267\u884c\u4ee5\u6784\u5efa\u524d\u7aef\u9875\u9762\u7b49\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85\n- \u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u4e00\u4e2a Plombery \u9875\u9762\u5c06\u5728\u65b0\u6807\u7b7e\u9875\u4e2d\u6253\u5f00\n- \u4efb\u4f55\u5bf9 Python \u4ee3\u7801\u7684\u66f4\u6539\u5747\u4f1a\u5b9e\u65f6\u76f8\u5e94\u5728 Plombery \u9875\u9762\u5185\uff0c\u5c31\u50cf\u5728\u4f60\u672c\u5730\u7684\u7b14\u8bb0\u672c\u7535\u8111\u4e0a\u5f00\u53d1\u4e00\u6837\n\n## \ud83e\uddd0 \u5411\u6211\u5c55\u793a\u4ee3\u7801\uff01\n\n\u8fd9\u662f\u4e00\u4e2a\u6781\u7b80\u7684\u7ba1\u9053\u4ee3\u7801:\n\n<figure align=\"center\">\n <img src=\"https://github.com/yhdsl/plombery/raw/main/docs/assets/images/minimal-code.png\" alt=\"\u6781\u7b80\u7ba1\u9053\u4ee3\u7801\" width=\"80%\">\n <figcaption>\u6211\u77e5\u9053\u4f60\u60f3\u770b\u770b!</figcaption>\n</figure>\n\n<!-- ROADMAP -->\n\n## \ud83d\udee3 \u8def\u7ebf\u56fe\n\n\u67e5\u770b [open issues](https://github.com/yhdsl/plombery/issues) \u83b7\u53d6\u5b8c\u6574\u7684\u5efa\u8bae\u7684\u529f\u80fd (\u548c\u5df2\u77e5\u7684\u9519\u8bef) \u6e05\u5355\u3002\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n<!-- CONTRIBUTING -->\n\n## \ud83d\udc69\u200d\ud83d\udcbb \u8d21\u732e\n\n\u6b63\u662f\u8bf8\u591a\u8d21\u732e\u8005\u7684\u52aa\u529b\u8ba9\u5f00\u6e90\u793e\u533a\u6210\u4e3a\u4e86\u5b66\u4e60\u3001\u542f\u53d1\u548c\u521b\u9020\u7684\u7edd\u4f73\u573a\u6240\u3002\n\u6211\u4eec**\u975e\u5e38\u611f\u8c22**\u4f60\u7684\u4efb\u4f55\u8d21\u732e\u3002\n\n\u5982\u679c\u4f60\u6709\u4efb\u4f55\u6539\u8fdb\u7684\u5efa\u8bae\uff0c\u8bf7 fork \u539f\u59cb\u7684 Plombery \u4ed3\u5e93\u5e76\u4e3a\u5176\u521b\u5efa pull request\u3002\n\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u521b\u5efa\u4e00\u4e2a\u5e26\u6709 \"enhancement\" \u6807\u7b7e\u7684 issue\u3002\n\u522b\u5fd8\u4e86\u7ed9\u539f\u59cb\u7684 Plombery \u9879\u76ee\u70b9\u70b9 Star\uff01\u518d\u6b21\u611f\u8c22\uff01\n\n1. Fork \u9879\u76ee\n2. \u521b\u5efa\u4f60\u7684\u65b0\u529f\u80fd\u5206\u53c9 (`git checkout -b feature/AmazingFeature`)\n3. \u63d0\u4ea4\u4f60\u7684\u4fee\u6539 (`git commit -m 'Add some AmazingFeature'`)\n4. \u5411\u5206\u652f\u63a8\u9001\u4fee\u6539 (`git push origin feature/AmazingFeature`)\n5. \u521b\u5efa\u4e00\u4e2a Pull Request\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n### \u5f00\u53d1\n\n\u514b\u9686\u6b64 repo \u7684\u4e00\u4e2a\u5206\u652f\u5e76\u8bbe\u7f6e\u5f00\u53d1\u73af\u5883\u3002\n\n\u521b\u5efa\u4e00\u4e2a python \u865a\u62df\u73af\u5883:\n\n```sh\npython -m venv .venv\n# \u4f7f\u7528 Mac/Linux \u64cd\u4f5c\u7cfb\u7edf\nsource .venv/bin/activate\n# \u4f7f\u7528 Win \u64cd\u4f5c\u7cfb\u7edf\n.venv/Script/activate\n```\n\n\u5e76\u5b89\u88c5\u4f9d\u8d56\u9879:\n\n```sh\npip install -r requirements.txt\npip install -r requirements-dev.txt\n```\n\n> \u672c\u4e2d\u6587\u9879\u76ee\u5df2\u7ecf\u8865\u9f50\u4e86\u539f\u59cb\u7684 Plombery \u4ed3\u5e93\u4e2d\u4e22\u5931\u7684 `requirements.txt` \u6587\u4ef6\n> \u5f53\u524d\u4f60\u4e5f\u53ef\u4ee5\u4ece `pyproject.toml` \u4e2d\u5b89\u88c5\n\n\u51fa\u4e8e\u5f00\u53d1\u7684\u76ee\u7684\uff0c\u8fd0\u884c\u793a\u4f8b\u7a0b\u5e8f\u5c06\u5f88\u6709\u5e2e\u52a9:\n\n```sh\ncd examples/\n\n# \u4e3a\u793a\u4f8b\u7a0b\u5e8f\u521b\u5efa\u4e00\u4e2a\u865a\u62df\u73af\u5883\npython -m venv .venv\nsource .venv/bin/activate\npip install -r requirements\n\n./run.sh\n# \u6216\u8005\u5728 Win \u64cd\u4f5c\u7cfb\u7edf\u4e0a\u4f7f\u7528 ./run.ps1\n```\n\nReact \u524d\u7aef\u4f4d\u4e8e `frontend/` \u6587\u4ef6\u5939\u4e0b\uff0c\n\u8fdb\u5165\u8be5\u6587\u4ef6\u5939\u5e76\u5b89\u88c5\u4f9d\u8d56:\n\n```sh\ncd frontend/\n# \u539f\u59cb\u7684 Plombery \u4ed3\u5e93\u4f7f\u7528 yarn \u505a\u4e3a\u5305\u7ba1\u7406\u5668\n# \u63a5\u4e0b\u6765\u7684\u547d\u4ee4\u5c06\u5b89\u88c5\u4f9d\u8d56\u9879\n# \u5982\u679c\u4f60\u662f\u514b\u9686\u7684\u672c\u4e2d\u6587\u4ed3\u5e93\n# \u8bf7\u6539\u7528\u4e0b\u9762\u7684 npm \u547d\u4ee4\nyarn\n```\n\n```sh\ncd frontend/\n# \u5982\u679c\u4f60\u662f\u514b\u9686\u7684\u672c\u4e2d\u6587\u4ed3\u5e93\n# \u8bf7\u6539\u7528 npm \u547d\u4ee4\nnpm install\n```\n\n\u8fd0\u884c\u5f00\u53d1\u670d\u52a1\u5668:\n\n```sh\nyarn dev\n```\n\n```sh\nnpm run dev\n```\n\n\u6784\u5efa\u524d\u7aef\n\n```sh\nyarn run build\n```\n\n```sh\nnpm run build\n```\n\n### \u6587\u6863\n\n\u6587\u6863\u7f51\u7ad9\u57fa\u4e8e MkDocs Material \u5f00\u53d1\uff0c\n\u5176\u4e2d\u6e90\u4ee3\u7801\u4f4d\u4e8e `docs/` \u6587\u4ef6\u5939\u4e0b\uff0c\n\u800c\u914d\u7f6e\u50a8\u5b58\u5728 `mkdocs.yml` \u6587\u4ef6\u5185\u3002\n\n\u8981\u8fd0\u884c\u672c\u5730\u5f00\u53d1\u670d\u52a1\u5668\uff0c\u8bf7\u6267\u884c:\n\n```\nmkdocs serve\n```\n\n### \u6d4b\u8bd5\n\n\u6d4b\u8bd5\u5957\u4ef6\u57fa\u4e8e `pytest`\u7f16\u5199\uff0c\u56e0\u6b64\u4ec5\u9700\u6267\u884c:\n\n```sh\npytest\n```\n\n\u4e3a\u4e86\u83b7\u53d6\u6d4b\u8bd5\u8986\u76d6\u7387\uff0c\u8bf7\u6267\u884c:\n\n```sh\ncoverage run -m pytest\ncoverage report -m\n```\n\n<!-- LICENSE -->\n\n## \u5f00\u6e90\u534f\u8bae\n\n\u672c\u4e2d\u6587\u9879\u76ee\u4e0e\u539f\u59cb\u7684 Plombery \u4ed3\u5e93\u4e00\u6837\uff0c \u91c7\u7528 MTL \u534f\u8bae\u53d1\u5e03\u3002\n\u8bf7\u53c2\u9605\u672c\u4e2d\u6587\u9879\u76ee\u548c\u539f\u59cb Plombery \u4ed3\u5e93\u4e0b\u7684 `LICENSE.txt` \u6587\u4ef6\u83b7\u53d6\u66f4\u591a\u4fe1\u606f\u3002\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n<!-- CONTACT -->\n\n## \u94fe\u63a5\n\n- \u539f\u59cb Plombery \u9879\u76ee: [https://github.com/lucafaggianelli/plombery](https://github.com/lucafaggianelli/plombery)\n- \u672c\u4e2d\u6587\u9879\u76ee: [https://github.com/yhdsl/plombery](https://github.com/yhdsl/plombery)\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n<!-- ACKNOWLEDGMENTS -->\n\n## \u81f4\u8c22\n\nPlombery \u5efa\u7acb\u5728\u4ee5\u4e0b\u4ee4\u4eba\u60ca\u53f9\u7684\u6280\u672f\u4e4b\u4e0a:\n\n- [FastAPI](https://fastapi.tiangolo.com/)\n- [Pydantic](https://docs.pydantic.dev/)\n- [APScheduler](https://apscheduler.readthedocs.io/)\n- [Apprise](https://github.com/caronc/apprise)\n- [React](https://react.dev/)\n- [Vite](https://vitejs.dev/)\n- [Tremor](https://www.tremor.so/)\n\n<p align=\"right\">(<a href=\"#readme-top\">\u8fd4\u56de\u9876\u90e8</a>)</p>\n\n<!-- MARKDOWN LINKS & IMAGES -->\n<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->\n\n[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB\n[React-url]: https://reactjs.org/\n[Python]: https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=yellow\n[Python-url]: https://www.python.org/\n[TypeScript]: https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white\n[TypeScript-url]: https://www.typescriptlang.org/\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Bring Chinese page to project plombery",
"version": "0.4.1",
"project_urls": null,
"split_keywords": [
"pipeline",
" task-scheduler",
" apscheduler",
" orchestrator",
" web-ui",
" fastapi",
" pydantic",
" plombery",
" chinese"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "23703beab3b7f46813d1456449114b12fc77bac66ddf9e319c53f5b54a0fb272",
"md5": "3c935260bf176cfcfe9701f7d730ae31",
"sha256": "55f34e84e70a1932e94494615e4c0fa72436d7f4bb97a023fb4e1647809f4f18"
},
"downloads": -1,
"filename": "plombery_chinese-0.4.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3c935260bf176cfcfe9701f7d730ae31",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 632414,
"upload_time": "2024-08-22T03:34:01",
"upload_time_iso_8601": "2024-08-22T03:34:01.719121Z",
"url": "https://files.pythonhosted.org/packages/23/70/3beab3b7f46813d1456449114b12fc77bac66ddf9e319c53f5b54a0fb272/plombery_chinese-0.4.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "36e215c05db365ad4cfb110c71a137bfea4a69636aeac982fb52f6905f90fb87",
"md5": "6f278a891dc353b041d8d43d3db8c9c5",
"sha256": "36bb0eb0cbfd33133965a1790b84dd818598c2e43b3b3fb40423fff62475ed0b"
},
"downloads": -1,
"filename": "plombery_chinese-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "6f278a891dc353b041d8d43d3db8c9c5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 627253,
"upload_time": "2024-08-22T03:34:03",
"upload_time_iso_8601": "2024-08-22T03:34:03.260894Z",
"url": "https://files.pythonhosted.org/packages/36/e2/15c05db365ad4cfb110c71a137bfea4a69636aeac982fb52f6905f90fb87/plombery_chinese-0.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-22 03:34:03",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "plombery-chinese"
}