Skip to content

3クラス分のnewspaperをActiveSupport::Notificationsに移行#8847

Merged
komagata merged 6 commits intomainfrom
chore/replace-to-activesupport-notifications
Jul 5, 2025
Merged

3クラス分のnewspaperをActiveSupport::Notificationsに移行#8847
komagata merged 6 commits intomainfrom
chore/replace-to-activesupport-notifications

Conversation

@e-yanagita-gs
Copy link
Copy Markdown
Contributor

@e-yanagita-gs e-yanagita-gs commented Jun 23, 2025

Issue

概要

アプリケーション内でPub/Sub(出版/購読)機構を担っている外部gem newspaperへの依存を削減するため、Rails標準機能である ActiveSupport::Notifications へ置き換えるリファクタリングを行いました。

今回は、以下の3つの購読者(Subscriber)クラス及び、関連するイベント発行部分を対象としました。

  • EventOrganizerWatcher
  • AnswerNotifier
  • NotifierToWatchingUser

変更確認方法

  1. chore/replace-to-activesupport-notifications ブランチをローカルに取り込みます。

    git fetch origin chore/replace-to-activesupport-notifications
    git checkout chore/replace-to-activesupport-notifications
  2. foreman start -f Procfile.devでサーバーを立ち上げます。


1. EventOrganizerWatcher の動作確認

イベントを新規作成した際に、そのイベントの作成者自身を、そのイベントの「ウォッチャー」(更新通知を受け取る人)として自動的に登録する機能です。
この自動登録が正しく行われ、その結果、他のユーザーからのコメント通知が作成者に届くことを確認します。

  1. 任意のユーザーAとしてログインします。
  2. 特別イベントを新規作成し、公開します。
  3. 一度ログアウトし、任意のユーザーBとしてログインします。
  4. ユーザーBで、先ほどユーザーAが作成したイベントのページにアクセスし、コメントを投稿します。
  5. 再度ログアウトし、再びユーザーAとしてログインします。

確認項目:

  • ログイン後、ヘッダーの通知アイコンに未読を示すバッジが表示されていること。
  • 通知一覧ページ(/notifications)にアクセスし、「(あなたのイベント名)にユーザーBさんがコメントしました」という趣旨の通知が届いていることを確認する。

2. AnswerNotifier の動作確認

質問に新しい回答がついた時に、その質問の投稿者以外の関係者(主にウォッチャー)に「新しい回答がありました」という通知を送る機能です。
質問をウォッチしているユーザー(質問者ではない)に対して、この通知が正しく届くことを確認します。

  1. **任意のユーザーA(質問者)**としてログインし、質問を新規作成します。
  2. 一度ログアウトし、**任意のユーザーB(ウォッチャー)**としてログインします。
  3. ユーザーBで、先ほどユーザーAが作成した質問のページにアクセスし、「Watch」ボタンをクリックしてウォッチ状態にします。
  4. 再度ログアウトし、**任意のユーザーC(回答者)**としてログインします。
  5. ユーザーCで、ユーザーAが作成した質問のページにアクセスし、回答を投稿します。
  6. 最後にログアウトし、再び**ユーザーB(ウォッチャー)**としてログインします。

確認項目:

  • ログイン後、ヘッダーの通知アイコンに未読を示すバッジが表示されていること。
  • 通知一覧ページ(/notifications)にアクセスし、「(ユーザーAさんの質問)にユーザーCさんが回答しました」という趣旨の通知が届いていることを確認する。

3. NotifierToWatchingUser の動作確認

質問に新しい回答がついた時に、より条件を絞って「純粋なウォッチャー」にだけ通知を送る機能です。通知が重複しないよう、ウォッチャーが「回答者自身」や「回答文中でメンションされた人」である場合は、通知対象から除外します。
「純粋なウォッチャー」には通知が届き、「回答者でもあるウォッチャー」には(この機能からは)通知が届かない、という除外ロジックが正しく働くことを確認します。

  1. 事前準備:
    1. **任意のユーザーA(質問者)**としてログインし、質問を新規作成します。
    2. 一度ログアウトし、**任意のユーザーB(純粋なウォッチャー)**としてログインし、上記質問をウォッチします。
    3. 再度ログアウトし、**任意のユーザーC(回答者兼ウォッチャー)**としてログインし、同じ質問をウォッチします。
  2. 操作:
    1. ユーザーCのまま、その質問に回答を投稿します。
  3. 結果確認:
    1. まずユーザーBとして再度ログインし直し、通知を確認します。
      • ヘッダーに通知バッジが表示されていること。
      • 通知一覧に「ウォッチ中の質問に新しい回答がありました」という趣旨の通知が届いていること。
    2. 次にユーザーCとして再度ログインし直し、通知を確認します。
      • NotifierToWatchingUserからの「ウォッチ中の質問に新しい回答がありました」という趣旨の通知は届いていないこと。

