Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OSSコントリビュート初体験:Rubocopのバグを修正した話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
5hun
July 03, 2025
Programming
41
0
Share
OSSコントリビュート初体験: Rubocopのバグを修正した話
初めてPSSコントリビュートした話です。
といっても、構文解析についての踏み込んだ話は触れていません。
初心者の方でも理解できるように作ったつもりなので、感想などいただけたら嬉しいです。
5hun
July 03, 2025
More Decks by 5hun
See All by 5hun
Array#forty_two
5hun
0
46
与信管理を形にする: Ruby の柔軟性が支える高速データ収集・自動化基盤
5hun
1
280
ぼっちが秘める可能性〜孤高のRubyistが語る交流会サバイバル術〜
5hun
1
39
君もRailsもアップグレード!
5hun
1
15
完璧主義にこだわり続けるとシステム開発は不幸になると思った
5hun
0
43
地道なリファクタを続けてRspec高速化した話
5hun
0
39
“技術カンファレンスで何か変わる?” ──RubyKaigi後の自分とチームを振り返る
5hun
0
250
Other Decks in Programming
See All in Programming
Java 21/25 Virtual Threads 소개
debop
0
310
KagglerがMixSeekを触ってみた
morim
0
350
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
270
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
8
3.6k
Tamach-sre-3_ANDPAD-shimaison93
mane12yurks38
0
200
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
240
安いハードウェアでVulkan
fadis
1
850
Codex の「自走力」を高める
yorifuji
0
1.3k
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
800
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
870
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
180
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.5k
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
140
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
780
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Darren the Foodie - Storyboard
khoart
PRO
3
3.1k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.4k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
240
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Designing for Performance
lara
611
70k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Transcript
OSSコントリビュート初体験: Rubocopのバグを修正した話 Omotesando.rb #111
自己紹介 5hun @5hun_s アラームボックスという会社でRuby on Railsを書いています。 Ruby歴は1年と半年くらい。 趣味は音楽です。
会社紹介 アラームボックス株式会社は 与信管理という分野の会社です。 BtoBサービスを提供するSaaSの 会社です。
お客様へ、危ない企業の情報提供 反社、倒産、悪評など幅広くカバー あの会社の経営状況 はやばいわよ 代表者が 反社疑惑あり よし、あの会社と取引する のはやめとこう
取引先が倒産など、いざという時の保証 よし、安心! お金が支払われなかった 場合は 立て替えます! いわゆる、立替え払い
エンジニアの役割 ・多くの企業情報を蓄積、管理し、運用するためのシステムつくり ・企業情報を効率よく収集するためのAI活用 ・3つのメインサービス(パワーサーチ、モニタリング、ギャランティ)を利用 できる会員サイトの運用
ここから本題
お品書き ・初めてOSSコントリビュートしました ・修正したcop ・修正内容の解説
初めてOSSコントリビュートしました
初めてのissueとプルリクの提出 https://github.com/rubocop/rubocop/pull/14315
修正したcop
Style/SoleNestedConditional ネストしたif/unlessを一番外側のif文と繋げてくれます。 見ての通り、複数のネストを一発で修正してくれます。
ある日、自社プロダクトで突然のエラーが! rubocop –a コマンドを実行したら、下記のエラーが発生しました
気になったので原因と修正方法を考えてみました
修正内容の解説
その前に、今日話さないこと ・詳細なRubocopの内部構造 ・詳細な構文解析に関する専門用語の解説(パーサーとか) →それらを知らなくてもなんとなくできた!という話だと思ってください。
現状の把握(エラーの発生したコード) 2段目のネストでunlessを使っているのが ポイントです(ネタバレ)
まず、発生したエラーは何か見てみます https://github.com/whitequark/parser/blob/master/lib/parser/source/rewriter.rb ClobberingErrorが発生 しています!
エラーでググってみて、GitHubのコメントを読んでみます 上書きするような書き換え操作が行われると、Error が発生します
何か書き換える処理が重複して エラーになっていると予測。
次に、rubocopの、sole_nested_conditional.rb の実装を見てみます
スタックトレースから呼ばれている箇所を確認します 名前からして自動修 正するメソッドが呼ば れている https://github.com/rubocop/rubocop/blob/master/lib/rubocop/cop/style/sole_nested_conditional.rb
メソッドをたどり、自動修正をしている箇所を見つけました。 unlessなら!ifに 書き換える 条件ブロックを 繋げる
怪しいところは二つあると予測 ・複数のネストを一文に繋げるところでエラーになるのか ・unlessをifにする時にエラーになるのか どちらなのか検証してみます。
if/if/if はOK
つまり、 複数のネストを一文に繋げる→問題ない unlessをifにする→問題あり ということがわかりました。
ここからエラーの解説です
if/unless/if はNG 一番外側と2段目のネストが最初に修正対象として検知されます ①ここでunlessを 検知しifへ修正が 確定します
if/unless/if はNG 次に、2段目と3段目のネストが修正対象として検知されます ②ここでもunless を検知しifへ修正 が確定します
if/unless/if はNG 修正が重なり、 エラーとなる
なので、一度修正を検知した場所は 修正しないように記録しておけば良さそう
私の書いた実際の修正後のコード 他の箇所でも使われている既存の仕組みを利用して修正できました。
引数で指定されているノードとは 構文木における用語で、構文木を構成する個々の要素であり、文法の非終端記号 (例: 式、文、関数定義)や終端記号(例: 演算子、識別子、リテラル)に対応し ます。 ここでは、unless〜endのブロックを指すと思ってください。
修正後のコードが何をしているか ここでignore_nodesという 配列にセットします
修正後のコードが何をしているか ここでignore_nodesという 配列にセットします 現在修正対象のnodeが ignore_nodesに含まれているか 判定します
修正後のコードが何をしているか ノードが、unlessブロックかつ無視対象のノードでない場合のみ、 unlessをifに書き換えるようにすることで、 書き換え操作の重複を回避し、エラーも回避できるようになりました。
テストコードを作成、実行し、エラーが発生 しないことを確認し、プルリクを提出 →マージされました!
一点問題があり、マージ後にアカウント名 を変えました(Xと合ってなかった)
無慈悲な現状
今後の展望 ・仮説→検証の繰り返しをすれば、初見のコードも理解できるようになる! ・OSS活動楽しい! ・自社のRubocopを自分のコミットが含まれるv1.77まで上げる ・今の名前でなんとしてもまたコントリビュートしたい