Pro Yearly is on sale from $80 to $50! »

Xcodeでなるべく早くtypoに気付きたい #love_swift/notice typo asap earlier on xcode

249b3122eee454c0a818bfe7851418e4?s=47 fromkk
December 03, 2019

Xcodeでなるべく早くtypoに気付きたい #love_swift/notice typo asap earlier on xcode

# typoについて
typographical errorの略で、コンピューターにおけるキーボードのタイプミスを指します。

# Timersにおける活動
これまで弊社ではPull Request作成時にBitrise上でDangerを実行し、その中でcspellというツールを呼んでいました。
課題もあって、Pull Requestの作成後だと気づくのが遅いなと思いました。
できればtypoはコーディング中に気付きたいです。

# Xcodeでwarningを表示する方法
Run Script中に決まった形式で出力すれば良いと言う事がわかりました。
typoの場所さえわかればwarningを表示出来る事が分かりました。

# スペルチェックの方法
Xcode上で動作すれば良いのでAppKitが利用出来ます。
NSSpellCheckerというクラスを発見しました。
warningを無視したい場合は無視単語リストを設定できたり、スペルチェックをした言語の設定が出来たり、スペルをチェックして誤りの箇所の位置の範囲が取得出来たり、スペルの修正の提案が可能です。

# 作成したツールについて
出来そうということがわかったのでSpellChecker( https://github.com/fromkk/SpellChecker )というツールを作成しました。
使い方としてはSpellCheckerにハイフンを2つつなげた後でチェックしたいファイルの一覧をスペース区切りで渡します。
ymlファイルのパスを渡す事でwarningの無視をしたい単語を登録することも出来ます。

# 謝辞
NSSpellCheckerの使い方を調べている中でezuraさんの同様のツールがあることを発見しました。用途が完全に被っていたので開発を続けるかとても悩んだのですが、ezuraさんの方はSwiftファイル専用に見えたのでそのまま開発を継続することを決意しました。もし、利用したいなと思った方は、気に入った方を利用して頂ければと思います。
NSSpellCheckerの使い方はとても参考にさせて頂きました。

249b3122eee454c0a818bfe7851418e4?s=128

fromkk

December 03, 2019
Tweet

Transcript

  1. !GSPNLL5JNFST*OD ⚠9DPEFͰͳΔ΂͘ૣ͘UZQPʹؾ෇͖͍ͨ

  2. 1SPpMF struct Profile { let name = "Kazuya Ueoka" let

    twitter = "@fromkk" let github = "fromkk" let qiita = "fromkk" let company = "Timers Inc." } •
  3. UZQPͱ͸ʁ w UZQPHSBQIJDBMFSSPSͷུɻͱΓΘ͚ɺλΠϙͱ͍͏໊ࢺͰɺί ϯϐϡʔλʹ͓͚ΔΩʔϘʔυͷλΠϓϛεΛࢦ͠ɺҰ෦ͷӳ ࿨ࣙయʹ΋UZQPͷهࡌ͕͋Δɻ 3 Ҿ༻IUUQTKBXJLJQFEJBPSHXJLJλΠϙ

  4. ಥવͰ͕͢

  5. UZQP͸޷͖Ͱ͔͢ʁ

  6. None
  7. ͜Ε·Ͱͷ5JNFSTʹ͓͚Δ׆ಈ w 1VMM3FRVFTU࡞੒࣌ʹ$* #JUSJTF ্Ͱ%BOHFSΛ࣮ߦ͍ͯͨ͠ w DTQFMMͱ͍͏πʔϧΛར༻ 7

  8. 8 # cspell # npm install -g cspell added_and_modified_files =

    git.added_files + git.modified_files added_and_modified_files.each do |file_path| next unless file_path =~ /.swift$/ stdout, status = Open3.capture2("npx", "cspell", file_path, "-c", "cspell.json") next if status.success? stdout.split("\n").each do |line| next unless matches = /\w.swift:(\d+).*-\sUnknown\sword\s\((\w+)\)/.match(line) line_number = matches[1].to_i word = matches[2] warning = "typo? #{word}" warn(warning, file: file_path, line: line_number) end end ࢀߟIUUQTTQFBLFSEFDLDPNZILBQMBOBVUPNBUFBMMUIFUIJOHT TMJEF
  9. 9

  10. 1VMM3FRVFTU࡞੒ޙͰ͸஗͍ ՝୊

  11. 1VMM3FRVFTU࡞੒ޙͰ͸஗͍ ՝୊ ˣ ίʔσΟϯάதʹؾ͖͍ͮͨ

  12. 9DPEFͰXBSOJOHΛදࣔ͢Δํ๏ 12

  13. 9DPEFͰXBSOJOHΛදࣔ͢Δํ๏ w 3VO4DSJQUதʹඪ४ग़ྗʹwarning: $message Λग़ྗ͢Δ 13

  14. ϑΝΠϧΛࢦఆͯ͠XBSOJOH w /path/to/file: warning: $messageʹมߋ 14

  15. ߦ਺Λࢦఆͯ͠XBSOJOH w /path/to/file:$line: warning: $messageʹมߋ 15

  16. ֘౰ͷจࣈΛࢦఆͯ͠XBSOJOH w /path/to/file:$line:$column: warning: $messageʹม ߋ 16

  17. UZQPͷ৔ॴ͕෼͔Ε͹XBSOJOHग़ͤΔʂ

  18. 18 εϖϧͷνΣοΫํ๏

  19. 19 εϖϧͷνΣοΫํ๏

  20. XBSOJOHΛແࢹ͍ͨ͠΋ͷϦετ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSTFUJHOPSFEXPSET

  21. ݴޠͷઃఆ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSTFUMBOHVBHF

  22. εϖϧͷνΣοΫ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSDIFDLTQFMMJOH

  23. εϖϧͷमਖ਼ͷఏҊ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSDPSSFDUJPO

  24. ग़དྷͦ͏

  25. IUUQTHJUIVCDPNGSPNLL4QFMM$IFDLFS

  26. IUUQTHJUIVCDPNGSPNLL4QFMM$IFDLFS 4UBS͕ԡͯ͠ཉͦ͠͏ʹͪ͜ΒΛݟ͍ͯΔ

  27. Πϯετʔϧ 27 git clone git@github.com:fromkk/SpellChecker.git cd ./SpellChecker make install

  28. ࢖͍ํ /usr/local/bin/SpellChecker -- /path/to/FileA.swift /path/to/FileB.swift -yml WhiteList.yml Λࢦఆ͢ΔࣄͰwarningΛແࢹग़དྷΔ whiteList: -

    kazuya - ueoka - fromkk
  29. 9DPEFʹ3VO4DSJQUΛ௥Ճ if ! [ -f /usr/local/bin/SpellChecker ]; then echo "SpellChecker

    not installed" exit 0 fi git_path=/usr/local/bin/git files=$($git_path diff --diff-filter=d --name-only -- "*.swift" "*.h" "*.m") if (test -z $files) || (test ${#files[@]} -eq 0); then echo "no files changed." exit 0 fi options="" for file in $files do options="$options $SRCROOT/$file" done /usr/local/bin/SpellChecker -yml $SRCROOT/spell-checker.yml -- $options
  30. %&.0

  31. ·ͱΊ w ͜Ε·Ͱ͸1VMM3FRVFTU࡞੒࣌ʹ%BOHFS্ͰDTQFMMΛୟ͘ࣄͰUZQPΛνΣο Ϋ͍ͯͨ͠☑ w 1VMM3FRVFTU࡞੒ޙʹϏϧυ͕૸͔ͬͯΒ%BOHFSͷ࣮ߦͩͱ஗͍ͷͰ9DPEF ͰίʔσΟϯάதʹؾ͖͔ͮͨͬͨ w $-*πʔϧΛ࡞੒ͯ͠3VO4DSJQU಺ͰXBSOJOHΛදࣔͤ͞Δ༷ʹ͢Δ͜ͱͰͳ Δ΂͘ૣ͘ؾ͚ͮΔ༷ʹͨ͠⚡

    w ߋʹࡉ͔͍͜ͱ͸ࠓ೔ͷJ04"EWFOU$BMFOEBSʹॻ͘ͷͰͦͪΒ΋ݟ ͯͶ 31
  32. ँࣙ w /44QFMM$IFDLFSͷ࢖͍ํΛௐ΂͍ͯΔதͰF[VSBTQFMM DIFDLFSGPSTXJGUΛൃݟ w ༻్͕ඃ͍ͬͯͨͷͰ։ൃΛଓ͚Δ͔೰Μ͕ͩ4XJGUϑΝΠϧઐ ༻ʹݟ͑ͨͷͰͦͷ··ܧଓ w ࢖͏৔߹͸ؾʹೖͬͨํΛར༻ͯ͠௖͚Ε͹ w

    /44QFMM$IFDLFSͷ࢖͍ํ͸ͱͯ΋ࢀߟͤͯ͞௖͖·ͨ͠ɻ͋Γ͕ ͱ͏͍͟͝·ͨ͠ 32
  33. 13

  34. • αʔόʔαΠυΤϯδχΞ (PHP, Golang, AWS) • AndroidΤϯδχΞ (Kotlin) • iOSΤϯδχΞ

    (Swift) TimersͰ͸ݱࡏΤϯδχΞશ৬छ࠾༻தʂ ৄ͘͠͸”Timers”Ͱݕࡧ
  35. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