Slide 1

Slide 1 text

3VCP$PQJO 4UBCMFBOE#FZPOE ,PJDIJ*50&4. *OD 3VCZ,BJHJ5BLFPVU Next step toward RuboCop 2.0 5IV

Slide 2

Slide 2 text

!LPJD w 044QSPHSBNNFS w 3VCP$PQDPSFUFBN w )FBENBJOUBJOFSPG3VCP$PQ3BJMT 3VCP$PQ1FSGPSNBODF BOE 3VCP$PQ.JOJUFTU w &OHJOFFSJOH.BOBHFSBOE %JTUJOHVJTIFE&OHJOFFSPG&4. *OD

Slide 3

Slide 3 text

3VCP$PQDPSFEFWFMPQFST +0900 UTC+0200 +0300 +0800 -0400 .PSFUIBODPOUSJCVUPSTJOZFBST

Slide 4

Slide 4 text

3VCP$PQDPSFEFWFMPQFST +0900 UTC+0200 +0300 +0800 -0400 .PSFUIBODPOUSJCVUPSTJOZFBST "VUIPS

Slide 5

Slide 5 text

3VCP$PQDPSFEFWFMPQFST +0900 UTC+0200 +0300 +0800 -0400 .PSFUIBODPOUSJCVUPSTJOZFBST .F

Slide 6

Slide 6 text

.BJOUBJO3VCP$PQ)2&WFSZ%BZ IUUQTHJUIVCDPNLPJD PSHSVCPDPQ

Slide 7

Slide 7 text

.F

Slide 8

Slide 8 text

(JU)VC4QPOTPST

Slide 9

Slide 9 text

&4. *OD

Slide 10

Slide 10 text

%BZ SVCZLBJHJ# %BZ SVCZLBJHJ# 4QFBLFSTGSPN&4. *OD

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

-BTUSFMFBTFCFGPSF 🤔

Slide 14

Slide 14 text

/VNCFSPGEPXOMPBET

Slide 15

Slide 15 text

/VNCFSPGEPXOMPBET

Slide 16

Slide 16 text

#FOFpUTPGVQHSBEJOHUP UIF3VCP$PQW

Slide 17

Slide 17 text

3VCP$PQJO 4UBCMFBOE#FZPOE ,PJDIJ*50&4. *OD 3VCZ,BJHJ5BLFPVU Next step toward RuboCop 2.0 5IV

Slide 18

Slide 18 text

4UBCMF #FZPOE

Slide 19

Slide 19 text

4UBCMF

Slide 20

Slide 20 text

5IFXPSMEBGUFS3VCP$PQ 1BSU

Slide 21

Slide 21 text

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

Slide 24

Slide 24 text

/FXDPQTBSFQFOEJOHCZEFGBVMUVOUJM gem 'rubocop', '~> 1.19', require: false gem 'rubocop', '~> 0.78.0', require: false w/POFFEUPTQFDJGZUIFQBUDI WFSTJPOJO(FNpMFXIFOVTJOH~> WY WY

Slide 25

Slide 25 text

*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💎

Slide 28

Slide 28 text

w"EEFEDPQBVUP DPSSFDUJPOTTJODF w'PSFYBNQMF NPTUPGlayout EFQBSUNFOUDPQTDBOOPX BVUPDPSSFDUPGGFOTFT .PSFBVUPDPSSFDUJPOT

Slide 29

Slide 29 text

)PXUPJOWFTUJHBUF % cd path/to/rubocop % bin/console RuboCop::Cop::Registry.global. with_department(:Layout). reject(&:support_autocorrect?)

Slide 30

Slide 30 text

)PXUPJOWFTUJHBUF % cd path/to/rubocop % bin/console RuboCop::Cop::Registry.global. with_department(:Layout). reject(&:support_autocorrect?) => [RuboCop::Cop::Layout::EndOfLine]

Slide 31

Slide 31 text

8IZOPUTVQQPSUFE % cd path/to/rubocop % bin/console RuboCop::Cop::Registry.global. with_department(:Layout). reject(&:support_autocorrect?) => [RuboCop::Cop::Layout::EndOfLine] *EPOUIBWF8JOEPXT🤦

Slide 32

Slide 32 text

w4BGFBVUPDPSSFDUJPOUIBUEPOPUDIBOHF TFNBOUJDT FHLayoutEFQBSUNFOU w6OTBGFBVUPDPSSFDUJPOUIBUNBZDIBOHF TFNBOUJDTPSMPHJD FHUZQFPGSFUVSOWBMVF w$BOOPUCFBVUPDPSSFDUJPO WBSJBCMFOBNF EPDVNFOU BOEFUD 5ZQFPGBVUPDPSSFDUJPOT

Slide 33

Slide 33 text

w-APQUJPOBQQMJFTTBGFBOEVOTBGFBVUP DPSSFDUJPO FHStyle/FrozenStringLiteralComment w5IJTPQUJPOJTUIFTBNF-aCFIBWJPSPG 3VCP$PQBOEMPXFS w-JLFgit branch -dWT-D <'"2>-A, --auto-correct-all

Slide 34

Slide 34 text

3VCZOFXTZOUBY w1BUUFSONBUDIJOH /VNCFSFEQBSBNFUFST &OEMFTT NFUIPEEFpOJUJPO BOEFUD w"TBUSJWJBGPSDPQEFWFMPQFST UIFPOFMJOFQBUUFSO NBUDIJOHTZOUBY"45EJGGFSTCFUXFFOBOE In Ruby 2.7(Parser::Ruby27) SVCZQBSTFFJOGPP NBUDIQBUUFSO JOU NBUDIWBSGPP SVCZQBSTFFGPP NBUDIQBUUFSO JOU NBUDIWBSGPP SVCZQBSTFFJOGPP NBUDIQBUUFSOQ JOU NBUDIWBSGPP In Ruby 3.0(Parser::Ruby30) ruby-parseDPNNBOEJTQSPWJEFECZ1BSTFSHFN

Slide 35

Slide 35 text

w--parallelPQUJPOGPSQBSBMMFM QSPDFTTJOHVTJOH1BSBMMFMHFN w.PEFSO1$TIBWFCFUUFS1$SFTPVSDFT NVMUJDPSFT IVHFNFNPSZ BOEFUD w#ZEFGBVMU QBSBMMFMQSPDFTTJOHJT FOBCMFEFYDFQUGPS8JOEPXTBOE+3VCZ 1FSGPSNBODF

Slide 36

Slide 36 text

SVCPDPQSVCPDPQ 1BSBMMFMTUBUJDBOBMZTJTCZEFGBVMU

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

DPSF$16T)ZQFS5ISFBEJOH TFD OPQBSBMMFM QBSBMMFM w8IFO3VCP$PQ JOTQFDUTBMPUPG pMFT JUXJMMCF FGGFDUJWF wFHTFDTFD BCPVUpMFT

Slide 39

Slide 39 text

3BOLJOHDPQTCZQFSGPSNBODF NFNPSZ@QSPpMFS BOE4UBDL1SPG DPOUSJCVUFUP SFNBSLBCMZTMPX DPQTQFSGPSNBODF JNQSPWFNFOU

Slide 40

Slide 40 text

w3VCZTUBUJDBOBMZTJTXJUIPVUTUBUJDUZQJOH TUSVHHMJOHBHBJOTUGBMTFQPTJUJWFTBOE GBMTFOFHBUJWFT w"VUPDPSSFDUFEDPEFNBZUSJHHFS VOFYQFDUFECFIBWJPST TPJGZPVDPNF BDSPTTBDBTFUIBUZPVUIJOLJTTUSBOHF TUPQBOESFWJFXJUBHBJO #VHpYFT

Slide 41

Slide 41 text

SVCPDPQSVCPDPQ $IBOHFFOGPSDFETUZMFUPDPOEJUJPOBMTGPS4UZMF"OE0S

Slide 42

Slide 42 text

#VHpYFT w*OUIFQBTU 3VCP$PQTVHHFTUFEUPDIBOHF expr and returnUPexpr && returnCZEFGBVMU w*UMPPLFEXFJSE TP*DIBOHFEUIFDPOpHVSBUJPO UPBDDFQUexpr and returnCZEFGBVMU 6TF `and return` % ruby -e \ 'p false || true and return' # => true # p(false || true) and return % ruby -e \ 'p false || true && return' # noop # p(false || (true && return)) 6TF `&& return`

Slide 43

Slide 43 text

w /FXGFBUVSFTXJUICBDLXBSE DPNQBUJCJMJUZ w 3VCZOFXTZOUBYTVQQPSU w #FUUFSQFSGPSNBODF w #VHpYFT 8IBUZPVDBOHFUXJUIVQHSBEF💎

Slide 44

Slide 44 text

3VCP$PQJTBTUBUJDBOBMZTJT UPPM*GZPVXBOUUPXSJUFB QBUDIJO3VCP$PQ ZPVTIPVME LFFQJONJOEUIBUEZOBNJD BOBMZTJTJTOPUBWBJMBCMF

Slide 45

Slide 45 text

3FTUSJDUJPOPGTUBUJDBOBMZTJT XJUIPVUTUBUJDUZQJOH 1BSU

Slide 46

Slide 46 text

w 3VCZIBTOPTUBUJDUZQJOH w /PUZQFJOGPSNBUJPOGPSWBSJBCMFT BSHVNFOUT SFUVSOWBMVFT XJUIPVU3#4 w Safe: falseJTTFUJODBTFTXIFSFGBMTF QPTJUJWFTDBOOPUCFQSFWFOUFE w "WPJESafe: falseBTNVDIBTQPTTJCMF BOE EFTJHODPQTDBSFGVMMZOPUUPDBVTFGBMTF QPTJUJWFT 3VCP$PQJTBTUBUJDBOBMZ[FS

Slide 47

Slide 47 text

SBJMTSBJMT 5XFBLVOSFBDIBCMFBTTFSUJPOUFTUTJOUIFCMPDLPGABTTFSU@SBJTFTA

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

SVCPDPQSVCPDPQNJOJUFTU <'JY>"EEOFX.JOJUFTU6OSFBDIBCMF"TTFSUJPODPQ

Slide 50

Slide 50 text

&YBNQMF IUUQTEPDTSVCPDPQPSHSVCPDPQNJOJUFTUDPQT@NJOJUFTUIUNMNJOJUFTUVOSFBDIBCMFBTTFSUJPO

Slide 51

Slide 51 text

)PXEJE*SFTPMWFUIFJTTVF UIBU3VCP$PQJTOPUBCMFUP EFUFDUUIFMPDBUJPOXIFSF FYDFQUJPOTPDDVSSFE 🤔

Slide 52

Slide 52 text

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

Slide 69

Slide 69 text

IUUQTHJUIVCDPNSVCPDPQSVCPDPQQVMMJTTVFDPNNFOU 8IFOSFMFBTF 5#) OPQMBOT😅

Slide 70

Slide 70 text

*EFBTGPSGVUVSFPG3VCP$PQ 1BSU

Slide 71

Slide 71 text

"Default rules are too strict, but customization is hard..." 'FFECBDLGSPNVTFST

Slide 72

Slide 72 text

"Default rules are too strict, but customization is hard..." 'FFECBDLGSPNVTFST *EPOUIBWFUIFCFTUBOTXFS CVU*MMUBMLJEFBTIFSF

Slide 73

Slide 73 text

w4UBSUXJUIUIFEFGBVMUEJTBCMFE BOEFOBCMFDPQTUFQCZTUFQ w6TFSVCPDPQ@UPEPZNM w3JEFPOSEQBSUZQSFTFU w$PNCJOFUIFN 0QUJPOTBWBJMBCMF

Slide 74

Slide 74 text

"QQMJDBUJPOTUSBUFHZ %JTBCMFE#Z%FGBVMUUSVF &OBCMFE#Z%FGBVMUUSVF %FGBVMUDPOpHVSBUJPO 5IJSEQBSUZQSFTFU 3VMFTUSFOHUIBOEDPNQMFYJUZ 5JNFUPBQQMZ3VCP$PQ $VTUPNDPOpHVSBUJPO 8IFUIFSUPDPOpHVSFPSOPU 8IFUIFSUPDPOpHVSFPSOPU 1SPCBCMZPOMZGPS3VCP$PQUFTUJOH $POpHVSFMBUFS 5IFDPOpHVSBUJPOZPVMJLF ⭐ ⭐ ⭐ ⭐)PXUPHFUTUBSUFE .BZCFUIFSFJTBQSFTFUUIBU JTDMPTFUPZPVSUBTUF 3VMFTFUUPBQQMZ

Slide 75

Slide 75 text

"QQMJDBUJPOTUSBUFHZ %JTBCMFE#Z%FGBVMUUSVF &OBCMFE#Z%FGBVMUUSVF %FGBVMUDPOpHVSBUJPO 5IJSEQBSUZQSFTFU Today's topic 3VMFTUSFOHUIBOEDPNQMFYJUZ 5JNFUPBQQMZ3VCP$PQ $VTUPNDPOpHVSBUJPO 8IFUIFSUPDPOpHVSFPSOPU 8IFUIFSUPDPOpHVSFPSOPU 1SPCBCMZPOMZGPS3VCP$PQUFTUJOH $POpHVSFMBUFS 5IFDPOpHVSBUJPOZPVMJLF ⭐ ⭐ ⭐ ⭐)PXUPHFUTUBSUFE .BZCFUIFSFJTBQSFTFUUIBU JTDMPTFUPZPVSUBTUF 3VMFTFUUPBQQMZ

Slide 76

Slide 76 text

w"QQMZSVMFTFBDIUJNFZPV FODPVOUFSBOPGGFOTF %3: %JTBCMFE#Z%FGBVMUUSVF