※変更前(mainブランチなど)の挙動と、変更後の挙動が同じであることをご確認ください。

Screenshot

※内部的なリファクタリングであり、見た目の変更はないためスクリーンショットはありません。

Summary by CodeRabbit

  • 改善
    • 通知システムの内部処理を見直し、イベント発生時の通知や監視の仕組みを最適化しました。
    • イベントや回答の作成時に関連ユーザーへの通知がより適切に行われるようになりました。
    • 新たに定期イベントの通知監視機能が追加されました。
    • ユーザー体験に影響する機能やフローに変更はありません。

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Jun 23, 2025

"""

Walkthrough

Newspaperによるイベント発行と購読を廃止し、代わりにActiveSupport::Notificationsを用いたイベント通知・購読に統一しました。これに伴い、関連するコントローラーやモデルのメソッドシグネチャ、初期化処理も適切に更新されています。さらに、RegularEventOrganizerWatcherクラスを新設し、新しいイベント種別regular_event.createの通知購読も追加されています。

Changes

ファイル/グループ 変更内容概要
app/controllers/api/answers_controller.rb, app/controllers/events_controller.rb, app/controllers/regular_events_controller.rb Newspaper.publishの呼び出しを削除し、ActiveSupport::Notifications.instrumentに統一(イベント発火部分の変更)
app/models/answer_notifier.rb, app/models/event_organizer_watcher.rb, app/models/notifier_to_watching_user.rb callメソッドのシグネチャをActiveSupport::Notifications仕様の5引数に変更(未使用引数は_で定義)
app/models/regular_event_organizer_watcher.rb 新規クラス追加。callメソッドでregular_event.createイベントの購読処理を実装
config/initializers/active_support_notifications.rb AnswerNotifier, NotifierToWatchingUser, EventOrganizerWatcher, RegularEventOrganizerWatcherの購読をActiveSupport::Notificationsに追加
config/initializers/newspaper.rb EventOrganizerWatcher, AnswerNotifier, NotifierToWatchingUserNewspaper購読登録を削除
test/models/event_organizer_watcher_test.rb EventOrganizerWatcher#callのテスト呼び出しを5引数の新シグネチャに合わせて修正

Sequence Diagram(s)

sequenceDiagram
    participant Controller as Controller
    participant ASNotifications as ActiveSupport::Notifications
    participant Subscriber1 as AnswerNotifier / NotifierToWatchingUser / EventOrganizerWatcher / RegularEventOrganizerWatcher

    Controller->>ASNotifications: instrument("answer.create" or "event.create" or "regular_event.create", payload)
    ASNotifications-->>Subscriber1: call(_name, _started, _finished, _unique_id, payload)
    Subscriber1->>Subscriber1: 通知/監視処理を実行
Loading

Possibly related issues

Possibly related PRs

Poem

春の野原でピョンと跳ね、
イベント通知も新しく。
Newspaperさよなら、鐘が鳴る、
ActiveSupportでピカピカ未来。
みんなで見守る答えとイベント、
うさぎもニッコリ、コードも軽やか!
🐇✨
"""

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 RuboCop (1.75.5)
app/controllers/regular_events_controller.rb

rubocop-minitest extension supports plugin, specify plugins: rubocop-minitest instead of require: rubocop-minitest in /.rubocop.yml.
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
rubocop-capybara extension supports plugin, specify plugins: rubocop-capybara instead of require: rubocop-capybara in /.rubocop.yml.
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
Unable to find gem rubocop-fjord; is the gem installed? Gem::MissingSpecError
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:309:in rescue in gem_config_path' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:293:in gem_config_path'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:84:in block (2 levels) in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:82:in reverse_each'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:82:in block in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:76:in each_pair'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:76:in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader.rb:66:in load_file'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_store.rb:29:in options_config=' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:160:in act_on_options'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:47:in block in run' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:81:in profile_if_needed'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:43:in run' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/exe/rubocop:19:in <top (required)>'
/usr/local/bin/rubocop:25:in load' /usr/local/bin/rubocop:25:in

