如何贡献


我非常欢迎任何有助于改进和扩展 mlxtend 功能的贡献。

快速贡献者清单

这是一个关于典型贡献 mlxtend(以及其他开源项目)不同步骤的快速清单。建议将此列表复制到本地文本文件(或问题跟踪器)中,并在进行过程中逐项勾选。

2. 同步你的 Fork

首先,通过执行以下命令获取原始项目主分支的更新:

$ git fetch upstream

你应该会看到以下输出:

remote: Counting objects: xx, done.
remote: Compressing objects: 100% (xx/xx), done.
remote: Total xx (delta xx), reused xx (delta x)
Unpacking objects: 100% (xx/xx), done.
From https://github.com/rasbt/mlxtend
 * [new branch]      master     -> upstream/master

这意味着 rasbt/mlxtend 主分支的提交现在存储在本地分支 upstream/master 中。

如果你尚未切换到本地项目的主分支,请执行:

$ git checkout master

最后,通过执行以下命令将 upstream/master 中的更改合并到你的本地主分支:

$ git merge upstream/master

这将给你一个类似以下的输出:

Updating xxx...xxx
Fast-forward
SOME FILE1                    |    12 +++++++
SOME FILE2                    |    10 +++++++
2 files changed, 22 insertions(+),

*主要工作流程 - 在新主题分支中进行更改

以下列出了贡献的9个典型步骤。

1. 讨论功能或修改

在开始编码之前,请在项目的问题跟踪器上讨论新功能、错误修复或其他修改。在打开“新问题”之前,请快速搜索以查看是否已有类似的问题提交。

2. 创建新功能分支

请避免直接在主分支上工作,而是创建一个新的功能分支:

$ git branch <new_feature>

通过执行以下命令切换到新功能分支:

$ git checkout <new_feature>

3. 开发新功能/修复错误

现在是时候修改现有代码或为项目贡献新代码了。

4. 测试你的代码

添加相应的单元测试并检查它们是否通过:

$ PYTHONPATH='.' pytest ./mlxtend ---with-coverage

5. 记录更改

请在 mlxtend/docs/sources/changelog.md 文件中添加一个条目。如果是新功能,如果能在 mlxtend/sources 的适当位置更新文档,那就更好了。

6. 提交更改

当你准备好提交更改时,请提供一个有意义的 commit 消息:

$ git add <modifies_files> # 或 `git add .`
$ git commit -m '<meaningful commit message>'

7. 可选:压缩提交

如果你进行了多次较小的提交,最好将它们分组为一个较大的总结性提交。首先,通过以下命令列出你最近的提交:

注意
由于 GitHub UI 的改进,这不再必要/不鼓励。

$ git log

默认情况下,这将按从新到旧的顺序列出提交,格式如下:

commit 046e3af8a9127df8eac879454f029937c8a31c41
Author: rasbt <mail@sebastianraschka.com>
Date:   Tue Nov 24 03:46:37 2015 -0500

    fixed setup.py

commit c3c00f6ba0e8f48bbe1c9081b8ae3817e57ecc5c
Author: rasbt <mail@sebastianraschka.com>
Date:   Tue Nov 24 03:04:39 2015 -0500

        documented feature x

commit d87934fe8726c46f0b166d6290a3bf38915d6e75
Author: rasbt <mail@sebastianraschka.com>
Date:   Tue Nov 24 02:44:45 2015 -0500

        added support for feature x

假设将这3个提交分组到一个提交中是有意义的,我们可以执行:

$ git rebase -i HEAD~3

这将打开默认的 git 编辑器,内容如下:

pick d87934f added support for feature x
pick c3c00f6 documented feature x
pick 046e3af fixed setup.py

由于 c3c00f6046e3affeature x 的原始提交相关,让我们保留 d87934f 并将接下来的两个提交压缩到这个初始提交中,方法是将行更改为:

pick d87934f added support for feature x
squash c3c00f6 documented feature x
squash 046e3af fixed setup.py

现在,在编辑器中保存更改。退出编辑器将应用 rebase 更改,编辑器将再次打开,提示你输入新的提交消息。在这种情况下,我们可以输入 support for feature x 来总结这些贡献。

8. 上传更改

通过执行以下命令将你的更改推送到 git 服务器上的主题分支:

$ git push origin <feature_branch>

9. 提交 pull request

转到你的 GitHub 在线仓库,选择新功能分支,并提交一个新的拉取请求:


开发者须知