Slide 77

Slide 77 text

3JEFPO5IJSEQBSUZQSFTFU

Slide 78

Slide 78 text

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

Slide 80

Slide 80 text

IUUQTEPDTSVCPDPQPSHSVCPDPQFYUFOTJPOTIUNMDPQFYUFOTJPOT

Slide 81

Slide 81 text

IUUQTHJUIVCDPNHJUIVCSVCPDPQHJUIVC

Slide 82

Slide 82 text

0OFPGJEFBTGPS GVUVSF3VCP$PQ

Slide 83

Slide 83 text

.JOJNVNQSFTFU %JTBCMFE#Z%FGBVMUUSVF &OBCMFE#Z%FGBVMUUSVF %FGBVMUDPOpHVSBUJPO 5IJSEQBSUZQSFTFU 3VMFTUSFOHUI CVUDPNQMFY 5JNFUPJOUSPEVDFBQSPKFDU $VTUPNDPOpHVSBUJPO 8IFUIFSUPDPOpHVSFPSOPU 8IFUIFSUPDPOpHVSFPSOPU 1SPCBCMZPOMZGPS3VCP$PQUFTUJOH $POpHVSFMBUFS 5IFDPOpHVSBUJPOZPVMJLF ⭐ ⭐ ⭐ ⭐)PXUPHFUTUBSUFE .BZCFUIFSFJTBQSFTFUUIBU JTDMPTFUPZPVSUBTUF 3VMFTFUUPBQQMZ JEFB .JOJNVNQSFTFUGSPNP⒏DJBM

Slide 84

Slide 84 text

SVCPDPQSVCPDPQ 1SPQPTBMUPEJTDVTT4VHHFTUJPONPEFDPQT

Slide 85

Slide 85 text

IUUQTHJUIVCDPNSVCPDPQSVCPDPQJTTVFTJTTVFDPNNFOU

Slide 86

Slide 86 text

No content

Slide 87

Slide 87 text

w&WFSZ3VCZQSPHSBNNFSTIBWF QSFGFSFODFT EJWFSTJUZJTHPPE w*O3VCZ TUZMFQSFGFSFODFTUFOEUP WBSZGSPNQFSTPOUPQFSTPO w"QQBSFOUMZFWFO3VCZDPNNJUUFST IBWFEJGGFSFOUUBTUFT😅 3VCZJTBUSVMZFYQSFTTJWFMBOHVBHF

Slide 88

Slide 88 text

'JYJOHUIFQSFTFUTFFNT EJGpDVMU 🤔 To be continued…

Slide 89

Slide 89 text

5IF3VCZDPODFQU 4NBSUFS 'BTUFS

Slide 90

Slide 90 text

QPDLFSVCPDPQUZQFE $PQJEFBT

Slide 91

Slide 91 text

w SVCPDPQUZQFEJTB1P$UIBU DPNCJOFT4UFFQTTUBUJDUZQFDIFDLFS w 6TJOHUZQFJOGPSNBUJPOXJMMTPMWF TPNFGBMTFQPTJUJWFT w 3VCP$PQXJMMCFBCMFUPQFSGPSN TNBSUFSTUBUJDBOBMZTJT $BOUZQFJOGPSNBUJPOCFBHBNFDIBOHFS

Slide 92

Slide 92 text

SVCPDPQSVCPDPQ 1FSGPSNBODFJNQSPWFNFOUTGPSCFUUFSFEJUPSJOUFHSBUJPO

Slide 93

Slide 93 text

w #PPUTOBQXBTQSPQPTFEJOUIFQBTU CVUXPSUISFWJTJUFE w *OUFHSBUFEBFNPOTMJLFSVCPDPQ EBFNPO BOEDPMMBCPSBUFXJUI-41 4PMBSHSBQI w *UTIPVMEDPOUSJCVUFUPUIF3VCZ DPODFQU4NBSUFS 'BTUFS 1FSGPSNBODFJNQSPWFNFOUJEFBT

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

.BOZPGZPVVTFT3VCP$PQ JUTBHSFBUUPPM CVUXFDBO JNQSPWFJUBMPUJOUIFGVUVSF .BU[TBJE &VSVLP,FZOPUF #FZPOE3VCZ

Slide 96

Slide 96 text

-41 3#* 3#4 3VCP$PQ 4PMBSHSBQI 4PSCFU 4UFFQ 5ZQF1SPG &MFNFOUTPG&P% 💨 BOENPSF

Slide 97

Slide 97 text

3VCZTUBUJDBOBMZTJTUPPMT XJMMDPOUJOVFUPJNQSPWF rubocop.org