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
5hun
July 03, 2025
Programming
42
0
Share
OSSコントリビュート初体験: Rubocopのバグを修正した話
初めてPSSコントリビュートした話です。
といっても、構文解析についての踏み込んだ話は触れていません。
初心者の方でも理解できるように作ったつもりなので、感想などいただけたら嬉しいです。
5hun
July 03, 2025
More Decks by 5hun
See All by 5hun
Array#forty_two
5hun
0
48
与信管理を形にする: Ruby の柔軟性が支える高速データ収集・自動化基盤
5hun
1
290
ぼっちが秘める可能性〜孤高のRubyistが語る交流会サバイバル術〜
5hun
1
39
君もRailsもアップグレード!
5hun
1
15
完璧主義にこだわり続けるとシステム開発は不幸になると思った
5hun
0
43
地道なリファクタを続けてRspec高速化した話
5hun
0
40
“技術カンファレンスで何か変わる?” ──RubyKaigi後の自分とチームを振り返る
5hun
0
250
Other Decks in Programming
See All in Programming
「速くなった気がする」をデータで疑う
senleaf24
0
170
The Monolith Strikes Back: Why AI Agents ❤️ Rails Monoliths
serradura
0
320
実用!Hono RPC2026
yodaka
2
190
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
150
書籍「ユーザーストーリーマッピング」が私のバイブル
asumikam
3
310
Don't Prompt Harder, Structure Better
kitasuke
0
750
実践CRDT
tamadeveloper
0
550
ファインチューニングせずメインコンペを解く方法
pokutuna
0
310
Coding as Prompting Since 2025
ragingwind
0
830
「Linuxサーバー構築標準教科書」を読んでみた #ツナギメオフライン.7
akase244
0
1.4k
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
2.9k
SkillがSkillを生む:QA観点出しを自動化した
sontixyou
6
3.4k
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
330
The Mindset for Success: Future Career Progression
greggifford
PRO
0
310
Scaling GitHub
holman
464
140k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
220
How STYLIGHT went responsive
nonsquared
100
6.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Raft: Consensus for Rubyists
vanstee
141
7.4k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
450
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.1k
What does AI have to do with Human Rights?
axbom
PRO
1
2.1k
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まで上げる ・今の名前でなんとしてもまたコントリビュートしたい