'

app/models/regular_event_organizer_watcher.rb

rubocop-minitest extension supports plugin, specify plugins: rubocop-minitest instead of require: rubocop-minitest in /.rubocop.yml.
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
rubocop-capybara extension supports plugin, specify plugins: rubocop-capybara instead of require: rubocop-capybara in /.rubocop.yml.
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
Unable to find gem rubocop-fjord; is the gem installed? Gem::MissingSpecError
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:309:in rescue in gem_config_path' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:293:in gem_config_path'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:84:in block (2 levels) in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:82:in reverse_each'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:82:in block in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:76:in each_pair'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:76:in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader.rb:66:in load_file'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_store.rb:29:in options_config=' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:160:in act_on_options'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:47:in block in run' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:81:in profile_if_needed'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:43:in run' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/exe/rubocop:19:in <top (required)>'
/usr/local/bin/rubocop:25:in load' /usr/local/bin/rubocop:25:in

'

config/initializers/active_support_notifications.rb

rubocop-minitest extension supports plugin, specify plugins: rubocop-minitest instead of require: rubocop-minitest in /.rubocop.yml.
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
rubocop-capybara extension supports plugin, specify plugins: rubocop-capybara instead of require: rubocop-capybara in /.rubocop.yml.
For more information, see https://docs.rubocop.org/rubocop/plugin_migration_guide.html.
Unable to find gem rubocop-fjord; is the gem installed? Gem::MissingSpecError
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:309:in rescue in gem_config_path' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:293:in gem_config_path'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:84:in block (2 levels) in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:82:in reverse_each'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:82:in block in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:76:in each_pair'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader_resolver.rb:76:in resolve_inheritance_from_gems' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_loader.rb:66:in load_file'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/config_store.rb:29:in options_config=' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:160:in act_on_options'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:47:in block in run' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:81:in profile_if_needed'
/var/lib/gems/3.1.0/gems/rubocop-1.75.8/lib/rubocop/cli.rb:43:in run' /var/lib/gems/3.1.0/gems/rubocop-1.75.8/exe/rubocop:19:in <top (required)>'
/usr/local/bin/rubocop:25:in load' /usr/local/bin/rubocop:25:in

'


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d59d564 and 47306d9.

📒 Files selected for processing (3)
  • app/controllers/regular_events_controller.rb (1 hunks)
  • app/models/regular_event_organizer_watcher.rb (1 hunks)
  • config/initializers/active_support_notifications.rb (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • config/initializers/active_support_notifications.rb
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build_and_test
🔇 Additional comments (2)
app/controllers/regular_events_controller.rb (1)

33-33: 良い変更です!Newspaperからの移行が適切に実装されています。

Newspaper.publishからActiveSupport::Notifications.instrumentへの移行により、Railsの標準機能を使用するようになりました。イベント名'regular_event.create'は適切で、ペイロードキーもregular_event:に変更されており一貫性があります。

app/models/regular_event_organizer_watcher.rb (1)

1-8: 新しいWatcherクラスの実装が適切です。

RegularEventOrganizerWatcherActiveSupport::Notificationsのコールバックパターンに従って正しく実装されています。メソッドシグネチャ、ペイロードの抽出、Watchレコードの作成がすべて適切で、EventOrganizerWatcherと一貫性のある設計になっています。Watch.create!の使用により、エラーハンドリングも適切です。

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@e-yanagita-gs e-yanagita-gs changed the title Chore/replace to activesupport notifications 3クラス分のnewspaperをActiveSupport::Notificationsに移行 Jun 23, 2025
@e-yanagita-gs
Copy link
Copy Markdown
Contributor Author

@komagata @machida

お疲れ様です。

こちらのIssueに関連して、実装方針の確認でお時間をいただきたくコメントいたしました。

発生した問題の概要

タスク対象の3クラスの移行を完了しテストを実行したところ、直接修正していないRegularEventsTest(定期イベントのテスト)で、定期イベントがデータベースに保存されない、というエラーが発生しました。

エラーの根本原因

デバッグを進めた結果、原因はRegularEventsControllerRegularEvent(定期イベント)作成時に、誤ってEvent(特別イベント)用の通知(:event_create)を発行していたことだと判明しました。

以前のコードでは、この間違った通知をEventOrganizerWatcherが偶然うまく処理できていたため、問題が表面化していませんでした。

しかし、今回のリファクタリングでEventOrganizerWatcherの実装をActiveSupport::Notificationsの仕様に合わせた結果、この「偶然の連携」が壊れて例外が発生し、テストが失敗するようになった、というのが経緯の全容です。

提案する解決策

この問題を根本的に解決し、コードをより堅牢で分かりやすい状態にするため、以下の対応を実装したいと考えております。

  1. RegularEventOrganizerWatcherという、RegularEvent専用の購読者クラスを新規作成します。
    EventOrganizerWatcherをコピーし、RegularEventを扱うように修正します)
  2. RegularEventsControllerを修正し、RegularEvent作成時には、新しく定義する専用のイベント('regular_event.create')を発行するようにします。
  3. 新しいイベントと新しい購読者クラスをactive_support_notifications.rbで正しく紐付けます。

この対応により、EventRegularEventの通知処理が完全に分離され、今回のエラーの根本原因である「隠れた依存関係」を解消できると考えます。

ご相談

この対応は、新しいクラスを作成することになり、当初のタスク「既存3クラスの置き換え」の範囲を少し超えるものと認識しております。

つきましては、アプリケーションの健全性を高めるために、上記方針で実装を進めてもよろしいか、ご確認いただけますと幸いです。

お忙しいところ恐れ入りますが、よろしくお願いいたします。

@komagata
Copy link
Copy Markdown
Member

@e-yanagita-gs なるほどです。仰っている形で対応お願いします。
実装の提案もありがとうございます。追加の部分があるのでポイントを3に増やさせていただきました。

@e-yanagita-gs
Copy link
Copy Markdown
Contributor Author

@komagata
ご確認ありがとうございます!
それでは、提案のとおり実装させていただきます。

@e-yanagita-gs e-yanagita-gs self-assigned this Jun 24, 2025
@e-yanagita-gs e-yanagita-gs requested a review from zamami June 24, 2025 00:23
@e-yanagita-gs
Copy link
Copy Markdown
Contributor Author

@zamami
お疲れ様です。
こちら、レビューをお願いすることはできますでしょうか?

@zamami
Copy link
Copy Markdown
Contributor

zamami commented Jun 24, 2025

@e-yanagita-gs
お疲れ様です!
承知しました。明日からレビューさせていただきます!

@e-yanagita-gs
Copy link
Copy Markdown
Contributor Author

@zamami
ありがとうございます!
よろしくお願いいたしますm(_ _)m

Copy link
Copy Markdown
Contributor

@zamami zamami left a comment

Choose a reason for hiding this comment

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

@e-yanagita-gs
レビュー遅くなって申し訳ありません。
こちらの内容を参考に問題なく実装されていると思います。

動作確認も無事できました!

エラーのデバッグお疲れ様でした。
解決策の提案、相談内容は読んでてとても勉強になりました。
今後のPRのやりとりでの参考にさせていただきます。
私の方からは特に問題ないと思いますのでApproveとさせていただきます!

@e-yanagita-gs
Copy link
Copy Markdown
Contributor Author

@zamami
レビューありがとうございました!
また、コメントもご丁寧にありがとうございます。大変励みになります😆
今後ともよろしくお願いいたします。

@komagata
お疲れ様です。
メンバーレビューが完了しましたので、ご確認をよろしくお願いいたします。

@e-yanagita-gs e-yanagita-gs requested a review from komagata July 3, 2025 11:20
Copy link
Copy Markdown
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

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

確認させて頂きました。OKです〜🙆‍♂️

@komagata komagata merged commit e1c6815 into main Jul 5, 2025
11 checks passed
@komagata komagata deleted the chore/replace-to-activesupport-notifications branch July 5, 2025 09:59
@github-actions github-actions bot mentioned this pull request Jul 5, 2025
87 tasks
@e-yanagita-gs
Copy link
Copy Markdown
Contributor Author

@komagata
ありがとうございます!

@coderabbitai coderabbitai bot mentioned this pull request Sep 13, 2025
10 tasks
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.

3 participants