<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>开源项目 &#8211; 李辉 / Grey Li</title>
	<atom:link href="https://greyli.com/tag/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/feed/" rel="self" type="application/rss+xml" />
	<link>https://greyli.com</link>
	<description>一个编程和写作爱好者的在线记事本</description>
	<lastBuildDate>Thu, 06 Nov 2025 11:36:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>

<image>
	<url>https://greyli.com/wp-content/uploads/2025/03/avatar-500-compressed-144x144.jpg</url>
	<title>开源项目 &#8211; 李辉 / Grey Li</title>
	<link>https://greyli.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>APIFlask 2.0 版本发布</title>
		<link>https://greyli.com/apiflask2/</link>
		<comments>https://greyli.com/apiflask2/#comments</comments>
		<pubDate>Wed, 26 Jul 2023 14:56:23 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[APIFlask]]></category>
		<category><![CDATA[开源项目]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=5170</guid>
		<description><![CDATA[一边上班一边赶工做开源项目真是太累了。更不用说还要一边焦虑写书的进度。不过这次 2.0 版本基本把想做的功能都 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>一边上班一边赶工做开源项目真是太累了。更不用说还要一边焦虑写书的进度。不过这次 2.0 版本基本把想做的功能都完成了，剩下两个大的功能（为蓝本拆分单独的 OpenAPI Spec、解耦 marshmallow）实在是没精力加进来了，只好放到 2.1。</p>
<p>APIFlask 2.0 版本的 codename 是 Gongqing（年初我从五角场搬到了共青森林公园旁边。没错，1.0 版本是 Wujiaochang）。</p>
<p>回到正题，这次最主要的一个变动（breaking change）是把所有 input 装饰器的参数改成了关键字参数。</p>
<pre><span class="nd">@app</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s1">'/pets'</span><span class="p">)</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">input</span><span class="p">(</span><span class="n">PetQuery</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="s1">'query'</span><span class="p">)</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">input</span><span class="p">(</span><span class="n">PetIn</span><span class="p">)</span>  <span class="c1"># equals to app.input(PetIn, location='json')</span>
<span class="k">def</span> <span class="nf">create_pet</span><span class="p">(</span><span class="n">query_data</span><span class="p">,</span> <span class="n">json_data</span><span class="p">):</span>
    <span class="k">pass</span></pre>
<p>关键字参数的名字默认是 <code>{location}_data</code>，通过 <code>arg_name</code> 参数可以自定义。这个改动让我删掉了很多 hack Flask 的代码。推动这个功能在上游 <a href="https://github.com/marshmallow-code/webargs/issues/830">webargs</a> 实现，所以不用加代码在自己这里。再加上一些改动已经在 Flask 实现了，又删掉一些。非常轻松。理想情况是，文档越来越多，代码越来越少。</p>
<p>如果你感兴趣的话，下面是 2.0 版本的详细内容：</p>
<ul>
<li><a href="https://apiflask.com/changelog/#version-200">Changelog</a></li>
<li><a href="https://apiflask.com/migration_guide/#migrate-to-apiflask-2x">2.0 migration guide</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/apiflask2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>比修 Typo 还简单的开源贡献方式</title>
		<link>https://greyli.com/better-than-typo-fix/</link>
		<comments>https://greyli.com/better-than-typo-fix/#comments</comments>
		<pubDate>Sun, 21 Jun 2020 12:25:45 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[思考与随感]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[WTForms]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[开源贡献]]></category>
		<category><![CDATA[开源项目]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=3124</guid>
		<description><![CDATA[最近给 WTForms 提交了一个 PR，这个 PR 向源码、测试和本地化文件里添加了 537 个句号。听起来 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="md-end-block md-p md-focus"><span class="md-plain">最近给 WTForms 提交了一个 <a href="https://github.com/wtforms/wtforms/pull/620">PR</a>，这个 PR 向源码、测试和本地化文件里添加了 537 个句号。听起来似乎很奇怪，为什么 WTForms 会需要增加 537 个句号？别着急，下面会慢慢解释（事实上我只完成了一部分的工作，还有大概 500 个句号需要添加）。我发现我似乎很喜欢提交这种 PR，这类开源贡献没有太多技术含量（基本就是体力活），但是能有效提高项目的整体完美度，让用户获得更一致和舒服的体验。下面是一些可以归到这一类开源贡献的 PR。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-plain">1. 给 WTForms 添加 537 个句号</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://github.com/wtforms/wtforms/pull/620">https://github.com/wtforms/wtforms/pull/620</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">WTForms 从添加 CSRF 保护功能作为分界，之前定义的验证错误消息都包含结尾的句号，之后的错误消息都漏掉了句号。这会导致错误消息不一致（想象同一个表单显示两个输入框的错误消息，一个有句号，一个没有句号）。这个 PR 补齐了源码、测试、本地化文本（POT 和部分 PO 文件）中错误消息的句号，包括 506 个英文句号和 31 个中文句号。</span></p>
<p class="md-end-block md-p"><span class="md-plain">本地化文件在翻译时大都按照源文本决定是否添加句号，所以也存在错误消息不一致的问题。因为精力有限，在 32 个本地化文件里，我只更新了简体中文、繁体中文、日文、德文和俄文。大概还有</span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://github.com/wtforms/wtforms/tree/master/src/wtforms/locale"><span class="md-plain">二十几个本地化文件</span></a></span><span class="md-plain">需要进行确认和更新，如果感兴趣的话，你可以考虑去做这件事。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-plain">2. 给 Flask 添加 96 个美元符号</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://github.com/pallets/flask/pull/2877">https://github.com/pallets/flask/pull/2877</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">Flask 文档、和各类 README.md 文件里对于命令行命令的标识很混乱，有时没有命令提示符，有时用「&gt;」，有时用「$」，有时用「#」。这个 PR 统一了所有命令行命令，统一添加美元符号作为提示符，仅在需要明确区分 Windows 命令的几处使用「&gt;」。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-plain">3. 给 Flask 更换 13 个 URL</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://github.com/pallets/flask/pull/3427">https://github.com/pallets/flask/pull/3427</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">Flask 去年陆续把文档迁移到了 palletsprojects.com 域名下， 访问旧的 pocoo.org 会进行跳转，这个 PR 更新了所有文档和源码里的旧 URL。</span></p>
<p><span class="md-pair-s"><strong><span class="md-plain">4. 给 <span class="md-meta-i-c md-link">PyCon China</span> 和 <span class="md-meta-i-c md-link">FlaskCon</span> 压缩 119 张图片</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">除此之外，勉强能沾上边的还有给 </span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://cn.pycon.org"><span class="md-plain">PyCon China</span></a></span><span class="md-plain"> 和 </span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://flaskcon.com"><span class="md-plain">FlaskCon</span></a></span><span class="md-plain"> 的网站分别压缩了 105 和 14 张图片。因为缺乏规范，有些技术大会的网站图片在上传之前没有经过压缩和裁剪，这会让页面加载变得非常慢。这两个 PR（</span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://github.com/PyConChina/PyConChina2019/pull/3"><span class="md-plain">PyConChina #3</span></a></span><span class="md-plain">，</span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://github.com/FlaskCon/website/pull/7"><span class="md-plain">FlaskCon #7</span></a></span><span class="md-plain">）分别让两个网站的图片总大小从 25M 和 4M 降低到 5M 和 967KB。</span></p>
<p class="md-end-block md-p"><span class="md-plain">给文档修 typo 是很常见的开源贡献类型，这也是很多人一开始参与开源的方式。有人甚至会走火入魔最后变成专业的「开源 typo 修复专家」，不停的用英文语法检查工具去检查每一个流行的开源项目文档……相比之下，上面这一类 PR 要比修 typo 更简单（在智力上），有时也更有价值。</span></p>
<p class="md-end-block md-p"><span class="md-plain">我发现相对于技术实现，我其实更关注 API 设计和用户体验，总想要尽可能的追求设计的一致和美观。这也导致我会在写作和编程时花费大量时间在命名、文件组织、措辞、章节安排、排版、文案和彩蛋这些事情上。这大概就是我编程水平进步缓慢、写作速度缓慢的原因。</span></p>
<p class="md-end-block md-p"><span class="md-plain">P.S. 文中的数字都是估算，大概会有 1~5 左右的偏差。精确的数字是为了让措辞看起来更一致和美观瞎编的。</span></p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/better-than-typo-fix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
