Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add source registry name in manifest #448

Merged
merged 5 commits into from
Apr 25, 2023
Merged

Conversation

elrrrrrrr
Copy link
Member

@elrrrrrrr elrrrrrrr commented Apr 24, 2023

Add a private field, _source_registry_name in the version manifest.

  • 🧶 Add related types for PackageManifestType and adjust relevant unit tests.
  • 🤖 Update the workflow trigger.
  • ♻️ No compensation will be made for the _source_registry_name field in the existing packageVersion.

在 version manifest 中新增私有字段,_source_registry_name 用于标记

  • 🧶 新增 PackageManifestType 相关类型,并调整相关单测
  • 🤖 调整 workflow 触发时机,不限制 target 分支
  • ♻️ 存量 packageVersion 内 _source_registry_name 不做补偿

@codecov
Copy link

codecov bot commented Apr 24, 2023

Codecov Report

Merging #448 (b0f9ba4) into master (4dcfe89) will decrease coverage by 0.14%.
The diff coverage is 100.00%.

@@            Coverage Diff             @@
##           master     #448      +/-   ##
==========================================
- Coverage   97.41%   97.27%   -0.14%     
==========================================
  Files         159      159              
  Lines       14480    14652     +172     
  Branches     1871     1871              
==========================================
+ Hits        14105    14253     +148     
- Misses        375      399      +24     
Impacted Files Coverage Δ
app/core/service/ChangesStreamService.ts 95.33% <100.00%> (-0.19%) ⬇️
app/core/service/PackageManagerService.ts 98.91% <100.00%> (+0.03%) ⬆️
app/core/service/PackageSyncerService.ts 98.31% <100.00%> (ø)
app/core/service/RegistryManagerService.ts 100.00% <100.00%> (ø)
...controller/package/SavePackageVersionController.ts 100.00% <100.00%> (ø)
app/repository/DistRepository.ts 92.64% <100.00%> (+0.22%) ⬆️
app/repository/PackageRepository.ts 98.14% <100.00%> (+0.66%) ⬆️

... and 3 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

return registry;

}

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是在RegistryManagerService类中添加了一个async函数:ensureDefaultRegistry,作用是确保默认Registry的存在。主要功能如下:

  1. 在registryRepository中查找是否有已存在的默认Registry,如果有则直接返回。

  2. 如果没有已存在的默认Registry,直接从config.cnpmcore配置文件中获取一些参数,并通过createRegistry方法生成一个新的Registry。

  3. 返回此新注册表。

这个函数看起来逻辑较为清晰,但是缺少对异常情况的处理。例如,如果connect到数据库失败会如何处理。另外,也许可以考虑使用TypeScript中的Optional chaining(可选链操作符)避免某些属性值为空导致的运行时错误。

@@ -128,7 +128,6 @@ describe('test/cli/npm/install.test.ts', () => {
cwd: demoDir,
})
.debug()
.expect('stdout', /added 1 package/)
.expect('code', 0)
.end();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

该代码补丁中,移除了一行断言 expect('stdout', /added 1 package/)

没有明显的风险或错误。但如果有必要检查目标是否是确切的示例。提出建议:在测试通过后添加更多具体的功能测试。

const data = res.body as PackageManifestType;
assert(Object.values(data.versions).every(v => v!._source_registry_name === 'self'));
});

