Timers Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

Xcodeでタイポ(typo)を検知するツールを作った #love_swift #typo #SpellChecker #登壇

最近寒いですが、うちの猫はこたつではなく僕の作業用の椅子やホットカーペットで丸くなってて家での肩身が狭いかっくん(@fromkk)です。
2019年12月3日に開催された集まれもうやんカレーとSwift好き!Swift愛好会 vol47@GMOペパボにて登壇してきたので簡単に登壇内容を紹介します。

スライド

概要

元々Bitrise上でDangerを実行し、cspellというツールを実行していました。
しかし、Dangerの実行がGitHub上にPull Requestを作成して、ユニットテストが実施された後だったので気付くまでのタイムラグが大きい事が気になっていました。
Xcode上で警告を表示する方法がわかったのでスペルチェックの方法を模索し、CLIツールとして公開しました。

SpellChecker

インストール方法は、

git clone git@github.com:fromkk/SpellChecker.git
cd ./SpellChecker
make install

/usr/local/bin/SpellChecker に配置されます。
使い方は、

/usr/local/bin/SpellChecker -- /path/to/FileA.swift /path/to/FileB.swift

の様な形で利用することができます。
実際に叩いてみると

SpellChecker -- Typo/ViewController.swift 
/Typo/Typo/ViewController.swift:5:16: warning: Is `kazuya` typo? (SpellChecker)
/Typo/Typo/ViewController.swift:5:23: warning: Is `ueoka` typo? (SpellChecker)
/Typo/Typo/ViewController.swift:6:22: warning: Is `kazuya` typo? (SpellChecker)
/Typo/Typo/ViewController.swift:6:29: warning: Is `ueoka` typo? (SpellChecker)
/Typo/Typo/ViewController.swift:15:9: warning: Maybe `heello` is typo of `hello`. (SpellChecker)
/Typo/Typo/ViewController.swift:18:10: warning: Maybe `heello` is typo of `hello`. (SpellChecker)
/Typo/Typo/ViewController.swift:19:16: warning: Maybe `woorld` is typo of `world`. (SpellChecker)

この様に出力されます。
無視したい単語がある場合はYAMLファイルを作成して -yml オプションで指定すると無視してくれます。

例) /usr/local/bin/SpellChecker -yml /path/to/spell-checker.yml -- /path/to/FileA.swift /path/to/FileB.swift

YAMLファイルは

whiteList:
  - ueoka
  - kazuya
  - fromkk

のフォーマットのみ受け付けています。
XcodeのRun Scriptに

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

などと書いておくとXcodeでビルドすぐ毎にGitで差分のあるファイルをチェックする事が出来ます。
実際にXcode上で利用してみると以下の様に警告が表示されます。

f:id:fromkk:20191203213348p:plain

まとめ

普段開発していく中で、Dangerのcspellも便利に活用はしていましたし、今後も活用を続けるとは思います。
しかし、問題にはなるべく早く気付きたいのでCLIツールを作成してXcodeでビルドしたら警告が表示されるアプローチを取りました。
ツールもまだ出来たばかりですし、実際に運用もこれからなので、何か不具合があればissueを起票したり、Pull Requestを送って頂ければと思います。

積極採用中!!

子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中!
急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP: http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる