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: #33 pick, omit に RegExp を指定可能に変更 #34

Merged
merged 2 commits into from
Oct 5, 2023

Conversation

mew-ton
Copy link
Contributor

@mew-ton mew-ton commented Oct 5, 2023

Summary by CodeRabbit

リリースノート:

  • 新機能: pickおよびomit関数で正規表現を指定できるようになりました。これにより、より柔軟なキーの選択と除外が可能になります。
  • テスト: pickおよびomit関数の新機能に対するテストケースを追加しました。これにより、正規表現キーの取り扱いが正しく行われていることを確認します。
  • その他: "json-origami"ライブラリに関連するマイナーチェンジを含みます。

@changeset-bot
Copy link

changeset-bot bot commented Oct 5, 2023

🦋 Changeset detected

Latest commit: fb207fd

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
json-origami Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai
Copy link

coderabbitai bot commented Oct 5, 2023

Walkthrough

この変更では、pickomit関数が正規表現をキーとして受け入れる新機能が導入されました。これにより、オブジェクトから特定のプロパティを選択または除外する際の柔軟性が向上します。また、対応するテストケースも追加されています。

Changes

ファイル 概要
src/omit.ts, src/pick.ts omitpick関数が正規表現をキーとして受け入れる新しいシグネチャを導入。
src/utils.ts includesKey関数が文字列または正規表現を受け入れるように改良。
test/omit.spec.ts, test/pick.spec.ts 新機能のテストケースを追加。
.changeset/clean-bags-work.md "json-origami"ライブラリに関連する新機能とマイナーチェンジを記述。

🐇💻

正規表現の魔法で、コードはさらに進化。
オブジェクトの中から、必要なものだけを拾い上げ。
あるいは、不要なものを巧みに省く。
これこそが、我々の新たな力。
テストで確認し、信頼性を保つ。
さあ、新たな一歩を踏み出そう! 🎉


Tips

Chat with CodeRabbit Bot (@coderabbitai)

  • Mention @coderabbitai in any review comment for bot assistance.
  • Note: Review comments are made on code diffs or files, not on the PR overview.

Pause Incremental Reviews

  • Insert @coderabbitai: ignore in the PR description to halt the bot's ongoing reviews. Remove the line to resume.
  • Additionally, enter @coderabbitai pause to halt the bot's ongoing reviews as any issue or review comment. To
    resume reviews, enter @coderabbitai resume as any issue or review comment.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 5

Commits Files that changed from the base of the PR and between 58c624d and 76c2c08.
Files selected for processing (5)
  • src/omit.ts (1 hunks)
  • src/pick.ts (1 hunks)
  • src/utils.ts (1 hunks)
  • test/omit.spec.ts (2 hunks)
  • test/pick.spec.ts (2 hunks)
Additional comments (Suppressed): 8
test/pick.spec.ts (1)
  • 113-169: This test case checks if the pick function can handle regular expression keys correctly. It provides an object and an array of regular expressions as input, and asserts that the returned object contains only the properties that match the regular expressions. The test case seems to cover different scenarios, including matching the start and end of a string. Good job on adding this test case.
test/omit.spec.ts (2)
  • 1-4: eslint-disable max-linesが追加されました。これは、ファイル全体の行数を制限するためのものです。この変更は、新たに追加されたテストケースにより、ファイルの行数が増えたためと思われます。ただし、この変更が必要かどうかは、プロジェクトのコーディング規約やスタイルガイドに依存します。

  • 124-159: 新たなテストケースが追加されています。このテストでは、omit関数が正規表現キーを適切に処理できることを確認しています。具体的には、/^a\.b//\.e$/の2つの正規表現を使用して、オブジェクトから特定のキーを省略しています。このテストケースは、新たに追加された機能を適切にテストしているように見えます。

src/utils.ts (2)
  • 14-19: includesKey関数のシグネチャが変更され、matchパラメータが新たに追加されました。この変更は破壊的な変更であるため、この関数を使用しているすべてのコードが新しいシグネチャに適応するように更新されていることを確認してください。

  • 22-22: 正規表現のマッチングを行う際に、testメソッドを使用しています。しかし、testメソッドは正規表現オブジェクトの最後のインデックスを更新するため、複数回呼び出すと結果が変わる可能性があります。これは意図した動作でしょうか?もし意図しない場合は、RegExp.prototype.execString.prototype.matchを使用することを検討してみてください。

src/omit.ts (1)
  • 33-36: omit関数のシグネチャが変更されています。新しいシグネチャは、keysパラメータがK[]からArray<K | RegExp>に変更され、戻り値の型がOmit<D, K>からDictionaryに変更されています。この変更により、omit関数は正規表現を受け入れ、一致するキーをオブジェクトから削除できるようになりました。また、戻り値の型がDictionaryになったことで、関数の使用者は結果のオブジェクトがどのようなキーを持つか明示的に指定する必要がなくなりました。これらの変更が意図したものであること、およびコードベース全体でこの関数の呼び出しが新しいシグネチャに合わせて更新されていることを確認してください。
src/pick.ts (2)
  • 34-38: pick関数のシグネチャが変更されています。新しいシグネチャは、正規表現を含むキーの配列を受け入れるようになりました。この変更がコードベース全体で適用されていることを確認してください。

  • 53-54: includesKey関数の呼び出しにおいて、引数の順序が変更されています。新しい順序は、正規表現を含むキーの配列を適切に処理するためのものと思われます。この変更が意図した通りであること、そしてincludesKey関数が新しい引数の順序を正しく処理できることを確認してください。

Comment on lines +1 to 4
/* eslint-disable max-lines */
/* eslint-disable max-lines-per-function */
import { describe, it, expect } from 'vitest'
import { pick } from '../src/pick'
Copy link

Choose a reason for hiding this comment

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

The new hunk adds an ESLint rule to disable the maximum number of lines in a file. This is generally not recommended as it can lead to files that are too large and difficult to maintain. Consider refactoring the code to reduce its size, or if necessary, adjust the ESLint rule to allow a reasonable number of lines.

- /* eslint-disable max-lines */
  /* eslint-disable max-lines-per-function */
  import { describe, it, expect } from 'vitest'
  import { pick } from '../src/pick'

src/utils.ts Outdated
const split = (key: string): string[] => {
const fixedKey = arrayIndex === 'bracket' ? key.replace(/\[(\w+)\]/g, '.$1') : key
return fixedKey.split('.')
}

const originKeys = split(origin)
const keys = split(key)
const keys = split(match)
Copy link

@coderabbitai coderabbitai bot Oct 5, 2023

Choose a reason for hiding this comment

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

split関数は文字列を引数に取りますが、matchパラメータは文字列または正規表現のどちらでもあり得ます。そのため、この行では型エラーが発生する可能性があります。matchが文字列であることを確認する条件分岐が必要です。

- const keys = split(match)
+ const keys = typeof match === 'string' ? split(match) : [];

Copy link
Contributor Author

Choose a reason for hiding this comment

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

コードの上方で対応済み

Copy link

Choose a reason for hiding this comment

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

@mew-ton ご指摘いただきありがとうございます。確かに、matchが正規表現の場合は既に処理されており、その後のコードでは文字列として扱われることが保証されていますね。私の見落としでした、申し訳ありません。

src/omit.ts Outdated
Comment on lines +58 to 59
Object.keys(folded).filter((k) => !keys.some((key) => includesKey(k, key, opt)))
)
Copy link

Choose a reason for hiding this comment

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

targetKeysの生成ロジックが変更されています。新しいロジックでは、keys配列内の各キー(または正規表現)がfoldedオブジェクトのキーを含むかどうかをチェックします。これにより、keys配列が正規表現を含む場合でも、omit関数は正しく動作します。ただし、この変更により、keys.some()が各キーに対して呼び出されるため、パフォーマンスに影響を及ぼす可能性があります。特に、keys配列が大きい場合や、foldedオブジェクトが多数のキーを持つ場合には、この影響が顕著になる可能性があります。この問題を緩和するために、正規表現を含むキーとそうでないキーを分離し、それぞれを別々に処理することを検討してみてください。