it('should not throw error if no versions', async () => {
const bugVersion = new BugVersion({
'testmodule-show-package': {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此代码补丁仅更改了import语句和添加了两个测试用例。其中一个测试用例检查是否正确显示源注册表名称,另一个测试用例检查是否在以缩写形式请求时正确显示源注册表名称。
在代码方面没有明显的错误风险,但是可以考虑在测试中增加边界测试或者对代码进行一些优化,如对异步操作进行真实的Mock等等。

return registry;

}

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码为 RegistryManagerService 类添加了一个新的方法 ensureDefaultRegistry(),用于创建默认的仓库。

在这个方法中,首先查询是否已存在名为 'default' 的仓库,如果存在则直接返回;否则从配置文件中生成一个新的仓库,并将其保存到数据库中。

其中,类型默认是 npm,如果配置文件指定为 cnpmcore,则类型为 cnpmcore。此外,还需要根据配置文件中的信息设置一些其他的参数,例如 userPrefix、host 和 changeStream。

需要注意的是,在这个方法中并没有对输入参数进行任何检查和验证,因此可能存在一些潜在的风险。建议添加一些参数验证和错误处理机制,增强代码的健壮性。

@@ -128,7 +128,6 @@ describe('test/cli/npm/install.test.ts', () => {
cwd: demoDir,
})
.debug()
.expect('stdout', /added 1 package/)
.expect('code', 0)
.end();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码补丁中对测试用例进行了更改,移除了输出中包含“added 1 package”的期望,并保留了测试用例正常退出的期望。从代码片段来看,未发现任何潜在的风险和改进建议。

const data = res.body as PackageManifestType;
assert(Object.values(data.versions).every(v => v!._source_registry_name === 'self'));
});

it('should not throw error if no versions', async () => {
const bugVersion = new BugVersion({
'testmodule-show-package': {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码应该是对 Egg.js 项目中的一个 PackageManagerService 进行测试的代码补丁。以下是几个改进建议和存在的潜在风险:

  • import assert from 'assert'; 应该写成 const assert = require('assert'); (如果未开启 ES module 的话)或者使用 import * as assert from 'assert';
  • 基本上,无论何时使用 mock 来测试某个对象时,都需要在 afterEach() 中还原它,以避免其影响其他测试用例,这里没有看到还原操作。
  • 在新引入的 PackageManifestType 类型中,version 字段被标记为可选类型,但是当 v 参数传递给 Object.values 后,返回的值可能不存在,导致 _.source_registry_name 无法访问。可以加入 _.version! ?? '' 来确保 _.version 存在。
  • 如果出现错误,使用 assert.rejects 或 await expect(xxx).rejects.toThrow() 语句可以比较方便地断言代码是否符合预期,并输出更有意义的错误信息。
  • 特定请求的 Content-Type 可以改为变量来表示,以使其更易于管理。

除了上述问题外,这个代码补丁看起来很不错,测试用例的数量也相对较多。

.set('accept', 'application/vnd.npm.install-v1+json')
.expect(200);
assert(res.body._source_registry_name === 'self');
});
});
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是一个测试用例,在 npm 包管理器框架下的一些功能进行了单元测试。

第一个测试用例测试一个不存在的包,是否可以正确跳转到 NPM 官方网站。该测试没有明显的错误和需要改进点。

第二个测试用例检查版本清单中的 _source_registry_name 是否正确设置为 self。测试前会创建一个版本号为 1.0.0 的 npm 包“@cnpm/foo”进行测试。该测试也没有明显的错误和需要改进点。

return registry;

}

}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码看起来是在一个叫做 RegistryManagerService 的类里增加了一个 async 函数 ensureDefaultRegistry,这个函数返回一个 Promise 对象,它的返回值是一个叫做 Registry 的对象。该函数先通过调用 registryRepository 的 findRegistry 方法查找是否已经存在一个名为 default 的仓库,如果存在,则直接返回找到的仓库。如果不存在,则从配置文件中读取信息,创建一个新的仓库并返回它。

从代码上看不出来有什么明显的 bug 风险。不过如果这个仓库重要程度很高,可以考虑对 createRegistry 方法参数的校验和输入的限制。

关于改进建议,可以添加一些参数来提高 ensureDefaultRegistry 函数的灵活性,比如允许用户传入一个自定义的 RegistryType 和 host。此外,还可以增加一些注释或者日志来方便维护和调试。

@@ -128,7 +128,6 @@ describe('test/cli/npm/install.test.ts', () => {
cwd: demoDir,
})
.debug()
.expect('stdout', /added 1 package/)
.expect('code', 0)
.end();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是一个测试用例,它使用的是Jest框架。根据这段代码,以下是我的一些观察和建议:

  • 该测试案例似乎执行了一些安装操作,因此我希望能够看到在执行安装过程中输出的一些详细信息,例如安装的软件包名称。考虑向expect()函数添加更多的匹配器/matchers。
  • 删除.expect('stdout', /added 1 package/)行并不会影响测试结果,因为同时检查运行状态(.expect('code', 0))也已足够确认是否正确执行了正确的操作。
  • 将调试(.debug())和链式(.end())方法移除,在错误发生时可能更容易得到有用的调试信息。
  • 检查测试环境,确保在测试前剔除任何缓存、临时文件等,否则这些因素可能对测试结果产生影响。

需要注意的是,以上意见只基于给出的代码片段而提出,并不能确诊整个程序。

const data = res.body as PackageManifestType;
assert(Object.values(data.versions).every(v => v!._source_registry_name === 'self'));
});

it('should not throw error if no versions', async () => {
const bugVersion = new BugVersion({
'testmodule-show-package': {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

该代码补丁有两个测试用例,主要添加了"_source_registry_name"字段的显示。其中第一个测试用例验证所有版本是否显示"_source_registry_name"为"self"。第二个测试用例验证通过"application/vnd.npm.install-v1+json"头部接受缩写格式的包时是否能正常显示"_source_registry_name"。

在第一个测试用例中可以看出其并没有进行任何测试,相当于一个空的测试用例。在第二个测试用例中,虽然测试了一定功能但是在对缩写格式的处理上可能存在风险。建议在code review时添加更加详细和全面的测试,并对与缩写格式相关的处理进行优化,并注释清晰易懂。

.set('accept', 'application/vnd.npm.install-v1+json')
.expect(200);
assert(res.body._source_registry_name === 'self');
});
});
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这份代码补丁的作用是给一个 Node.js 应用程序添加新功能。下面是我的一些建议:

  • 在测试方法中,应该使用测试框架(比如 Mocha 或 Jest)提供的断言库来代替 assert 方法。
  • 测试用例中的语法看起来正确,但是我们需要更多上下文信息才能判断这些测试是否足够覆盖所有分支和角色。
  • 如果可能的话,最好写一些 E2E 测试来检查整个系统的行为,并确保这些测试包括对应的单元测试。
  • 如果应用程序规模较大,请考虑维护一个日志和错误跟踪系统,以便在出现问题时轻松排查 Bug。

@fengmk2 fengmk2 added the enhancement New feature or request label Apr 25, 2023
@fengmk2 fengmk2 merged commit f891aed into master Apr 25, 2023
@fengmk2 fengmk2 deleted the add-registry-name branch April 25, 2023 08:40
fengmk2 pushed a commit that referenced this pull request Apr 25, 2023
[skip ci]

## [3.17.0](v3.16.0...v3.17.0) (2023-04-25)

### Features

* add source registry name in manifest ([#448](#448)) ([f891aed](f891aed))
@github-actions
Copy link

🎉 This PR is included in version 3.17.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request released
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants