Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Improve Ruby coding styles and Lint

Improve Ruby coding styles and Lint

RubyKaigi 2018
http://rubykaigi.org/2018

Koichi ITO

June 01, 2018
Tweet

More Decks by Koichi ITO

Other Decks in Programming

Transcript

  1. 'SJ

    Improve Ruby coding
    style rules and Lint
    ,PJDIJ*50FTN
    3VCZ,BJHJ
    4FOEBJ*OUFSOBUJPOBM$FOUFS)BHJ
    How do you join social coding?

    View Slide

  2. !LPJD

    View Slide

  3. QPTJUJPOUBML

    View Slide

  4. :PVNBZLOPX
    BGBNPVTMBSHF
    044DPNNVOJUZ

    View Slide

  5. View Slide

  6. View Slide

  7. *U`TNF

    View Slide

  8. View Slide

  9. w*NQSPWFUFTUDPWFSBHFGPS0SBDMF
    FOIBODFEBEBQUFS
    w*OUSPEVDF'SP[FO4USJOH-JUFSBMT
    w4VQQSFTTXBSOJOHTXJUI&EHF3VCZ
    w*NQPSUFYQPSU3VCP$PQ
    DPOpHVSBUJPOT
    w/JUQJDLTBOETPPO
    .ZXPSLTJO3BJMT

    View Slide

  10. 3BJMTDPNNVOJUZ
    JTPOFPGIPNF
    JONZIFBSU

    View Slide

  11. *PGUFOIBWFBDUJWJUJFT
    JO3VCP$PQSFDFOUMZ

    View Slide

  12. View Slide

  13. View Slide

  14. w'JYCVHT
    w$SFBUFOFXDPQT
    w*NQSPWFEPDVNFOUT
    w*NQSPWFJOUFSOBMBGGBJST
    w.BJOUFOBODF$*DPOEJUJPOT
    .ZXPSLTJO3VCP$PQ

    View Slide

  15. View Slide

  16. FTN

    View Slide

  17. w%JSFDUJPOPGB3BJMTBQQQSPKFDU
    w6QHSBEJOH3VCZ3BJMTGPSBQQT
    BOETVSSPVOEJOHHFNT
    w0SHBOJ[F3BJMT044QBUDI
    NFFUVQTJOFTN
    w3FDSVJUJOHJOUFSWJFXFS
    .ZXPSLTJOFTN

    View Slide

  18. "TUPSZBGUFSZFBST
    GSPNBNFNPSJBM
    QSFTFOUBUJPOJO
    5PEBZ`TUBML

    View Slide

  19. 8IBUIBQQFOFE
    JO

    View Slide

  20. IUUQKQSVCZJTUOFU3VCZ,BJHJ DQMVHJOQMVHJOBUUBDI@EPXOMPBEQ1SPHSBNpMF@OBNFUIF@JTMBOE@PG@SVCZ@KQEG
    3VCZ,BJHJ
    %BWF5IPNBT

    View Slide

  21. w7BSJPVTDPNQBOJFTVTJOH3VCZ
    3BJMTGPSEFWFMPQNFOUBQQFBSFE
    w(JU)VCIBTBQQFBSFE BOE
    JOEJWJEVBMBDUJWJUJFTBSFESBXJOH
    BUUFOUJPO
    w3VCZJTUTBOE3VCZJTIDPNQBOJFT
    NBLFWBSJPVT3VCZDPEJOHTUZMFT
    .PEFSOUJNFT

    View Slide

  22. 5IFSFBSFWBSJPVT
    3VCZDPEJOHTUZMFT
    %JWFSTJUZ

    View Slide

  23. View Slide

  24. "3VCZDPEF
    def badName
    if something
    test
    end
    end

    View Slide

  25. 3VOXJUIUIFEFGBVMU
    3VCP$PQTFUUJOH

    View Slide

  26. View Slide

  27. %FQBSU/BNF$PQ/BNF%FTDSJQUJPO

    View Slide

  28. 3VCP$PQIBTTFWFSBM
    EFQBSUNFOUT

    View Slide

  29. 0GpDJBMNBOVBM

    View Slide

  30. )FSF

    View Slide

  31. View Slide

  32. -BZPVU%FQBSUNFOU
    "MJHO"SSBZ
    .FUBQIFS
    "MJHO)BTI
    &MTF"MJHONFOU
    &NQUZ-JOFT
    &OE"MJHONFOU
    &YUSB4QBDJOH
    *OEFOU"SSBZ
    -JOU%FQBSUNFOU
    %VQMJDBUF.FUIPET
    %VQMJDBUFE,FZ
    &MTF"MJHONFOU
    4DSJQU1FSNJTTJPO
    6OJpFE*OUFHFS
    6OSFBDIBCMF$PEF
    6OMFTT"TTJHONFOU
    .FUSJDT%FQBSUNFOU
    "CD4J[F
    #MPDL-FOHUI
    #MPDL/FTUJOH
    $MBTT-FOHUI
    -JOF-FOHUI
    .FUIPE-FOHUI
    1BSBNFUFS-JTUT
    ʜ

    View Slide

  33. %FQBSU/BNF$PQ/BNF%FTDSJQUJPO

    View Slide

  34. 3VCP$PQIBTNBOZlCVJMUJODPQTz
    BOElDVTUPNDPQTzZPVDBOBEECZVTJOH
    QMVHHBCMFNFDIBOJTN

    View Slide

  35. /FXDPQ
    NBEFCZNF

    View Slide

  36. $SFBUJPODPQDPVOU
    QXE
    6TFSTLPJDTSDHJUIVCDPNSVCPDPQIRSVCPDPQ
    DBU$)"/(&-0(NEcHSFQLPJDcHSFQJBEEOFXcXDM

    View Slide

  37. $SFBUJPODPQDPVOU
    QXE
    6TFSTLPJDTSDHJUIVCDPNSVCPDPQIRSVCPDPQ
    DBU$)"/(&-0(NEcHSFQLPJDcHSFQJBEEOFXcXDM

    View Slide

  38. $SFBUJPODPQDPVOU
    QXE
    6TFSTLPJDTSDHJUIVCDPNSVCPDPQIRSVCPDPQ
    DBU$)"/(&-0(NEcHSFQLPJDcHSFQJBEEOFXcXDM

    DBU$)"/(&-0(NEcHSFQQPDLFcHSFQJBEEOFXcXDM

    View Slide

  39. $SFBUJPODPQDPVOU
    QXE
    6TFSTLPJDTSDHJUIVCDPNSVCPDPQIRSVCPDPQ
    DBU$)"/(&-0(NEcHSFQLPJDcHSFQJBEEOFXcXDM

    DBU$)"/(&-0(NEcHSFQQPDLFcHSFQJBEEOFXcXDM

    DBU$)"/(&-0(NEcHSFQESFONJcHSFQJBEEOFXcXDM

    View Slide

  40. $SFBUJPODPQDPVOU
    QXE
    6TFSTLPJDTSDHJUIVCDPNSVCPDPQIRSVCPDPQ
    DBU$)"/(&-0(NEcHSFQLPJDcHSFQJBEEOFXcXDM

    DBU$)"/(&-0(NEcHSFQQPDLFcHSFQJBEEOFXcXDM

    DBU$)"/(&-0(NEcHSFQESFONJcHSFQJBEEOFXcXDM

    DBU$)"/(&-0(NEcHSFQCCBUTPWcHSFQJBEEOFXcXDM

    View Slide

  41. View Slide

  42. -JTUPGDPQT*DSFBUFE

    DBU$)"/(&-0(NEcHSFQLPJDcHSFQJBEEOFX
    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA3BJMT3FGVUF.FUIPETADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA-JOU&SC/FX"SHVNFOUTADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA-JOU#JH%FDJNBM/FXADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQJTTVFT

    "EEOFXA-BZPVU&NQUZ$PNNFOUADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQJTTVFT

    "EEOFXA-JOU0SEFSFE.BHJD$PNNFOUTADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQJTTVFT

    "EEOFXA4UZMF&YQBOE1BUI"SHVNFOUTADPQ <>

    View Slide

  43. -JTUPGDPQT*DSFBUFE

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA(FNTQFD3FRVJSFE3VCZ7FSTJPOADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA(FNTQFD3FEVOEBOU"TTJHONFOUADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA3BJMT3FEVOEBOU3FDFJWFS*O8JUI0QUJPOTADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQJTTVFT

    "EEOFXA-JOU6OOFFEFE3FRVJSF4UBUFNFOUADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA4UZMF4UEFSS1VUTADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA-JOU3FEVOEBOU8JUI0CKFDUADPQ <>

    View Slide

  44. -JTUPGDPQT*DSFBUFE

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA4UZMF.JYJO6TBHFADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA-JOU6SJ&TDBQF6OFTDBQFADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA1FSGPSNBODF6SJ%FGBVMU1BSTFSADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA-JOU6SJ3FHFYQADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA#VOEMFS*OTFDVSF1SPUPDPM4PVSDFADPQ <>

    <> IUUQTHJUIVCDPNCCBUTPWSVCPDPQQVMM
    "EE
    OFXA-JOU3FEVOEBOU8JUI*OEFYADPQ <>

    View Slide

  45. -JTUPGDPQT*DSFBUFE

    "EEOFXA1FSGPSNBODF4PSU8JUI#MPDLADPQUPVTF
    ATPSU@CZ GPP
    AJOTUFBEPGATPSU\cB CcBGPPCGPP^A
    <>

    View Slide

  46. /VNCFSPG
    PQQPSUVOJUJFTUP
    NBLFDPQT
    ()SVCPDPQIRSVCPDPQ

    View Slide

  47. /VNCFSPG
    PQQPSUVOJUJFTUP
    NBLFDPQT
    ()SVCPDPQIRSVCPDPQ
    3VCZ


    View Slide

  48. /VNCFSPG
    PQQPSUVOJUJFTUP
    NBLFDPQT
    ()SVCPDPQIRSVCPDPQ
    3VCZ
    .ZQSPKFDUT



    View Slide

  49. /VNCFSPG
    PQQPSUVOJUJFTUP
    NBLFDPQT
    ()SVCPDPQIRSVCPDPQ
    3VCZ
    .ZQSPKFDUT
    ()SBJMTSBJMT




    View Slide

  50. -FUTUBMLBCPVUUIFCBDLHSPVOEPG
    NBLJOHUIFTFDPQTBOEUIF
    LOPXMFEHFHBJOFEJOUIBUQSPDFTT

    View Slide

  51. 'SJ

    Improve Ruby coding
    style rules and Lint
    ,PJDIJ*50FTN
    3VCZ,BJHJ
    4FOEBJ*OUFSOBUJPOBM$FOUFS)BHJ
    How do you join social coding?

    View Slide

  52. "HFOEB
    0OUIFEJGGFSFODF
    CFUXFFODPEJOHTUZMFBOE
    -JOU &NVMBUF3VCZ`TXBSOJOH

    /FXDPQTUBSUTXJUI

    ZPVSQSPKFDU
    $SPTTPWFS

    044DPNNVOJUJFT
    1BSU
    1BSU
    1BSU

    View Slide

  53. 1BSU

    View Slide

  54. 0OUIFEJGGFSFODF
    CFUXFFODPEJOH
    TUZMFBOE-JOU

    View Slide

  55. 4UZMF
    -JOU

    View Slide

  56. 4UZMF

    View Slide

  57. w4UZMFJTGSPN
    WBSJPVTDVMUVSFT
    w6OJpFEXJUIJOB
    QSPKFDUTQFDJpD
    UBTUF
    4UZMF

    View Slide

  58. 5IFSFT.PSF5IBO
    0OF8BZ5P

    %FpOFB4UZMF

    View Slide

  59. w.JOFSP"PLJTDPEJOHTUZMF +"

    wIUUQJMPWFSVCZOFUKBSVCZDPEJOHTUZMFIUNM
    w4IVHP.BFEBTDPEJOHTUZMF +"

    wIUUQTTIVHPOFUSVCZDPEFDPOW
    DPEFDPOWIUNM
    w3VCZ4UZMF(VJEF
    wIUUQTHJUIVCDPNSVCPDPQIRSVCZTUZMFHVJEF
    w"OEPUIFSTUZMFT
    w1FSTPOBMBOE$PNQBOZDPEJOHTUZMFT
    .BOZTUZMFTJOUIFSFBMXPSME

    View Slide

  60. 3VCZ4UZMF(VJEF

    View Slide

  61. w3VCP$PQJNQMFNFOUT
    3VCZ4UZMF(VJEFCZ
    EFGBVMU
    w3VCP$PQTPNFUJNFT
    QSPWJEFTPQUJPOT
    4UZMFPG3VCP$PQ

    View Slide

  62. &OGPSDFE4UZMFJTBOPQUJPOQBSBNFUFS
    IUUQSVCPDPQSFBEUIFEPDTJPFOMBUFTUDPQT@MBZPVUMBZPVUTQBDFJOTJEFCMPDLCSBDFT

    View Slide

  63. &OGPSDFE4UZMFJTBOPQUJPOQBSBNFUFS
    IUUQSVCPDPQSFBEUIFEPDTJPFOMBUFTUDPQT@MBZPVUMBZPVUTQBDFJOTJEFCMPDLCSBDFT
    HPPE
    TPNF@BSSBZFBDI\cFcQVUTF^

    View Slide

  64. &OGPSDFE4UZMFJTBOPQUJPOQBSBNFUFS
    IUUQSVCPDPQSFBEUIFEPDTJPFOMBUFTUDPQT@MBZPVUMBZPVUTQBDFJOTJEFCMPDLCSBDFT
    HPPE
    TPNF@BSSBZFBDI\cFcQVUTF^
    HPPE
    TPNF@BSSBZFBDI\cFcQVUTF^

    View Slide

  65. w*GZPVEPOPUMJLFUIFEFGBVMUTUZMF
    UIBUJT UIFTFUUJOHPGl3VCZ4UZMF
    (VJEFz
    ZPVDBOUBLFUIF
    GPMMPXJOHPQUJPOT
    w&EJUSVCPDPQZNMBOEVTF
    EJGGFSFOUPQUJPOT
    w&EJUSVCPDPQZNMBOEDIBOHFUIJT
    DPQ
    :PVDBODVTUPNJ[FUIFXBZ

    View Slide

  66. $VTUPNJ[FECZSVCPDPQZNM
    "MM$PQT
    5BSHFU3VCZ7FSTJPO
    -BZPVU4QBDF*OTJEF#MPDL4QBDFT
    &OGPSDFE4UZMFOP@TQBDF
    $IBOHF&OGPSDFE4UZMFGSPN
    TQBDF EFGBVMU
    UPOP@TQBDF

    View Slide

  67. w%PO`UCFBGSBJEPGDVTUPNJ[BUJPO
    w1MFBTFCFDPOpEFOUJOZPVS
    DVMUVSF
    w*GFJUIFSJTPLBZUIFEFGBVMUXJMM
    CFpOF
    w"TBQFSTPOBMPQJOJPO UIFSFJT
    OPVOJpFE$P$JO4UZMF
    %FGBVMUJTOPUUIFPOMZTFUUJOH

    View Slide

  68. w%FGBVMUDPOpHVSBUJPO
    CBTFEPO3VCZ4UZMF
    (VJEF
    w:PVNBZCFBCMFUP
    DIBOHF3VCP$PQ
    DPOpHVSBUJPO
    :PVDBODPOpHVSF3VCP$PQVTJOH
    SVCPDPQZNM

    View Slide

  69. w'PSFYBNQMF UBMLCZ,FJKV
    *TIJ[VLBTBOBUPFEPSC
    w5IFEJGGFSFODFCFUXFFO
    `do``end`BOE`{``}`
    w3FQSFTFOUTUBUFNFOUBOE
    FYQSFTTJPOSFTQFDUJWFMZ
    5IFSFNBZOPUCFPQUJPOTZPVMJLF

    View Slide

  70. w%PFTUIFDPQEFDJEFXIFUIFSZPV
    BSFVTJOHSFUVSOWBMVFPSNFUIPE
    DIBJO
    w%PFTUIFDPQBMTPXPSLXIFO
    NVMUJQMZJOHUIFXIJUFMJTUPGNFUIPE
    OBNFT
    w3VCZCMPDLrescueJTBWBJMBCMFGPS
    `do``end`POMZ
    *UMFBETUPQBSUPGEFTJHOPG

    BOVOJNQMFNFOUFEDPQ

    View Slide

  71. -JOU

    View Slide

  72. w5IJOHTUIBUIBWFQPUFOUJBM
    CVHT
    w%FQSFDBUJPOXBSOJOHEVFUP
    GVUVSFJOUFSGBDFDIBOHF
    w3VCP$PQEPFTOPUQSPWJEF
    NBOZPQUJPOTPG-JOU
    -JOU

    View Slide

  73. -JOU

    View Slide

  74. /FX-JOUDPQ
    GPS3VCZ
    &YBNQMFT

    View Slide

  75. *NQPSUXBSOJOHT
    GSPNSVCZSVCZUP
    3VCP$PQ
    ()SVCPDPQIRSVCPDPQ
    VQTUSFBN
    3VCZXBSOJOHT

    View Slide

  76. SVCPDPQIRSVCPDPQ
    "EEOFXA-JOU&SC/FX"SHVNFOUTADPQ

    View Slide

  77. View Slide

  78. "4UEMJCVQEBUF
    IUUQTHJUIVCDPNSVCZSVCZCMPCCFEDGGBGDGDB/&84TUEMJCVQEBUFTPVUTUBOEJOHPOFTPOMZ

    View Slide

  79. &3#OFXJO3VCZ
    % cat example.rb
    require ‘erb'
    ERB.new('hi', nil, '-', ‘@output_buffer')

    View Slide

  80. &3#OFXJO3VCZ
    % cat example.rb
    require ‘erb'
    ERB.new('hi', nil, '-', ‘@output_buffer')
    % ruby example.rb
    example.rb:3: warning: Passing safe_level with the
    2nd argument of ERB.new is deprecated. Do not use it,
    and specify other arguments as keyword arguments.
    example.rb:3: warning: Passing trim_mode with the 3rd
    argument of ERB.new is deprecated. Use keyword
    argument like ERB.new(str, trim_mode: ...) instead.
    example.rb:3: warning: Passing eoutvar with the 4th
    argument of ERB.new is deprecated. Use keyword
    argument like ERB.new(str, eoutvar: ...) instead.

    View Slide

  81. &3#OFXJO3VCZ
    # bad
    # ERB.new(str, nil, '-', '@output_buffer')
    # good
    # ERB.new(str, trim_mode: '-', eoutvar:'@output_buffer')

    View Slide

  82. 3VCZ$PNQBUJCMF
    # https://github.com/ruby/ruby/commit/3406c5d
    # Ruby 2.6+
    if ERB.instance_method(:initialize).parameters.assoc(:key)
    ERB.new(str, trim_mode: '-', eoutvar: '@output_buffer')
    else
    ERB.new(str, nil, '-', '@output_buffer')
    end

    View Slide

  83. NJOJNVN@UBSHFU@SVCZ@WFSTJPO

    View Slide

  84. &NVMBUJPOPG3VCP$PQ
    % rubocop example.rb --only Lint/ErbNewArguments
    Inspecting 1 file
    W
    Offenses:
    example.rb:3:15: W: Lint/ErbNewArguments: Passing safe_level with
    the 2nd argument of ERB.new is deprecated. Do not use it, and
    specify other arguments as keyword arguments.
    ERB.new('hi', nil, '-', '@output_buffer')
    ^^^
    example.rb:3:20: W: Lint/ErbNewArguments: Passing trim_mode with
    the 3rd argument of ERB.new is deprecated. Use keyword argument
    like ERB.new(str, trim_mode: '-') instead.
    ERB.new('hi', nil, '-', '@output_buffer')
    ^^^
    example.rb:3:25: W: Lint/ErbNewArguments: Passing eoutvar with the
    4th argument of ERB.new is deprecated. Use keyword argument like
    ERB.new(str, eoutvar: '@output_buffer') instead.
    ERB.new('hi', nil, '-', '@output_buffer')
    ^^^^^^^^^^^^^^^^

    View Slide

  85. %JEZPVIBWFBOZQSPCMFNT

    View Slide

  86. FSJLIVEBUIPS
    %FQSFDBUFTBGF@MFWFMPG&3#OFXJO3VCZ

    View Slide

  87. View Slide

  88. 5IFMPHMFOHUIIBTFYDFFEFEUIF
    MJNJUPG.#
    IUUQTHJUIVCDPNFSJLIVEBUIPSQVMMJTTVFDPNNFOU

    View Slide

  89. View Slide

  90. wruby -w (RUBYOPT='-w')PQUJPOUSBDFT
    XBSOJOHTJOEFQFOEFOUMJCSBSJFT
    w3VCP$PQ`THSBOVMBSJUZJTSFQPTJUPSZ
    ZPVDBOGPDVTPOZPVS3BJMT
    BQQMJDBUJPODPEFBOEXBSOJOHTPO
    MJCSBSJFTUIBUZPVBSFNBOBHJOH
    w:PVDBOTVQFSJNQPTFQSFFYFDVUJPO
    XBSOJOHBOESVOUJNFXBSOJOH
    ASVCZXAPQUJPOWT3VCP$PQ

    View Slide

  91. w.PTUMZ-JOUNBZCFFOBCMFE
    CFDBVTFJUJTOPUBQSFGFSFODF
    CVUBMBOHVBHFTQFDJpDBUJPO
    w*UJTCFUUFSOPUUPCFBGSBJEUP
    DIBOHFUIFTUZMFUIBUEPFT
    OPUpUUIFDVMUVSF5IFSFBSF
    WBSJPVTQSFGFSFODFT
    $PODMVTJPO

    View Slide

  92. "HFOEB
    0OUIFEJGGFSFODF
    CFUXFFODPEJOHTUZMFBOE
    -JOU &NVMBUF3VCZ`TXBSOJOH

    /FXDPQTUBSUTXJUI

    ZPVSQSPKFDU
    $SPTTPWFS

    044DPNNVOJUJFT
    1BSU
    1BSU
    1BSU

    View Slide

  93. 1BSU

    View Slide

  94. /FXDPQ
    TUBSUTXJUI
    ZPVSQSPKFDU

    View Slide

  95. 8FBSFDPOOFDUFECZ044
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    .ZQSPKFDU
    ZPVSQSPKFDU
    w"TUPSZXIFSFDPEFSFWJFXT
    JONZQSPKFDUBSFDPEF
    SFWJFXTJOZPVSQSPKFDU

    View Slide

  96. SVCPDPQIRSVCPDPQ
    "EEOFXA4UZMF.JYJO6TBHFADPQ

    View Slide

  97. View Slide

  98. "3BJMTBQQMJDBUJPO
    EFWFMPQNFOU

    View Slide

  99. 3FWJFXDPNNFOU
    *ODMVEJOHBUUIJTQPTJUJPOXJMMUBJOUUIFUPQMFWFM
    3JHIU*XJMMpYJU

    View Slide

  100. 8IBUZPVQPJOUFEPVU
    DBOCFQPJOUFEPVUBU
    PUIFSPQQPSUVOJUJFT

    View Slide

  101. 044
    3JEFPO044
    3JEFPO044

    View Slide

  102. "DPQ*NBEFIFMQFE
    FWFOJONZGSJFOET
    QSPKFDU

    View Slide

  103. !POLTBZT
    l
    4UZMF.JYJO6TBHFDPQ

    IBTXPSLFE 

    TP*TIPVMEHJWF!LPJD
    IUUQTUXJUUFSDPNPOLTUBUVT

    View Slide

  104. )PXUPNBLF4UZMF.JYJO6TFHFDPQ

    View Slide

  105. SBLFOFX@DPQ
    % be rake new_cop[Rails/TopLevelInclude]

    View Slide

  106. SBLFOFX@DPQ
    % be rake new_cop[Rails/TopLevelInclude]
    Files created:
    - lib/rubocop/cop/rails/top_level_include.rb
    - spec/rubocop/cop/rails/
    top_level_include_spec.rb
    File modified:
    - `require_relative 'rubocop/cop/rails/
    top_level_include'` added into lib/rubocop.rb
    Do 3 steps:
    1. Add an entry to the "New features" section in
    CHANGELOG.md,
    e.g. "Add new `TopLevel/Include` cop.
    ([@your_id][])"
    2. Add an entry into config/enabled.yml or
    config/disabled.yml
    3. Implement your new cop in the generated file!

    View Slide

  107. 8SJUFFYBNQMFT
    # TODO: when finished, run `rake
    generate_cops_documentation` to update the docs
    module RuboCop
    module Cop
    module Rails
    # TODO: Write cop description and example of
    bad / good code.
    #
    # @example
    # # bad
    # bad_method()
    #
    # # good
    # bad_method(args)
    8SJUFDPQEFTDSJQUJPOBOE
    FYBNQMFPGCBEHPPE

    View Slide

  108. 8SJUFTQFDT
    describe RuboCop::Cop::Rails::TopLevelInclude do
    it 'registers an offense when using `#bad_method`'
    do
    expect_offense(<<-RUBY.strip_indent)
    bad_method
    ^^^^^^^^^^ Use `#good_method` instead of
    `#bad_method`.
    RUBY
    end
    it 'does not register an offense when using
    `#good_method`' do
    expect_no_offenses(<<-RUBY.strip_indent)
    good_method
    RUBY
    end
    end
    8SJUFBCBEDBTFPOUIFAFYQFDU@P⒎FOTFA
    NFUIPE

    View Slide

  109. 8SJUFTQFDT
    describe RuboCop::Cop::Rails::TopLevelInclude do
    it 'registers an offense when using `#bad_method`'
    do
    expect_offense(<<-RUBY.strip_indent)
    bad_method
    ^^^^^^^^^^ Use `#good_method` instead of
    `#bad_method`.
    RUBY
    end
    it 'does not register an offense when using
    `#good_method`' do
    expect_no_offenses(<<-RUBY.strip_indent)
    good_method
    RUBY
    end
    end
    8SJUFBCBEDBTFPOUIFAFYQFDU@P⒎FOTFA
    NFUIPE
    8SJUFBHPPEDBTFPOUIFAFYQFDU@OP@P⒎FOTFTA
    NFUIPE

    View Slide

  110. w8JUIexpect_offense
    BOE
    expect_no_offenses
    UIFUFTUDBOCF
    XSJUUFOSPVHIMZ
    4USPOHUFTUJOH%4-

    View Slide

  111. 8SJUFTQFDT BHBJO

    describe RuboCop::Cop::Rails::TopLevelInclude do
    it 'registers an offense when using `#bad_method`' do
    expect_offense(<<-RUBY.strip_indent)
    bad_method
    ^^^^^^^^^^ Use `#good_method` instead of
    `#bad_method`.
    RUBY
    end
    it 'does not register an offense when using
    `#good_method`' do
    expect_no_offenses(<<-RUBY.strip_indent)
    good_method
    RUBY
    end
    end
    8SJUFBCBEDBTFPOUIFAFYQFDU@P⒎FOTFA
    NFUIPE
    8SJUFBHPPEDBTFPOUIFAFYQFDU@OP@P⒎FOTFTA
    NFUIPE

    View Slide

  112. 3FXSJUFTQFDT
    describe RuboCop::Cop::Rails::TopLevelInclude do
    it 'registers an offense when using outside class' do
    expect_offense(<<-RUBY.strip_indent)
    include
    ^^^^^^^ `include` is used at the top level. Use
    inside `class` or `module`.
    class C
    end
    RUBY
    end
    8SJUFBCBEDBTFPOUIFAFYQFDU@P⒎FOTFA
    NFUIPE

    View Slide

  113. 3FXSJUFTQFDT
    describe RuboCop::Cop::Rails::TopLevelInclude do
    it 'registers an offense when using outside class' do
    expect_offense(<<-RUBY.strip_indent)
    include
    ^^^^^^^^^ `include` is used at the top level. Use
    inside `class` or `module`.
    class C
    end
    RUBY
    end
    it 'does not register an offense when using inside
    class' do
    expect_no_offenses(<<-RUBY.strip_indent)
    class C
    include M
    end
    RUBY
    8SJUFBHPPEDBTFPOUIFAFYQFDU@OP@P⒎FOTFTA
    NFUIPE

    View Slide

  114. SVCZQBSTF
    % ruby-parse -e 'include M’
    (send nil :include
    (const nil :M))
    % ruby-parse -e 'extend M’
    (send nil :extend
    (const nil :M))
    % ruby-parse -e 'prepend M’
    (send nil :prepend
    (const nil :M))
    (FU4FYQSFTTJPOGSPNSVCZQBSTFDPNNBOE
    3VCP$PQJTEFQFOEFOUPO1BSTFSHFN

    View Slide

  115. "CTUSBDU4ZOUBY5SFF
    % ruby_ast_visualizer -e 'include M’
    (send nil :include
    (const nil :M))
    Wrote a.png
    IUUQTHJUIVCDPNLPJDSVCZ@BTU@WJTVBMJ[FS

    View Slide

  116. EFG@OPEF@NBUDIFS
    def_node_matcher :include_statement, <<-PATTERN
    (send nil? ${:include :extend :prepend}
    (const nil? _))
    PATTERN
    3FXSJUFBTOPEFQBUUFSOCBTFEPO4FYQSFTTJPO
    'VSUIFSSFBEJOH
    IUUQTHJUIVCDPNSVCPDPQIRSVCPDPQCMPCNBTUFSMJCSVCPDPQOPEF@QBUUFSOSC

    View Slide

  117. 3VCP$PQ/PEF1BUUFSO
    (send nil? :include (const nil? _))
    (send nil? :extend (const nil? _))
    (send nil? :prepend (const nil? _))
    (send nil? ${:include :extend :prepend}
    (const nil? _))
    6TFA\AA^A NBUDIFTJODMVEF FYUFOEPSQSFQFOE
    "OEAA BSCJUSBSZNBUDIJOHDBOCFQFSGPSNFEPOB
    DBQUVSF
    'VSUIFSSFBEJOH
    IUUQTHJUIVCDPNSVCPDPQIRSVCPDPQCMPCNBTUFSMJCSVCPDPQOPEF@QBUUFSOSC

    View Slide

  118. PO@YYYBEE@PGGFOTF
    MSG = '`%s` is used at the top level.' \
    'Use inside `class` or `module`.'.freeze
    def_node_matcher :include_statement, <<-PATTERN
    (send nil? ${:include :extend :prepend}
    (const nil? _))
    PATTERN
    def on_send(node)
    return unless (statement = include_statement(node))
    return unless top_level_node?(node)
    add_offense(
    node, message: format(MSG, statement: statement)
    )
    end 8SJUFFWFOUIBOEMFSAPO@OPEF@OBNFA
    PSAJOWFTUJHBUFA
    NFUIPE

    View Slide

  119. *NQMFNFOUBUJPO
    3FE (SFFO 3FGBDUPS
    5FTUDPEFJTNPSFPCWJPVTBOEFBTJFSUP
    VOEFSTUBOEUIBOUIFPQFSBUJPOPG"45

    View Slide

  120. 8SJUFDPOpHpMFT
    Rails/TopLevelInclude:
    Description: 'Checks that `include`, `extend` and
    `prepend` exists at the top level.'
    Enabled: true
    # In this PR, the following setting has been
    removed
    Rails/TopLevelInclude:
    Include:
    - app/**/*.rb
    "EEBOFOUSZJOUPDPOpHFOBCMFEZNM
    PSDPOpHEJTBCMFEZNM

    "EEBOFOUSZJOUPDPOpHEFGBVMUZNM
    *GEFGBVMUTFUUJOHJTSFRVJSFE

    View Slide

  121. SBLFHFOFSBUF@DPQT@EPDVNFOUBUJPO
    % # Write the CHANGELOG.md
    % be rake generate_cops_documentation
    % be rake
    # be rake parallel:spec
    Finished in 39.07 seconds (files took 5.91 seconds
    to load)
    17739 examples, 0 failures, 1 pending
    # be rake parallel:ascii_spec
    Finished in 37.04 seconds (files took 5.26 seconds
    to load)
    17739 examples, 0 failures, 1 pending
    # be rake internal_investigation
    1046 files inspected, no offenses detected
    8IFOpOJTIFE SVO`rake
    generate_cops_documentation`UPVQEBUFUIFEPDT

    View Slide

  122. 0QFOB13

    View Slide

  123. $POWFSTBUJPO

    View Slide

  124. $POWFSTBUJPO

    View Slide

  125. $POWFSTBUJPO

    View Slide

  126. $POWFSTBUJPO

    View Slide

  127. %JEZPVOPUJDFJU
    !QPDLF

    View Slide

  128. $POWFSTBUJPO

    View Slide

  129. SVCPDPQIRSVCPDPQ
    "EEOFXA4UZMF.JYJO6TBHFADPQ

    View Slide

  130. View Slide

  131. )FSF

    View Slide

  132. 3VCP$PQIBTOPQSFSFMFBTF

    View Slide

  133. View Slide

  134. Feedback

    View Slide

  135. w'BMTFQPTJUJWFʜ(PPE
    DPEF CVUPGGFOTF
    IBQQFOT
    w'BMTFOFHBUJWFʜ#BE
    DPEF CVUPGGFOTFEPFT
    OPUIBQQFO
    3FUSPTQFDUJWFUFSNT

    View Slide

  136. 3FUSPTQFDUJWFUFSNT
    QPTJUJWF OFHBUJWF

    USVF
 *UJTEFUFDUFEDPSSFDUMZ *UJTOPUEFUFDUFEDPSSFDUMZ

    GBMTF
 *UJTEFUFDUFEJODPSSFDUMZ *UJTOPUEFUFDUFEJODPSSFDUMZ

    View Slide

  137. GBMTFQPTJUJWF

    View Slide

  138. GBMTFQPTJUJWF

    View Slide

  139. GBMTFQPTJUJWF

    View Slide

  140. GBMTFQPTJUJWF

    View Slide

  141. GBMTFQPTJUJWF

    View Slide

  142. GBMTFQPTJUJWF

    View Slide

  143. *ODMVEFNBUDIFS

    View Slide

  144. 1SPQPTFlGBMTFOFHBUJWFz

    View Slide

  145. 1SPQPTFlGBMTFOFHBUJWFz

    View Slide

  146. 1SPQPTFlGBMTFOFHBUJWFz

    View Slide

  147. GBMTFQPTJUJWF
    ˣ
    GBMTFOFHBUJWF

    View Slide

  148. GBMTFQPTJUJWF

    View Slide

  149. FYQFDU@OP@PGGFOTFT

    View Slide

  150. FYQFDU@PGGFOTF

    View Slide

  151. 3FTPMWFEDPEF

    View Slide

  152. # In this PR, the following setting has been
    removed
    Rails/TopLevelInclude:
    Include:
    - app/**/*.rb
    $BVTFPGUIFQSPCMFN
    "EEBOFOUSZJOUPDPOpHEFGBVMUZNM
    *GEFGBVMUTFUUJOHJTSFRVJSFE

    *FYQBOEFEUIFTDPQFGSPN3BJMT
    UP4UZMFCVUUIFJNQMFNFOUBUJPO
    SFNBJOFEOBSSPX

    View Slide

  153. $VSSFOUMZUIFSFBSFOPGBMTFQPTJUJWFT

    View Slide

  154. w3FEVDFGBMTFQPTJUJWFTCZ
    SVOOJOHJO()SBJMTSBJMTSFQP
    w"OE3VOJOMPDBM3BJMTBQQ
    SFQP
    w*UNBZCFHPPEUPHPXJUI
    ()EJTDPVSTFEJTDPVSTF
    "DUJPOGSPN3FUSPTQFDUJWF

    View Slide

  155. "HFOEB
    0OUIFEJGGFSFODF
    CFUXFFODPEJOHTUZMFBOE
    -JOU &NVMBUF3VCZ`TXBSOJOH

    /FXDPQTUBSUTXJUI

    ZPVSQSPKFDU
    $SPTTPWFS

    044DPNNVOJUJFT
    1BSU
    1BSU
    1BSU

    View Slide

  156. 1BSU

    View Slide

  157. $SPTTPWFS
    044
    DPNNVOJUJFT

    View Slide

  158. "TUPSZBCPVU
    JNQPSUDVTUPNDPQ
    GSPN3BJMTUP3VCP$PQ
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    ()SBJMTSBJMT

    View Slide

  159. SBJMTSBJMT

    View Slide

  160. SVCPDPQZNMBUSBJMTSBJMT

    View Slide

  161. SVCPDPQZNMBUSBJMTSBJMT
    %JTBCMFE#Z%FGBVMUUSVF

    View Slide

  162. SBJMTSBJMT
    "EEDVTUPN3VCP$PQGPSABTTFSU@OPUAPWFSASFGVUFA

    View Slide

  163. View Slide

  164. View Slide

  165. 3BJMTDPNNJUUFST
    TVHHFTUFEUPNF
    !ZZBHJ !LBNJQP

    View Slide

  166. #FOFpUTPG3BJMT
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    ()SBJMTSBJMT
    w3FEVDFEFQFOEFODZPO3BJMT
    w5IJTDVTUPNDPQNBZCF
    VTFEFOEVTFST

    View Slide

  167. #FOFpUTPGFOEVTFST
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    :PVSQSPKFDU
    ()SBJMTSBJMT
    w3FEVDFEFQFOEFODZPO3BJMT
    w5IJTDVTUPNDPQNBZCF
    VTFEBMTPCZFOEVTFST

    View Slide

  168. w(FNJGZUPOFX
    3VCP$PQ.5HFN
    wABTTFSU@OPUANFUIPEJT
    B"45FTU$BTFNFUIPE
    *UJTO`UB.5NFUIPE
    8IFSFUPFYQPSU
    SEQBSUZHFNT

    View Slide

  169. w(FNJGZUPOFX
    3VCP$PQ.5HFN
    wABTTFSU@OPUANFUIPEJT
    B"45FTU$BTFNFUIPE
    *UJTO`UB.5NFUIPE
    8IFSFUPFYQPSU

    View Slide

  170. "45FTU$BTF.55FTU
    IUUQTHJUIVCDPNSBJMTSBJMTCMPCWBDUJWFTVQQPSUMJCBDUJWF@TVQQPSUUFTU@DBTFSC--

    View Slide

  171. w4P &YQPSUUIJTDPQ
    UP3BJMTEFQBSUNFOU
    JO3VCP$PQ
    8IFSFUPFYQPSU

    View Slide

  172. SVCPDPQIRSVCPDPQ
    "EEOFXA3BJMT3FGVUF.FUIPETADPQ

    View Slide

  173. View Slide

  174. View Slide

  175. SVCPDPQIRSVCPDPQ
    SBJMTSBJMT

    View Slide

  176. TVQFS
    3VCP$PQ$PQ
    $VTUPN$PQT
    3FGVUF/PU
    PSJHJOBM
    DPQDMBTT
    1MVHHBCMFBSDIJUFDUVSF

    View Slide

  177. TVQFS
    3VCP$PQ$PQ
    $VTUPN$PQT
    3FGVUF/PU
    3BJMT3FGVUF.FUIPET
    .PTUMZUIFJNQMFNFOUBUJPOXBTJOUBDU
    PSJHJOBM
    DPQDMBTT
    JNQPSUFE
    DPQDMBTT
    1MVHHBCMFBSDIJUFDUVSF

    View Slide

  178. w3BJMTDPNNVOJUZ
    DPOUSJCVUPSDPNFUP
    3VCP$PQDPNNVOJUZ
    "OJOUFSFTUJOHQIFOPNFOPO

    View Slide

  179. $PNNFOUFECZ"3BJMTDPOUSJCVUPS

    View Slide

  180. *NQPSUFEBOPUIFSDPQGSPN3BJMT

    View Slide

  181. 3VCP$PQ
    JT

    SFMFBTFE
    3VCP$PQ
    JT

    FOBCMFEXJUI$PEF$MJNBUF
    *OUIFGVUVSFXPSME
    *GUIFGPMMPXJOHDPOEJUJPOT
    BSFNFU 3BJMTDBOMFBWF
    UIFTFDPQTUP3VCP$PQ

    View Slide

  182. #FUUFS
    MFBWFJUUP
    FYQFSUT

    View Slide

  183. #FOFpUTPGFOEVTFSTBOE
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    :PVSQSPKFDU
    (SFBUSFQPT
    ZPVLOPX
    w3FEVDFEFQFOEFODZPOFYQPSUFESFQP
    w5IJTDVTUPNDPQNBZCFVTFEFOE
    VTFST
    w$PNNVOJUZQFPQMFBSFDPOOFDUFE

    View Slide

  184. "HFOEB
    0OUIFEJGGFSFODF
    CFUXFFODPEJOHTUZMFBOE
    -JOU &NVMBUF3VCZ`TXBSOJOH

    /FXDPQTUBSUTXJUI

    ZPVSQSPKFDU
    $SPTTPWFS

    044DPNNVOJUJFT
    1BSU
    1BSU
    1BSU

    View Slide

  185. Playback

    View Slide

  186. 5PEBZ`TTUPSZXBT
    BHSFBUQSFTFOUBUJPO
    BGUFSZFBSTGSPN
    IUUQKQSVCZJTUOFU3VCZ,BJHJ-PH4IUNM

    View Slide

  187. w7BSJPVTDPNQBOJFTVTJOH3VCZ
    3BJMTGPSEFWFMPQNFOUBQQFBSFE
    w(JU)VCIBTBQQFBSFE BOE
    JOEJWJEVBMBDUJWJUJFTBSFESBXJOH
    BUUFOUJPO
    w3VCZJTUTBOE3VCZJTIDPNQBOJFT
    NBLFTWBSJPVT3VCZDPEJOHTUZMFT
    .PEFSOUJNFT

    View Slide

  188. .PEFSOUJNFT
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    3VCZ
    :PVSQSPKFDU
    ()SBJMTSBJMT
    w3VCZVTFEJOWBSJPVTQMBDFT
    w7BSJPVTJNQPSUTPVSDFT

    View Slide

  189. .PEFSOUJNFT
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    3VCZ
    :PVSQSPKFDU
    ()SBJMTSBJMT
    w5IFSFJTBQPTTJCJMJUZUIBU$PQ
    UIBUJTVTFGVMUPPUIFSTDBOCF
    VTFGVMGPSPUIFST

    View Slide

  190. .PEFSOUJNFT
    VQTUSFBN
    ()SVCPDPQIRSVCPDPQ
    3VCZ
    :PVSQSPKFDU
    ()SBJMTSBJMT
    w%JWFSTJUZZPVDBODIBOHFBOE
    DVTUPNJ[FJUGPSZPVSQSPKFDU
    EFGBVMU
    PS
    DVTUPN

    View Slide

  191. w'JSTUPGBMM ZPVDBOVTFJUBT
    EFGBVMUPSDVTUPNJ[FJU
    w:PVDBOPQFOB13UPVQTUSFBN
    BOZUJNF
    w5IFSFBSFWBSJPVTTUBSUJOHNFUIPET
    w6TFUIFPQQPSUVOJUZUPMJTUFOUP
    QFPQMFZPVLOPX
    %FGBVMUTUZMFJTO`UUIFPOMZTFUUJOH

    View Slide

  192. IUUQBHJMFNBOJGFTUPPSH

    View Slide

  193. IUUQBHJMFNBOJGFTUPPSH

    View Slide

  194. 4P :PVBMSFBEZ
    IBWF
    PQQPSUVOJUJFT

    View Slide

  195. View Slide

  196. One more thing…

    View Slide

  197. 3BJMT0441BUDINFFUVQ

    View Slide

  198. 4PDJBMDPEJOHTUBSUTXJUIZPV
    :PV

    View Slide

  199. !LPJD
    5IBOLT .*/"48"/

    View Slide

  200. l
    "QSPCMFNJTpYFE
    OPUCFDBVTFUIFSFBSF
    QFPQMFJOUSPVCMF
    CVUCFDBVTFUIFSFBSF
    QFPQMFXIPXBOUUPpYJU
    ࠔ͍ͬͯΔਓ͕͍Δ໰୊͕௚ΔͷͰ͸ͳ͘ɺ
    ௚͢ؾͷ͋Δਓ͕͍Δ໰୊͕௚ΔCZ!LBNJQP

    View Slide