src/pick.ts Outdated
Comment on lines +39 to +43
export function pick<D extends Dictionary, K extends DeepKeyOf<D>>(
obj: D,
keys: Array<K | RegExp>,
opt?: PickOption
): Omit<D, K>
Copy link

@coderabbitai coderabbitai bot Oct 5, 2023

Choose a reason for hiding this comment

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

同じpick関数のシグネチャが再度定義されていますが、これは不要です。一つの関数に対して複数のシグネチャを定義することは可能ですが、それぞれのシグネチャは異なるパラメータセットや戻り値を持つべきです。ここでは、2つのシグネチャが完全に同一であるため、冗長となっています。

- export function pick<D extends Dictionary, K extends DeepKeyOf<D>>(
-   obj: D,
-   keys: Array<K | RegExp>,
-   opt?: PickOption
- ): Omit<D, K>

Copy link
Contributor Author

Choose a reason for hiding this comment

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

TSの関数オーバーライド記法のため、これはあってる

Copy link

Choose a reason for hiding this comment

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

@user ご指摘いただきありがとうございます。TypeScriptの関数オーバーロードについては理解しておりますが、私が指摘した部分は冗長なオーバーロード定義についてでした。具体的には、以下の2つの関数シグネチャが完全に同一であるためです。

export function pick<D extends Dictionary, K extends DeepKeyOf<D>>(
  obj: D,
  keys: Array<K | RegExp>,
  opt?: PickOption
): Omit<D, K>

export function pick<D extends Dictionary, K extends DeepKeyOf<D>>(
  obj: D,
  keys: Array<K | RegExp>,
  opt?: PickOption
): Omit<D, K>

これらのシグネチャはパラメータと戻り値が全く同じであり、そのため一方が不要となります。もし異なる振る舞いやパラメータを持つオーバーロードが必要であれば、それぞれのシグネチャが異なるパラメータセットや戻り値を持つように定義するべきです。

src/pick.ts Outdated
Comment on lines +45 to 49
export function pick<D extends Dictionary, K extends DeepKeyOf<D>>(
obj: D,
keys: Array<K | RegExp>,
opt?: PickOption
): Omit<D, K> {
Copy link

@coderabbitai coderabbitai bot Oct 5, 2023

Choose a reason for hiding this comment

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

ここでもpick関数のシグネチャが再度定義されていますが、これも不要です。前述の理由と同様に、このシグネチャも削除すべきです。

- export function pick<D extends Dictionary, K extends DeepKeyOf<D>>(
-   obj: D,
-   keys: Array<K | RegExp>,
-   opt?: PickOption
-  ): Omit<D, K> {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

TSの関数オーバーライド記法のため、これはあってる

Copy link

Choose a reason for hiding this comment

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

@user ご指摘ありがとうございます。TypeScriptの関数オーバーロードを使用していることを理解しました。この場合、複数のシグネチャが必要であり、それぞれが異なる引数タイプをサポートします。私のコメントは誤りでした。お手数をおかけし申し訳ありません。

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 1

Commits Files that changed from the base of the PR and between 76c2c08 and fb207fd.
Files selected for processing (1)
  • .changeset/clean-bags-work.md (1 hunks)

Comment on lines +1 to +5
---
"json-origami": minor
---

feat: #33 pick, omit に RegExp を指定可能に変更
Copy link

Choose a reason for hiding this comment

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

この変更は、pickomit関数が正規表現を受け入れるようになったことを適切に説明しています。ただし、これらの変更がどのように機能するか、またはそれがユーザーにどのような影響を与えるかについての詳細が不足しています。ドキュメンテーションは、開発者が新機能を理解し、それを使用する方法を学ぶための重要なリソースです。したがって、この部分には、新機能の具体的な使用例や期待される挙動についての情報を追加することをお勧めします。

@mew-ton mew-ton merged commit 2bd9b74 into main Oct 5, 2023
@mew-ton mew-ton deleted the feat/33_regexp branch October 5, 2023 08:43
@github-actions github-actions bot mentioned this pull request Oct 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant