分类 开源项目 下的文章

这是今年coding生涯里最开心的一件事:给最爱用的框架贡献了几行代码,虽然微不足道,但是非常有幸福感,也是特意记下来,把喜悦分享给有缘人~

缘起

一直以来想要突破花瓣和Pinterest对收图的限制,所以最近几天一直在折腾自己部署一个私有的花瓣网类似物,发现了一个叫Pinry的项目,但是作者也比较久没有更新了,feature上不是很完善,所以这几天一直在给这个项目发Pull Request.

在做PR的过程中,发现在采集图片的的过程中,保存WebP格式的文件会出错,而且错误来自django框架而不是 Pinry 项目本身,DjangoImageField 在保存图片的过程中,会尝试自动探测图片的尺寸。

为了提升效率,Django会尝试将图片文件的前面部分数据喂到 Pillow 里然后尝试解析出文件的元数据。

因为大部分图片源文件只要读取头部的部分数据就能获取到信息,所以这个方法通常都能工作得非常好,但是对于少部分图片,header 的 size 非常大,或者是分chunk的图片,或者流式的数据,需要读取很多数据才能获得完整的meta信息。

Django 的 ImageField 其实处理了这类问题,但是在捕获错误的时候,有一个 edge-case 没考虑到,就是读取WebP文件的时候,Pillow 会产生一个 RuntimeError ,这个未捕获的错误会导致Django产生内部错误,具体请参考:#29705 RuntimeError while saving webp file to ImageField

流程

提交Ticket前的准备

第一次给Django提交Ticket,首先跑去阅读了,啥都不懂,不过根据之前的经验,大概要考虑以下几个问题:

  • 怎么创建Ticket(Issue),怎么描述问题
  • 创建一个脚本或者可用的案例,来稳定的复现Bug
  • 创建一个Patch,并提交到相应的项目(Django使用Github跟踪和Review)

怎么创建Ticket

赶紧去阅读了一下Django提供的文档: 参见 Contribute to Django,有几个要点:

  • Reporting bugs and <strike>requesting features</strike>(因为是提交Bug,所以忽略后半)

    • 要点主要是描述Bug发现的 软件硬件环境, 复现方法样例脚本(可选),Bug 出现的 branch 可以在 Trac 系统内选择,要注意的是安全问题需要单独到另一个地方提交。
    • Django Trac 提供的选项非常多,基本上涵盖了整个bug修复流程中的所有中间过程和对bug提出者,修复者的要求。
    • 如果要自己修复,把bug assigin给自己即可

我创建了一个项目用来复现这个bug,并集成了travis-ci用来线上执行这个复现测试

实际上这个东西可以没有,可以只是简单描述复现条件和复现用的脚本,直接写到Issue里就好。

创建Patch

因为之前没给Django贡献过代码,所以赶紧去看了一下 Django Github Pull Request, 从这里就能看到他们的Pull Request标题是什么格式的,这个格式关联到他们的 CI , 所以非常重要,可以用来自动关闭 Ticket 。

  • 关于DjangoProject的 编码风格,可以参考先前提到的 Contribution Guide
  • 代码写好后,要本地跑一遍单元测试,这种Bug需要增加一个回归测试,用于测试以后的更改是否会导致这个Bug再次出现。

我最后的 Pull Request

Review 和 Merge

Django社区的效率非常高,真的非常惊喜,当天就完成了Review和Merge到Master的流程。

中间也得到了很多帮助和修改意见,详情可以参看 Pull Request。

结语

感慨Django社区的效率,第一次给一个非常活跃的项目贡献代码,也是达成了新成就,虽然只是个小Bug,不过非常开心~
希望这个流水账能帮到想要给项目贡献代码的朋友~

PS: 最近也在积极给 Pinry 贡献代码,希望能有更多的给 创作者 们使用的项目,能给 设计师/画师/写作者 们带来更多方便和自由和更高的生产力,也是我今后最想做的事情:)

其他创作者相关的工具:

  • PickTrue 图册下载器,最近新弄的项目,用来给 画师/设计师 们构建 Visual Library 目前支持Artstation, Pixiv,花瓣网。
  • Pinry - 个人版的花瓣(Pinterest) 可以不受限制(比如NFSW,版权)的限制收图,当然记得尊重版权,收图可以,不要到处传播哦。
  • TabArtstation - Chrome插件 , 在Chrome新标签中查看Artstation每日更新,收图必备,适合没时间去专门刷Artstation的同学
  • huaban-exporter - 花瓣导出器, 很早之前做的花瓣备份工具,会连同花瓣的元数据(比如描述,图片源链接)一起下载到本地,如果没有元数据需求,可以直接使用PickTrue

CmdTree是一个命令行库,参见 这里

https://github.com/winkidney/cmdtree

轮子满地都是……然而我又再造了一个(自尽

现有的库虽然有各自的设计哲学,却无法满足某些特定的需求:)。

能不能享受click带来的便利的同时,也能获取到argparse的子命令支持呢?

为了不再每次都要重复解决这个问题,复制粘贴代码,我写了CmdTree.

- 阅读剩余部分 -