!LPJD
w 044QSPHSBNNFS
w 3VCP$PQDPSFUFBN
w )FBENBJOUBJOFSPG3VCP$PQ3BJMT
3VCP$PQ1FSGPSNBODF
BOE
3VCP$PQ.JOJUFTU
w &OHJOFFSJOH.BOBHFSBOE
%JTUJOHVJTIFE&OHJOFFSPG&4.
*OD
w WYDBVTFECSFBLJOHDIBOHFTBOE
VOLOPXOXBSOJOHTEVFUPTVEEFO
SFOBNJOHDPQOBNFTBOEOFXSVMFT
w WYEPFTOPUDIBOHFDPQOBNFT
w "MMPGOFXDPQTBSFQFOEJOHCZ
EFGBVMU
WIBTJOUFSGBDFDPNQBUJCJMJUZ
CFUXFFOSFMFBTFT
Slide 22
Slide 22 text
w %POUBEEOFXDPEJOHSVMFTBT
3VCP$PQEPFTOULOPXXIFUIFS
OFXDPQTXJMMNBUDIZPVSUBTUF
w /FXDPQTPDDBTJPOBMMZIBWFCVHT💦
3FEVDFVQHSBEFQBJO
Slide 23
Slide 23 text
w %POUBEEOFXDPEJOHSVMFTBT
3VCP$PQEPFTOULOPXXIFUIFS
OFXDPQTXJMMNBUDIZPVSUBTUF
w /FXDPQTPDDBTJPOBMMZIBWFCVHT💦
3FEVDFVQHSBEFQBJO
👉:PVDBODIPPTFXIFUIFSFOBCMFEPS
EJTBCMFEGPSWNJOPSWFSTJPOVQHSBEF
*GZPVBSFFBSMZBEPQUFS
ZPVDBOFOBCMFQFOEJOHDPQT
&OBCMFOFXDPQT
% bundle exec rubocop
The following cops were added to RuboCop, but are not configured. Please set
Enabled to either `true` or `false` in your `.rubocop.yml` file.
Please also note that you can opt-in to new cops by default by adding this to
your config:
AllCops:
NewCops: enable
Gemspec/DateAssignment: # (new in 1.10)
Enabled: true
Layout/LineEndStringConcatenationIndentation: # (new in 1.18)
Enabled: true
Layout/SpaceBeforeBrackets: # (new in 1.7)
Enabled: true
Lint/AmbiguousAssignment: # (new in 1.7)
Enabled: true
Slide 26
Slide 26 text
w 4FUEnabledUPFJUIFStruePSfalseJOZPVS
SVCPDPQZNM
w :PVDBODIPPTFFOBCMFOFXDPQTCZ
EFGBVMUJGZPVXBOUJUNewCops: enable
UPSVCPDPQZNM
w 0S
EJTBCMFOFXDPQTCZEFGBVMUJGZPV
EPOUXBOUJUNewCops: disable
&OBCMFOFXDPQT
Slide 27
Slide 27 text
w /FXGFBUVSFTXJUICBDLXBSE
DPNQBUJCJMJUZ
w 3VCZOFXTZOUBYTVQQPSU
w #FUUFSQFSGPSNBODF
w #VHpYFT
8IBUZPVDBOHFUXJUIVQHSBEF💎
w 3VCZIBTOPTUBUJDUZQJOH
w /PUZQFJOGPSNBUJPOGPSWBSJBCMFT
BSHVNFOUT
SFUVSOWBMVFT XJUIPVU3#4
w Safe: falseJTTFUJODBTFTXIFSFGBMTF
QPTJUJWFTDBOOPUCFQSFWFOUFE
w "WPJESafe: falseBTNVDIBTQPTTJCMF
BOE
EFTJHODPQTDBSFGVMMZOPUUPDBVTFGBMTF
QPTJUJWFT
3VCP$PQJTBTUBUJDBOBMZ[FS
w "TTFSUJPONFUIPEOPUVTFEJO
assert_raises
w *OPUIFSXPSET
HPPEDBTF
5SVFOFHBUJWF
EFpOJUFMZ
assert_raises FooError do
do_something('foo', obj.bar)
end
"TTFSUJPONFUIPEOPUVTFE
Slide 53
Slide 53 text
assert_raises FooError do
obj.foo
assert_equal('foo', obj.bar)
end
w "OBTTFSUJPONFUIPE FHassert_equal
JT
DBMMFEBUUIFCPUUPNPGassert_raisesCMPDL
w 5IFSFGPSF
OPUBTTFSUFEJUCFDBVTFBO
FYDFQUJPOTIPVMEIBWFPDDVSSFE
TPNFXIFSFCFGPSF
5SVFQPTJUJWF
EFpOJUFMZ
assert_equalJTOFWFSDBMMFE
assert_raises FooError do
obj.foo
assert_equal('foo', obj.bar)
end
%PFTfooSBJTFBOFYDFQUJPO
0S
EPFTbarSBJTFBOFYDFQUJPO
assert_equalJTOFWFSDBMMFECFDBVTFUIFNFUIPEJTFWBMVBUFEMBTU
Slide 54
Slide 54 text
w GBMTFQPTJUJWFJGOPFYDFQUJPO
PDDVSTJOobj.foo
w USVFQPTJUJWFJGBOFYDFQUJPO
PDDVSTJOobj.foo
$POTFSWBUJWFEFTJHO
assert_raises FooError do
assert_equal('foo', obj.foo)
obj.bar
end
*GJUEPFTOUSBJTFTIFSF
JUTBGBMTFQPTJUJWF
*GJUSBJTFTIFSF
JUTBUSVFQPTJUJWF
RuboCop don't know if it's a false positive or not
Slide 55
Slide 55 text
w *GUIFMBTUNFUIPEDBMMFEJTBOBTTFSUJPO
NFUIPE
UIFSFTIPVMECFBOFYDFQUJPOJO
UIFQSFWJPVTNFUIPEDBMM /FWFSSFBDIFE
w 'BMTFOFHBUJWFTBDDFQUFE
w 1SFWFOUCSFBLJOHDPEFCZGBMTFQPTJUJWFT
w /PUFTUDPEFQSPUFDUTUIFUFTUDPEF
%FTJHOUPBWPJEGBMTFQPTJUJWFT
Slide 56
Slide 56 text
w *UTJNQPSUBOUUPSVO3VCP$PQUIBUBDUVBMMZVTFT
.JOJUFTU
w *SBOJUJOUIFSBJMTSBJMTSFQPTJUPSZBOEGPVOE
GBMTFQPTJUJWFT
w "EESVCPDPQNJOJUFTUUPSBJMTSBJMT(FNpMFBOE
TQFDJGZpathPSgithubPQUJPO
w 3VOrubocop --only Minitest/UnreachableAssertion
%PHGPPEJOHXJUISFBMXPSMEDPEF
Slide 57
Slide 57 text
No content
Slide 58
Slide 58 text
Support OSS community
Slide 59
Slide 59 text
4UBCMF
#FZPOE
Slide 60
Slide 60 text
#FZPOE
Slide 61
Slide 61 text
#SFBLJOHDIBOHFTQMBOOFE
GPS3VCP$PQ
1BSU
Slide 62
Slide 62 text
w 6TFBaseDMBTTJOTUFBEPGCopDMBTT
w .PTUPGHFNTNBJOUBJOFECZSVCPDPQPSH
TVDIBT3VCP$PQ1FSGPSNBODF
3BJMT
34QFD
.JOJUFTU
3BLFIBWFCFFONJHSBUFE
w "EFQSFDBUFEXBSOJOHNBZCFEJTQMBZFE
BGUFS3VCP$PQDPSFJUTFMGIBTCFFOBMM
NJHSBUFE
W"1*GPSDPQEFWFMPQFST
Slide 63
Slide 63 text
< Base
FYUFOE"VUP$PSSFDUPS
EPcDPSSFDUPSc
Slide 64
Slide 64 text
w $POTJEFSEFpOJOH
RESTRICT_ON_SENDDPOTUBOUXIFO
EFpOJOHon_sendIBOEMFS
<5JQ>1FSGPSNBODFJNQSPWFNFOU
# `on_send` is called only when `foo` was called
class ExampleCop < Base
RESTRICT_ON_SEND = %i[foo].freeze
def on_send(node) = add_offense(node)
end
Slide 65
Slide 65 text
w $PQOBNFTBOEDPOpHVSBUJPO
PQUJPOOBNFTJOSVCPDPQZNMBOE
UIFDPNNBOEMJOFPQUJPOTDBOOPU
CFDIBOHFEFBTJMZJOW
w 5IPTFOBNFTXJMMCFDIBOHFEJO
7
/BNJOHNBUUFST
Slide 66
Slide 66 text
w $VSSFOUMZOPXBSOJOHJTEJTQMBZFE
TPGUEFQSFDBUJPO
w 8JMMEJTQMBZBXBSOJOHBUTPNF
QPJOUJOW
w 5IPTF"1*XJMMCFDIBOHFE
PSSFNPWFE
JOW
%FQSFDBUFE"1*GPSSEQBSUZHFNT
Slide 67
Slide 67 text
w TargetRailsVersionBOETJNJMBS"1*
SFNBJOTJO3VCP$PQDPSFBGUFS3BJMT
EFQBSUNFOUFYUSBDUFE
w 3FNPWJOHTargetRailsVersion BOE
TJNJMBS"1*SFGFSFODFECZ3VCP$PQ
3BJMTJTBCSFBLJOHDIBOHF
TP*XJMM
UBLFJUDBSFGVMMZ
3FNPWF3BJMTEFQFOEFODJFTGSPNDPSF
Slide 68
Slide 68 text
w $PQTXIPBSFOPUEJTBCMFEJOZPVS
SVCPDPQZNMXJMMCFFOBCMFECZ
EFGBVMUTJODF3VCP$PQ
w 5IFSFBSFBCPVUOFXDPQTJO
3VCP$PQ
w *UXJMMJODSFBTFJOUIFGVUVSF
1FOEJOHDPQTXJMMCFFOBCMFECZEFGBVMU
3VOUJNFFOHJOFBOE
DPSFDPQT
$POpHVSBUJPO
$POpHVSBUJPO
3VCP$PQDPSF
SVCPDPQZNM
SBJMTSBJMTSFQP
&YUFOEBCMFDPOpHVSBUJPO
$POpHVSBUJPO
SVCPDPQSBJMT@DPOpH
HFN
SVCPDPQZNM
BQQMJDBUJPO
4UBOEBSEHFN
UFTUEPVCMFTUBOEBSE
You can use existing 3rd party configurations
Configurable No configuration
Slide 79
Slide 79 text
3VOUJNFFOHJOFBOE
DPSFDPQT
$POpHVSBUJPO
1SFTFUDPOpHVSBUJPO
3VCP$PQDPSF
SVCPDPQZNM
SBJMTSBJMTSFQP
3JEFPOSEQBSUZQSFTFUXBZ
$POpHVSBUJPO
SVCPDPQSBJMT@DPOpH
HFN
SVCPDPQZNM
BQQMJDBUJPO
4UBOEBSEHFN
UFTUEPVCMFTUBOEBSE
You can use existing 3rd party preset or your config
Configurable No configuration
w SVCPDPQUZQFEJTB1P$UIBU
DPNCJOFT4UFFQTTUBUJDUZQFDIFDLFS
w 6TJOHUZQFJOGPSNBUJPOXJMMTPMWF
TPNFGBMTFQPTJUJWFT
w 3VCP$PQXJMMCFBCMFUPQFSGPSN
TNBSUFSTUBUJDBOBMZTJT
$BOUZQFJOGPSNBUJPOCFBHBNFDIBOHFS
w #PPUTOBQXBTQSPQPTFEJOUIFQBTU
CVUXPSUISFWJTJUFE
w *OUFHSBUFEBFNPOTMJLFSVCPDPQ
EBFNPO BOEDPMMBCPSBUFXJUI-41
4PMBSHSBQI
w *UTIPVMEDPOUSJCVUFUPUIF3VCZ
DPODFQU4NBSUFS
'BTUFS
1FSGPSNBODFJNQSPWFNFOUJEFBT