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

Steepで使えるコマンドを見てみよう

ikuma-t
February 03, 2022

 Steepで使えるコマンドを見てみよう

omotesando.rb#71の登壇資料です

ikuma-t

February 03, 2022
Tweet

More Decks by ikuma-t

Other Decks in Programming

Transcript

  1. Steep
    で使えるコマンドを見てみよう!
    Omotesando.rb#71 @ikuma-t

    View full-size slide

  2. Self Introduction
    🗣 名前
    - ikuma-t
    🐤 Twitter - @ikumatdkr
    😸 GitHub - IkumaTadokoro
    ✍️
    Blog -
    セットプチフォッカ
    FJORD BOOT CAMP
    ってところでエンジニア目指して勉強しています
    最近はじめてのGem
    をつくりました:jp_local_gov
    趣味は作曲家めぐり・ツール漁り・アニメ鑑賞・ドット絵
    自己紹介

    View full-size slide

  3. みなさん、RBS
    書いてますか?
    自分はあんまり書いていない

    View full-size slide

  4. RBS
    といえばSteep

    View full-size slide

  5. 型書いて、steep check
    して終わり

    View full-size slide

  6. Steep
    には steep check
    以外にも
    使用できるコマンドがある

    View full-size slide

  7. Steep
    には steep check
    以外にも使用できるコマンドがある
    コマンド 概要
    init Steepfile
    を作成する
    check
    静的チェックを実行する
    validate
    型定義自体の文法チェックを実行する
    project Steepfile
    に基づいて対象プロジェクトの構造を表示する
    stats
    お型付け具合をチェックする
    watch
    リアルタイムで変更をキャッチして、静的チェックを実行できる
    langserver LSP
    を起動する
    annotations
    インラインアノテーションの一覧を表示する

    View full-size slide

  8. Steep
    で使えるコマンドを見てみよう!
    検証はSteep 0.47.0
    で行っています

    View full-size slide

  9. steep project
    Steepfile
    で定義されているプロジェクトを出力する

    1 $ steep project
    2
    3 Target:
    4 lib:
    5 sources:
    6 patterns:
    7 - lib
    8 ignores:
    9 files:
    10 - lib/jp_local_gov/base.rb
    11 ...
    12 signatures:
    13 patterns:
    14 - sig
    15 files:
    16 - sig/jp_local_gov/base.rbs
    17 ...
    18 libraries:
    19 library dirs:
    20 - core: ...

    View full-size slide

  10. steep validate
    型定義の文法的誤りをチェックできる
    ソース
    1 def hoge?(word)
    2 word.size == 1
    3 end
    RBS
    def hoge?: (String word) >- bool
    実行結果
    1 $ steep validate
    2 sig/jp_local_gov.rbs:28:27: [error] sig/jp_local_gov.rbs:28:27...28:28: Syntax error:
    3 │ Diagnostic ID: RBS::SyntaxError
    4 │
    5 └ def hoge?: (String word) >- bool
    6 ~

    View full-size slide

  11. steep stats
    型付けの統計情報を確認することができる
    1 $ steep stats
    --format={csv | table}
    で出力形式を切り替えることができる(デフォルトはSTDOUT.tty?
    に則る)
    小規模なGem
    ですら100%
    にすることはできなかったのだ…
    Refs: https://github.com/soutaro/steep/pull/360
    2
    3 # Calculating stats:
    4
    5 Target File Status Typed calls Untyped calls All calls Typed %
    6 --------------------------------------------------------------------------------------------------
    7 lib lib/jp_local_gov.rb success 69 5 74 93%
    8 lib lib/jp_local_gov/base.rb success 4 0 4 100%
    9 lib lib/jp_local_gov/local_gov.rb success 8 0 8 100%
    10 lib lib/jp_local_gov/random.rb success 16 4 20 80%
    11 lib lib/jp_local_gov/version.rb success 0 0 0 100%
    ` `

    View full-size slide

  12. 折り返し:steep check
    はTea
    が出る
    steep check
    を実行した際にエラーがなければ、Tea
    「🫖」が出る
    5 No type error detected.
    🫖
    実は出てくるのは「🫖」だけではなくて、ほかの絵文字(全4
    種)が出ることもある。

    残りの絵文字はだいたい10%
    くらいの確率で出るので試してみては?
    1 # Type checking files:
    2
    3 ......................................................................
    4

    View full-size slide

  13. steep annotations
    インラインアノテーションの使用箇所を一覧することができる
    RBS
    1 # @type var hoge: String
    2 hoge = "hoge"
    steep annotations
    の実行
    1 $ steep annotations
    2 lib/jp_local_gov/random.rb:18:4:def: def sample_data
    3 @type var hoge: String
    Refs: https://github.com/soutaro/steep/blob/master/manual/annotations.md
    ` `

    View full-size slide

  14. steep watch
    webpack
    のwatch
    モードみたいなもの(公式談)
    ソースの変更時に静的チェックをリアルタイムで実行してくれる
    RBS
    側はコマンドを実行した時点での情報を参照している模様
    Refs: https://github.com/soutaro/steep/pull/77
    1 #
    監視対象のディレクトリを指定して起動
    2 steep watch lib
    3
    👀 Watching directories, Ctrl-C to stop. #
    監視状態になる
    4
    🔬 Type checking updated files... #
    ソース側が変更されると、自動でチェックが行われる
    5 lib/jp_local_gov.rb:81:6: [error] Cannot allow method body have type `::Integer` because declared as type `::Array
    6 │ ::Integer <: ::Array[::String]
    7 │ ::Numeric <: ::Array[::String]
    8 │ ::Object <: ::Array[::String]
    9 │ ::BasicObject <: ::Array[::String]
    10 │
    11 │ Diagnostic ID: Ruby::MethodBodyTypeMismatch
    12 │
    13 └ def prefecture_code_list
    14 ~~~~~~~~~~~~~~~~~~~~
    15
    🔬 Type checking updated files...

    View full-size slide

  15. steep langserver
    LSP…
    なんですが、ごめんなさい、RubyMine
    で実証できませんでした🙏
    Refs: https://github.com/soutaro/steep/pull/79
    一応ここのPR
    のコメントでRubyMine
    での実行方法も書いてあるけどうまくいかない…

    View full-size slide

  16. まとめ
    Steep
    にはあんまり知られていないけど、いろんなコマンドがある!
    Steep
    をどんどん使って、Ruby
    での型定義を活発にしていこう!(私はAST
    を頑
    張って勉強します…

    View full-size slide