构建文档

文档通过 MkDocs 构建;为了确保文档正确渲染,你可以通过在 mlxtend/docs 目录中执行 mkdocs serve 来在本地查看文档。

例如:

~/github/mlxtend/docs$ mkdocs serve

1. 构建 API 文档

要构建API文档,请导航到 mlxtend/docs 并在此目录下执行 make_api.py 文件:

~/github/mlxtend/docs$ python make_api.py

这应将API文档放置到以下两个目录中的正确位置:

2. 编辑用户指南

包含“用户指南”代码示例的文档是从IPython Notebook文件生成的。为了在编辑后将IPython笔记本文件转换为Markdown,请按照以下步骤操作:

  1. 修改或编辑现有的笔记本。
  2. 执行当前笔记本中的所有单元格,并确保没有错误发生。
  3. 使用 ipynb2markdown.py 转换器将笔记本转换为Markdown
~/github/mlxtend/docs$ python ipynb2markdown.py --ipynb ./sources/user_guide/subpackage/notebookname.ipynb

注意

如果您正在添加新文档,请同时将其包含在 mlxtend/docs/mkdocs.yml 文件的pages部分中。

3. 构建文档的静态HTML文件

首先,请通过本地主机(https://127.0.0.1:8000/)检查文档:

~/github/mlxtend/docs$ mkdocs serve

接下来,通过以下命令构建mlxtend文档的静态HTML文件:

~/github/mlxtend/docs$ mkdocs build --clean

要部署文档,请执行:

~/github/mlxtend/docs$ mkdocs gh-deploy --clean

4. 生成文档的PDF版本

要生成文档的PDF版本,只需进入 mlxtend/docs 目录并执行:

python md2pdf.py

将新版本上传到PyPI

1. 创建新的测试环境

假设我们使用 conda,通过以下命令创建一个新的Python环境:

$ conda create -n 'mlxtend-testing' python=3 numpy scipy pandas

接下来,通过执行以下命令激活环境:

$ source activate mlxtend-testing

2. 从本地文件安装包

通过执行以下命令测试安装:

$ python setup.py install --record files.txt

--record files.txt 标志将创建一个 files.txt 文件,列出这些文件将被安装的位置。

尝试导入包以查看是否正常工作,例如通过执行:

$ python -c 'import mlxtend; print(mlxtend.__file__)'

如果一切看起来正常,通过以下命令移除安装:

$ cat files.txt | xargs rm -rf ; rm files.txt

接下来,测试 pip 是否能够安装包。首先,导航到一个不同的目录,然后从那里安装包:

$ pip install mlxtend

并再次卸载它:

$ pip uninstall mlxtend

3. 部署包

首先考虑将包部署到PyPI测试服务器。设置说明可以在这里找到:https://wiki.python.org/moin/TestPyPI

首先,如果您还没有安装Twine,请安装它。例如,使用以下命令安装所有推荐的包:

$ python -m pip install twine build

其次,创建分发包。默认情况下,这会在 ./dist 目录中创建一个sdist和一个wheel。

$ python -m build

安装wheel和sdist以确保它们正常工作。分发文件名会随着每个版本而变化。

python -m pip install ./dist/mlxtend-0.23.0.dev0.tar.gz --force-reinstall
python -m pip install ./dist/mlxtend-0.23.0.dev0-py3-none-any.whl --force-reinstall
python -m pip uninstall mlxtend

第三,将包上传到测试服务器:

$ twine upload --repository-url https://upload.pypi.org/legacy dist/

然后,安装它并查看是否正常工作:

$ pip install -i https://testpypi.python.org/pypi mlxtend

接下来,再次卸载它:

$ pip uninstall mlxtend

第四,在这次干运行成功后,使用“真实”的PyPI重复此过程:

$ python -m twine upload  dist/*

4. 移除虚拟环境

最后,为了清理本地驱动器,通过以下命令移除虚拟测试环境:

$ conda remove --name 'mlxtend-testing' --all

注意

如果您遇到类似以下的错误:

HTTPError: 403 Forbidden from https://upload.pypi.org/legacy/

请确保您安装了最新版本的Twine(对我来说,卸载conda中的版本并通过pip安装有所帮助。)

5. 更新conda-forge配方

一旦mlxtend的新版本上传到PyPI,请在 https://github.com/conda-forge/mlxtend-feedstock 更新conda-forge构建配方,通过适当更改 recipe/meta.yaml 文件中的版本号。