在我最后的 Hacktoberfest 贡献中,我参与了一个名为 Bytechef 的项目。 Bytechef 是一个低代码 API 集成和工作流程自动化平台。它允许您通过 API 与大量受支持的服务进行交互,方法是添加和连接各种组件来创建可以使用 API 响应的控制流。
网站 - 文档 - Discord - Twitter
更新:ByteChef 正在积极开发中。我们正处于 alpha 阶段,某些功能可能会丢失或禁用。
ByteChef 是一个开源、低代码、可扩展的 API 集成和工作流程自动化平台。 ByteChef 可以帮助您:
我的任务是向名为 Baserow 的数据库服务组件添加新功能。我必须开发的功能是一个“动作”(即组件的函数),它允许组件更新数据库中的一行。
为 Baserow 组件实现更新行操作,以允许用户修改 Baserow 数据库中表中的特定行。
动作属性:
输出:
文档参考:https://baserow.io/api-docs
</div> <div class="gh-btn-container"><a class="gh-btn" href="https://github.com/bytechefhq/bytechef/issues/1645">View on GitHub</a></div>
在注册此问题之前,我很少使用 Java。我只在学校课程中做过小型 JavaFX 程序,但我一直想了解更多。我在自己的时间里学习了一些,所以我对包、访问修饰符、依赖项和 Gradle(项目使用的构建工具)等概念有一定程度的熟悉。了解这些肯定会让进入这个项目变得不那么令人生畏。我了解项目结构,因为我了解了 Gradle 项目如何由子项目和子包组成,每个子项目和子包都具有不同的构建配置。
我的同学 Arina 注意到我们都在同一个项目上工作,她很友善地通过链接到添加组件的开发人员文档以及已经为该组件定义的操作来给我一些指示,这意味着我不必亲自查看存储库来查找相关文件/目录。但如果必须的话,我会使用 git grep、GitHub 的代码搜索或 IntelliJ 的搜索。我确实使用 git Blame 来检查我要处理的组件的历史记录,发现它都是在一次提交中开发的。
该项目的贡献文档非常容易理解,并一步步列出了详细的说明。但该项目似乎非常年轻 - 我注意到一些自述文件刚刚写着 // TODO。
在进行更改之前,我尝试编译并运行该程序以查看它是如何工作的,但这是一个艰难的过程。下面是我做的笔记:
编译完成后(花了一个多小时),我运行了它,这样我就可以检查现有的组件。我尝试创建一个帐户来使用客户端,但它不允许我这样做,所以我回到贡献文档,发现它带有一个可用于开发的管理员帐户,我认为该帐户是在运行 docker 时创建的-撰写。
登录后,我尝试制作 Baserow 组件,但客户端有点慢,所以我不小心复制了一个。当我尝试删除它时,客户端冻结了,所以我点击刷新,然后开始出现服务器错误并且客户端超时。我尝试重新启动服务器和客户端,但花了很长时间 - 在我看来似乎又要花一个小时。等了大约 16 分钟后,我就到此为止了,并决定稍后再做。
我害怕回到这个项目,并且不得不处理长达一小时的编译时间,但随着 Hacktoberfest 接近结束,我没有太多选择。因此,想象一下当项目构建没有错误并且在不到五分钟的时间内启动并运行时,我感到多么惊讶。发生了什么变化?我不知道。
所以我跳上客户端并找到了 Baserow 组件。
图 - Baserow 组件及其上的现有操作
要添加“创建行”操作,我需要查看 Baserow API 文档,该文档由维护者链接到我。我必须创建一个 Baserow 帐户才能查看文档,我认为这有点奇怪,但也没什么大不了的。
所以我测试了现有的操作“创建行”,并遇到了一个错误,整个页面变成了错误消息。我以为我输入了一个意外的值,但后来我发现这个错误已经被一个与我无关的单独问题跟踪。
在随后的测试尝试中,“创建行”操作成功了,因此我认为它是一个很好的学习尝试并理解操作是如何创建的候选者。我随后交叉引用了该问题、现有操作和贡献文档。
我了解到,操作是通过定义所需的输入参数、输出模式以及定义操作执行的实际过程的方法来创建的。
在创建行操作中,我看到有一个方法可以获取表中一行的字段,该方法用于定义输入参数。我意识到我可以在我的操作中使用它,但它的命名好像它仅用于“创建行”操作。我认为使用它很有意义,所以我继续使用它并决定让维护人员知道。
在阅读 Baserow API 文档时,我了解到要更新行,您需要使用名为“PATCH”的 HTTP 方法,而我什至不知道该方法的存在。 PATCH 类似于 PUT,但不是替换资源,而是部分更改资源。有趣的东西。
所以我开始实际编写我的操作,并且我能够从现有操作中提取几乎整个代码。我只需对其接受的参数(我添加了一个行 ID 来标识要更新的行)、输出架构及其调用的方法(更改了端点和 HTTP 方法)进行了轻微调整。为了允许行 ID,我必须向 Constant/ 子目录中的文件添加一个常量,其中包含与 Baserow 组件相关的所有常量。
我注意到所有现有的源代码文件都有一个许可证头,所以我也将其复制到我的中。我组织了我的导入,格式化了我的代码,现在是时候手动测试它了。
此时,我注意到“创建行”操作(已经存在的操作)的描述是错误的 - 它说它在 Baserow 的示例数据库中创建一行,它通过名称引用该行,而不仅仅是说您可以创建一行。我也向维护者做了注释,向维护者提及这一点:
图 - Create Row 组件的描述不正确
我的操作出现在客户端中,视觉上一切看起来都很好:
标题和描述出现:
显示属性(即输入参数):
工作流程成功运行,我收到了成功的响应:
表格已在我的 Baserow 帐户中更新:
我对自己的更改感到满意,因此我继续运行格式化程序和测试,但测试失败了,因为其中一项测试预计 Baserow 组件仅对其执行一项操作。我更新了测试以适应我的新操作,并运行了一个自动生成组件文档的脚本。重新运行测试时,它们通过了,但我仍然必须为我的操作添加单元测试。我查看了现有组件的单元测试,结果摸不着头脑。我认为我已经取得了不错的进展,所以我就到此为止了,打开了一份 PR 草案,并让维护者知道我注意到的问题。
尽管现有的测试看起来很可怕,但我真的没有太多选择,只能为我的操作添加一个,所以我回去并试图理解现有测试中发生了什么。我稍微研究了一下所使用的测试库 - JUnit Jupiter 和 Mockito。我试图一点一点地分解它,并使用法学硕士来帮助我理解每一行发生了什么。但说实话,我对到底是怎么回事,还是有一个模糊的了解。我知道我在嘲笑 Baserow API 并在其上调用我的操作方法,但这就是我的理解范围。
显然,这已经足够好了。我将我的 PR 标记为可供审核,并且维护者接受了我的更改!他们提供了一些反馈 - 尽管我读过它们,但我忘记了遵循贡献流程的某些部分。下次,我应该在创建拉取请求之前查看贡献文档。
修复#1645
我发现初始设置和编写测试是这个问题中最令人生畏的部分。相比之下,实际上添加该功能是轻而易举的事。但我发现这个问题真正酷的是,我能够用我不太了解的语言为项目做出贡献,这要归功于他们维护良好的文档和易于理解的代码。
这是我在 2024 年 Hacktoberfest 上的最后一个公关!回顾帖子即将推出!
以上是深入研究 Java 项目的详细内容。更多信息请关注PHP中文网其他相关文章!