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
Enter the OSS world [RuboCop] II. lost boundary
Search
Koichi ITO
December 09, 2017
Programming
1
2.5k
Enter the OSS world [RuboCop] II. lost boundary
Rails Developers Meetup 2017
https://railsdm.github.io/2017/
Koichi ITO
December 09, 2017
Tweet
Share
More Decks by Koichi ITO
See All by Koichi ITO
Write Code Every Day
koic
1
440
Bliki (ja), and the Cathedral, and the Bazaar
koic
7
2.4k
Welcome to the LLM Club
koic
0
310
RuboCop: Modularity and AST Insights
koic
3
4.7k
Carving the Way to Ruby Engineering
koic
3
1.1k
Beyond the RuboCop Defaults
koic
3
4.5k
Minify Ruby Code
koic
2
2.4k
Permanent Agility
koic
38
9.2k
RuboCop: LSP and Prism
koic
3
5.3k
Other Decks in Programming
See All in Programming
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
270
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
440
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
430
旅行プランAIエージェント開発の裏側
ippo012
2
900
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
430
Zendeskのチケットを Amazon Bedrockで 解析した
ryokosuge
3
300
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.3k
RDoc meets YARD
okuramasafumi
4
170
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
200
testingを眺める
matumoto
1
140
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
440
Navigating Dependency Injection with Metro
zacsweers
3
260
Featured
See All Featured
Designing for humans not robots
tammielis
253
25k
Producing Creativity
orderedlist
PRO
347
40k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Visualization
eitanlees
148
16k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
520
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Statistics for Hackers
jakevdp
799
220k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Side Projects
sachag
455
43k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
Transcript
&OUFSUIF044XPSME <3VCP$PQ> **MPTUCPVOEBSZ &OUFSUIF044XPSME <3VCP$PQ> **MPTUCPVOEBSZ &OUFSUIF044XPSME <3VCP$PQ> **MPTUCPVOEBSZ &OUFSUIF044XPSME
<3VCP$PQ> **MPTUCPVOEBSZ &OUFSUIF044XPSME <3VCP$PQ> **MPTUCPVOEBSZ 5&$)1-":4)*#6:" ,PJDIJ*50FTN 4BU 3BJMT%FWFMPQFST.FFUVQ 5&$)1-":4)*#6:" ,PJDIJ*50FTN 4BU 3BJMT%FWFMPQFST.FFUVQ 5&$)1-":4)*#6:" ,PJDIJ*50FTN 4BU 3BJMT%FWFMPQFST.FFUVQ 5&$)1-":4)*#6:" ,PJDIJ*50FTN 4BU 3BJMT%FWFMPQFST.FFUVQ 5&$)1-":4)*#6:" ,PJDIJ*50FTN 4BU 3BJMT%FWFMPQFST.FFUVQ
None
None
8FMDPNFGFFECBDL (FNpMF HJU@TPVSDF HJUIVC \cSFQPcIUUQTHJUIVCDPN\SFQP^HJU^ ! HFNSBJMT HJUIVCSBJMTSBJMT HFNBDUJWFSFDPSEPSBDMF@FOIBODFEBEBQUFS HJUIVCbSTJNPSBDMF
FOIBODFE Preparing for upgrade to Rails 5.2 uses master branch instead of beta.
None
None
0DUPCFS 3VCP$PQSFMFBTFE
None
ࠒ͍ͬͯΔ044ͰͷൃݟΛ VQTUSFBNʹؐݩ͢Δ &QJTPEFT 1BSU* 1BSU** 1BSU*** ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏ Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ
&QJTPEFT 1BSU* ࠒ͍ͬͯΔ044ͰͷൃݟΛ VQTUSFBNʹؐݩ͢Δ 1BSU** 1BSU*** ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏ Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ
Enter the OSS world RuboCop I. presage comment
1SFNPOJUJPO
"3BJMTBQQMJDBUJPO EFWFMPQNFOU
3FWJFXDPNNFOU
ࣗͨͪͷࢦఠͨ͜͠ͱ ଞͷػձͰࢦఠ͞Ε͏Δ
None
044 ใԽٕज़Λ௨ͯ͡ʜ 3JEFPO044
IUUQTUXJUUFSDPNPOLTUBUVT
&QJTPEFT 1BSU* ࠒ͍ͬͯΔ044ͰͷൃݟΛ VQTUSFBNʹؐݩ͢Δ 1BSU** 1BSU*** ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏ Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ
ࠒ͍ͬͯΔ044ͰͷൃݟΛ VQTUSFBNʹؐݩ͢Δ &QJTPEFT 1BSU* 1BSU** ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏ Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ 1BSU***
Enter the OSS world RuboCop II. lost boundary
044ʹͦΕͳΓʹ͋Γɺ ΞϓϦέʔγϣϯ͔Βܨ͕͍ͬͯ ΔҎ্ɺଞਓࣄͷίʔυͰͳ͍ 3JEFPO044
ؔΘΓํͷελΠϧྫ w۩ମతʹࠔ͍ͬͯΔ w͓͠Ζͦ͏ wແཧ͠ͳ͍ όʔϯΞτ͠ͳ͍Α͏τϦΞʔδ͢Δ
$MJDLlCVHzMBCFM
3BJMT).PS)0%FQFOEFOU
8IBUJTUIJT$PQ
CCBUTPWSVCPDPQ <'JY>'JYA3BJMT)BT.BOZ0S)BT0OF%FQFOEFOUA JODPSSFDUMZqBHTAXJUI@PQUJPOTACMPDLT
8SJUFSFQSPEVDUJPOTQFDT DPOUFYUXJUI@PQUJPOTEFQFOEFOUEFTUSPZEP JUEPFTOPUSFHJTUFSBOP⒎FOTFEP FYQFDU@OP@P⒎FOTFT 36#:TUSJQ@JOEFOU DMBTT1FSTPO XJUI@PQUJPOTEFQFOEFOUEFTUSPZEP IBT@POFGPP FOE
FOE 36#: FOE FOE # Goal: False positive don't occur below ! class Person with_options dependent: :destroy do has_one :foo end end
XJUI@PQUJPOTPG"45 SVCZQBSTFFXJUI@PQUJPOTEFQFOEFOUEFTUSPZEPcBTTPDc BTTPDIBT@POFGPPFOE` ! CMPDL TFOEOJMXJUI@PQUJPOT IBTI
QBJS TZNEFQFOEFOU TZNEFTUSPZ BSHT QSPDBSHBTTPD TFOE MWBSBTTPD IBT@POF TZNGPP
XJUI@PQUJPOTPG"45 QPXFSFECZIUUQTHJUIVCDPNLPJDSVCZ@BTU@WJTVBMJ[FS
*NQMFNFOUBUJPO 3FE (SFFO 3FGBDUPS 5FTUDPEFJTNPSFPCWJPVTBOEFBTJFSUP VOEFSTUBOEUIBOUIFPQFSBUJPOPG"45
0QFOB13
$POWFSTBUJPO AJT@IBT@NBOZ@PS@IBT@POF@XJUIPVU@PQUJPOT AJT BOFYJTUJOHNFUIPEOBNF
"CPVU/BNJOH1SFEJDBUF/BNF
EFG@OPEF@NBUDIFS EFG@OPEF@NBUDIFSJT@YYY 1"55&3/ TFOEOJM \IBT@NBOZIBT@POF^@ 1"55&3/ def_node_matcher dynamic
defines a method which applies a pattern to an AST node. /PUF/BNJOH1SFEJDBUF/BNFDPQEPFTOPUBXBSFPG EZOBNJDBMMZEFpOFENFUIPEPSMPXFS -JLFEFpOF@NFUIPE EFpOF@TJOHMFHPO@NFUIPE
$POWFSTBUJPO
"OUJGBU13
ผͱͯ͠Γग़ͤΔ Α͏Ͱ͋Εผͷ13Ͱ ରॲ͢ΔΑ͏ʹ͍ͯ͠Δ ͱͱજΜͰ͍ͨͱͷରቂ ͪΖΜͦͷ13Ͱͷมߋ͕దͰ͋Εɺͦͷ13Ͱ ରԠ͢Δ
CCBUTPWSVCPDPQ "EEOFXA*OUFSOBM"⒎BJST%ZOBNJD1SFEJDBUF/BNFADPQ
5IFpSTUEFTJHO /BNJOH 1SFEJDBUF/BNF &YJTUJOH DPQDMBTT
5IFpSTUEFTJHO /BNJOH 1SFEJDBUF/BNF NPEVMF $POpHVSBCMF 1SFEJDBUF/BNJOH /BNJOH 1SFEJDBUF/BNF NJYJO &YUSBDU
NPEVMF $IFDLTUBUJD NFUIPET &YJTUJOH DPQDMBTT 4IBSF DPOpHVSBUJPO
5IFpSTUEFTJHO /BNJOH 1SFEJDBUF/BNF NPEVMF $POpHVSBCMF 1SFEJDBUF/BNJOH /BNJOH 1SFEJDBUF/BNF NJYJO *OUFSOBM"⒎BJST
%ZOBNJD 1SFEJDBUF/BNF NJYJO &YUSBDU NPEVMF "QQFOE OFXDMBTT $IFDLTUBUJD NFUIPET $IFDLEZOBNJD NFUIPET &YJTUJOH DPQDMBTT 4IBSF DPOpHVSBUJPO
*NQMFNFOUBUJPOUFSN QPXFSFECZIUUQTHJUIVCDPNZZBHJKQDBM
0QFOB13
None
$POWFSTBUJPO
$POWFSTBUJPO
*OUFSOBM"⒎BJSTEFQBSUNFOU JOUFSOBM"1* ˣ /BNJOHEFQBSUNFOU QVCMJTIFE"1* .BLFTFOTF✨
CCBUTPWSVCPDPQ "EEA.FUIPE%FpOF.BDSPTAPQUJPOUP A/BNJOH1SFEJDBUF/BNFADPQ
0QFOB13
5IFTFDPOEEFTJHO /BNJOH 1SFEJDBUF/BNF /BNJOH 1SFEJDBUF/BNF "EE .FUIPE%FpOF.BDSPT PQUJPOUPDPOpHVSBUJPO *OUFSOBM *NQSPWFNFOU
&YJTUJOH DPQDMBTT
%FpOFEFGBVMUQVCMJTIFE"1* DPOpHEFGBVMUZNM /BNJOH1SFEJDBUF/BNF .FUIPEEFpOJUJPONBDSPTGPSEZOBNJDBMMZHFOFSBUFENFUIPET .FUIPE%FpOJUJPO.BDSPT EFpOF@NFUIPE EFpOF@TJOHMFUPO@NFUIPE RuboCopར༻ऀ͕͏σϑΥϧτͷެ։ϝ ιουΛconfig/default.ymlʹఆٛ͢Δ
%FpOFJOUFSOBM"1* SVCPDPQZNM /BNJOH1SFEJDBUF/BNF .FUIPEEFpOJUJPONBDSPTGPSEZOBNJDBMMZHFOFSBUFENFUIPE .FUIPE%FpOJUJPO.BDSPT EFpOF@NFUIPE EFpOF@TJOHMFUPO@NFUIPE EFG@OPEF@NBUDIFS EFG@OPEF@TFBSDI RuboCopࣗମͷ։ൃͰ͏෦తͳϝιου
ΛՃ͑ͯ.rubocop.ymlʹఆٛ͢Δ
w ར༻ऀʹରͯ͠ಈతͳϝιο υఆٛͷνΣοΫΛҰ؏͠ ͯͰ͖ΔΑ͏ʹͳͬͨ w ಈతͳϢʔβʔϝιουఆٛ ͕૿͑ΔΑ͏Ͱ͋ΕઃఆΛ Ճ͢ΕΑ͍ *NQSPWFEEFTJHO
None
w 044DPNNVOJUZJT $PODMVTJPO
044 1SPQSJFUBSZ 4PDJBM 6OTPDJBM FH"OBQQMJDBUJPO EFWFMPQNFOU BGUFS(JU)VC FH"OBQQMJDBUJPO EFWFMPQNFOU CFGPSF(JU)VC
*UJTPQFOUPUIF QVCMJDVOEFS044 MJDFOTFCVUUIFSFJT OPEJBMPHVF 044Y6OTPDJBM1VCMJDSFQP 044DPNNVOJUZ
044 1SPQSJFUBSZ 4PDJBM 6OTPDJBM FH"OBQQMJDBUJPO EFWFMPQNFOU BGUFS(JU)VC FH"OBQQMJDBUJPO EFWFMPQNFOU CFGPSF(JU)VC
*UJTPQFOUPUIF QVCMJDVOEFS044 MJDFOTFCVUUIFSFJT OPEJBMPHVF 044Y4PDJBM044DPNNVOJUZ 044DPNNVOJUZ
SVCZPOSBJMTPSH "O044DPNNVOJUZ
None
$MJDLIFSF
None
None
w ϓϩδΣΫτͰѻ͍ͬͯΔίʔυ ͱ044ͷίʔυܨ͕ΓͰ͋Δ &OUFSUIF044XPSME w Πϯλʔωοτͱ͍͏ڥքͷͳ͍ ੈքͰΓͱΓ͢Δ͓͠Ζ͞ w ࠷ॳͷҰา͕͚͠Ε044(BUF
ͳͲͷࢀՃ͔Β࢝ΊΔͷҰͭ ·ͱΊ
࣍ճ༧ࠂ
ࠒ͍ͬͯΔ044ͰͷൃݟΛ VQTUSFBNʹؐݩ͢Δ &QJTPEFT 1BSU* 1BSU** ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏ Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ 1BSU***
ࠒ͍ͬͯΔ044ͰͷൃݟΛ VQTUSFBNʹؐݩ͢Δ &QJTPEFT 1BSU* 1BSU** ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏ Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ 1BSU***
&OUFSUIF044XPSME <3VCP$PQ> *** &OUFSUIF044XPSME <3VCP$PQ> *** &OUFSUIF044XPSME <3VCP$PQ> ***
l Ұͷ͏ͪίʔυॻ͖ɺ 3VCZ,BJHJͳͲͷΓؒ Ͱ։ൃऀͨͪͱͦͷΛ͢Δ ʔ3VCZ,BJHJ1BSUZΑΓ
FOE