Rails Developers Meetup 2017 https://railsdm.github.io/2017/
&OUFSUIF044XPSME<3VCP$PQ>**MPTUCPVOEBSZ&OUFSUIF044XPSME<3VCP$PQ>**MPTUCPVOEBSZ&OUFSUIF044XPSME<3VCP$PQ>**MPTUCPVOEBSZ&OUFSUIF044XPSME<3VCP$PQ>**MPTUCPVOEBSZ&OUFSUIF044XPSME<3VCP$PQ>**MPTUCPVOEBSZ5&$)1-":4)*#6:",PJDIJ*50FTN 4BU3BJMT%FWFMPQFST.FFUVQ5&$)1-":4)*#6:",PJDIJ*50FTN 4BU3BJMT%FWFMPQFST.FFUVQ5&$)1-":4)*#6:",PJDIJ*50FTN 4BU3BJMT%FWFMPQFST.FFUVQ5&$)1-":4)*#6:",PJDIJ*50FTN 4BU3BJMT%FWFMPQFST.FFUVQ5&$)1-":4)*#6:",PJDIJ*50FTN 4BU3BJMT%FWFMPQFST.FFUVQ
View Slide
8FMDPNFGFFECBDL(FNpMFHJU@TPVSDF HJUIVC\cSFQPcIUUQTHJUIVCDPN\SFQP^HJU^!HFNSBJMT HJUIVCSBJMTSBJMTHFNBDUJWFSFDPSEPSBDMF@FOIBODFEBEBQUFS HJUIVCbSTJNPSBDMFFOIBODFEPreparing for upgrade to Rails 5.2uses master branch instead of beta.
0DUPCFS 3VCP$PQSFMFBTFE
ࠒ͍ͬͯΔ044ͰͷൃݟΛVQTUSFBNʹؐݩ͢Δ&QJTPEFT1BSU*1BSU**1BSU***ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ
&QJTPEFT1BSU*ࠒ͍ͬͯΔ044ͰͷൃݟΛVQTUSFBNʹؐݩ͢Δ1BSU**1BSU***ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ
Enter the OSS worldRuboCopI. presage comment
1SFNPOJUJPO
"3BJMTBQQMJDBUJPOEFWFMPQNFOU
3FWJFXDPNNFOU
ࣗͨͪͷࢦఠͨ͜͠ͱଞͷػձͰࢦఠ͞Ε͏Δ
044ใԽٕज़Λ௨ͯ͡ʜ3JEFPO044
IUUQTUXJUUFSDPNPOLTUBUVT
ࠒ͍ͬͯΔ044ͰͷൃݟΛVQTUSFBNʹؐݩ͢Δ&QJTPEFT1BSU*1BSU**ιʔγϟϧίʔσΟϯάΛ௨ͯ͡Ͳ͏Ϣʔβʔ͕͏ܗʹͳ͍͔ͬͯ͘ͷ1BSU***
Enter the OSS worldRuboCopII. lost boundary
044ʹͦΕͳΓʹ͋ΓɺΞϓϦέʔγϣϯ͔Βܨ͕͍ͬͯΔҎ্ɺଞਓࣄͷίʔυͰͳ͍3JEFPO044
ؔΘΓํͷελΠϧྫw۩ମతʹࠔ͍ͬͯΔw͓͠Ζͦ͏wແཧ͠ͳ͍όʔϯΞτ͠ͳ͍Α͏τϦΞʔδ͢Δ
$MJDLlCVHzMBCFM
3BJMT).PS)0%FQFOEFOU
8IBUJTUIJT$PQ
CCBUTPWSVCPDPQ<'JY>'JYA3BJMT)BT.BOZ0S)BT0OF%FQFOEFOUAJODPSSFDUMZqBHTAXJUI@PQUJPOTACMPDLT
8SJUFSFQSPEVDUJPOTQFDTDPOUFYUXJUI@PQUJPOTEFQFOEFOUEFTUSPZEPJUEPFTOPUSFHJTUFSBOP⒎FOTFEPFYQFDU@OP@P⒎FOTFT 36#:TUSJQ@JOEFOUDMBTT1FSTPOXJUI@PQUJPOTEFQFOEFOUEFTUSPZEPIBT@POFGPPFOEFOE36#:FOEFOE# Goal: False positive don't occur below!class Personwith_options dependent: :destroy dohas_one :fooendend
XJUI@PQUJPOTPG"45SVCZQBSTFFXJUI@PQUJPOTEFQFOEFOUEFTUSPZEPcBTTPDcBTTPDIBT@POFGPPFOE`!CMPDL TFOEOJMXJUI@PQUJPOT IBTI QBJS TZNEFQFOEFOU TZNEFTUSPZ BSHT QSPDBSHBTTPD TFOE MWBSBTTPDIBT@POF TZNGPP
XJUI@PQUJPOTPG"45QPXFSFECZIUUQTHJUIVCDPNLPJDSVCZ@BTU@WJTVBMJ[FS
*NQMFNFOUBUJPO3FE (SFFO 3FGBDUPS5FTUDPEFJTNPSFPCWJPVTBOEFBTJFSUPVOEFSTUBOEUIBOUIFPQFSBUJPOPG"45
0QFOB13
$POWFSTBUJPOAJT@IBT@NBOZ@PS@IBT@POF@XJUIPVU@PQUJPOT AJTBOFYJTUJOHNFUIPEOBNF
"CPVU/BNJOH1SFEJDBUF/BNF
EFG@OPEF@NBUDIFSEFG@OPEF@NBUDIFSJT@YYY 1"55&3/ TFOEOJM \IBT@NBOZIBT@POF^@1"55&3/def_node_matcher dynamic defines a methodwhich applies a pattern to an AST node./PUF/BNJOH1SFEJDBUF/BNFDPQEPFTOPUBXBSFPGEZOBNJDBMMZEFpOFENFUIPEPSMPXFS-JLFEFpOF@NFUIPE EFpOF@TJOHMFHPO@NFUIPE
$POWFSTBUJPO
"OUJGBU13
ผͱͯ͠Γग़ͤΔΑ͏Ͱ͋Εผͷ13Ͱରॲ͢ΔΑ͏ʹ͍ͯ͠ΔͱͱજΜͰ͍ͨͱͷରቂͪΖΜͦͷ13Ͱͷมߋ͕దͰ͋Εɺͦͷ13ͰରԠ͢Δ
CCBUTPWSVCPDPQ"EEOFXA*OUFSOBM"⒎BJST%ZOBNJD1SFEJDBUF/BNFADPQ
5IFpSTUEFTJHO/BNJOH1SFEJDBUF/BNF&YJTUJOHDPQDMBTT
5IFpSTUEFTJHO/BNJOH1SFEJDBUF/BNFNPEVMF$POpHVSBCMF1SFEJDBUF/BNJOH/BNJOH1SFEJDBUF/BNFNJYJO&YUSBDUNPEVMF$IFDLTUBUJDNFUIPET&YJTUJOHDPQDMBTT4IBSFDPOpHVSBUJPO
5IFpSTUEFTJHO/BNJOH1SFEJDBUF/BNFNPEVMF$POpHVSBCMF1SFEJDBUF/BNJOH/BNJOH1SFEJDBUF/BNFNJYJO*OUFSOBM"⒎BJST%ZOBNJD1SFEJDBUF/BNFNJYJO&YUSBDUNPEVMF"QQFOEOFXDMBTT$IFDLTUBUJDNFUIPET$IFDLEZOBNJDNFUIPET&YJTUJOHDPQDMBTT4IBSFDPOpHVSBUJPO
*NQMFNFOUBUJPOUFSNQPXFSFECZIUUQTHJUIVCDPNZZBHJKQDBM
*OUFSOBM"⒎BJSTEFQBSUNFOUJOUFSOBM"1*ˣ/BNJOHEFQBSUNFOUQVCMJTIFE"1*.BLFTFOTF✨
CCBUTPWSVCPDPQ"EEA.FUIPE%FpOF.BDSPTAPQUJPOUPA/BNJOH1SFEJDBUF/BNFADPQ
5IFTFDPOEEFTJHO/BNJOH1SFEJDBUF/BNF/BNJOH1SFEJDBUF/BNF"EE.FUIPE%FpOF.BDSPTPQUJPOUPDPOpHVSBUJPO*OUFSOBM*NQSPWFNFOU&YJTUJOHDPQDMBTT
%FpOFEFGBVMUQVCMJTIFE"1*DPOpHEFGBVMUZNM/BNJOH1SFEJDBUF/BNF.FUIPEEFpOJUJPONBDSPTGPSEZOBNJDBMMZHFOFSBUFENFUIPET.FUIPE%FpOJUJPO.BDSPTEFpOF@NFUIPEEFpOF@TJOHMFUPO@NFUIPERuboCopར༻ऀ͕͏σϑΥϧτͷެ։ϝιουΛconfig/default.ymlʹఆٛ͢Δ
%FpOFJOUFSOBM"1*SVCPDPQZNM/BNJOH1SFEJDBUF/BNF.FUIPEEFpOJUJPONBDSPTGPSEZOBNJDBMMZHFOFSBUFENFUIPE.FUIPE%FpOJUJPO.BDSPTEFpOF@NFUIPEEFpOF@TJOHMFUPO@NFUIPEEFG@OPEF@NBUDIFSEFG@OPEF@TFBSDIRuboCopࣗମͷ։ൃͰ͏෦తͳϝιουΛՃ͑ͯ.rubocop.ymlʹఆٛ͢Δ
w ར༻ऀʹରͯ͠ಈతͳϝιουఆٛͷνΣοΫΛҰ؏ͯ͠Ͱ͖ΔΑ͏ʹͳͬͨw ಈతͳϢʔβʔϝιουఆ͕ٛ૿͑ΔΑ͏Ͱ͋ΕઃఆΛՃ͢ΕΑ͍*NQSPWFEEFTJHO
w 044DPNNVOJUZJT$PODMVTJPO
0441SPQSJFUBSZ4PDJBM6OTPDJBMFH"OBQQMJDBUJPOEFWFMPQNFOUBGUFS(JU)VCFH"OBQQMJDBUJPOEFWFMPQNFOUCFGPSF(JU)VC*UJTPQFOUPUIFQVCMJDVOEFS044MJDFOTFCVUUIFSFJTOPEJBMPHVF044Y6OTPDJBM1VCMJDSFQP044DPNNVOJUZ
0441SPQSJFUBSZ4PDJBM6OTPDJBMFH"OBQQMJDBUJPOEFWFMPQNFOUBGUFS(JU)VCFH"OBQQMJDBUJPOEFWFMPQNFOUCFGPSF(JU)VC*UJTPQFOUPUIFQVCMJDVOEFS044MJDFOTFCVUUIFSFJTOPEJBMPHVF044Y4PDJBM044DPNNVOJUZ044DPNNVOJUZ
SVCZPOSBJMTPSH"O044DPNNVOJUZ
$MJDLIFSF
w ϓϩδΣΫτͰѻ͍ͬͯΔίʔυͱ044ͷίʔυܨ͕ΓͰ͋Δ&OUFSUIF044XPSMEw Πϯλʔωοτͱ͍͏ڥքͷͳ͍ੈքͰΓͱΓ͢Δ͓͠Ζ͞w ࠷ॳͷҰา͕͚͠Ε044(BUFͳͲͷࢀՃ͔Β࢝ΊΔͷҰͭ·ͱΊ
࣍ճ༧ࠂ
&OUFSUIF044XPSME<3VCP$PQ>***&OUFSUIF044XPSME<3VCP$PQ>***&OUFSUIF044XPSME<3VCP$PQ>***
lҰͷ͏ͪίʔυॻ͖ɺ3VCZ,BJHJͳͲͷΓؒͰ։ൃऀͨͪͱͦͷΛ͢Δʔ3VCZ,BJHJ1BSUZΑΓ
FOE