Tbpgr Blog

Organization Development Engineer tbpgr(てぃーびー) のブログ

DashのSnippetをTOMLファイルで管理してrakeのコマンドで一括更新できるツールを作った

f:id:tbpg:20151207233201j:plain

あらすじ

DashのSnippetですが、Dash Guideやネットにある情報を見る限り
DashのGUIから登録する方法しか提供されていないようです。
DashはSnippetのデータをSQLiteで管理しています。
そこで、このデータ構造を把握し中身を直接操作することで
Snippetの情報を管理できることまで確認できました。

DashでGUIを利用せずSnippetを管理する

とはいえ、毎回SQLを発行してSnippetを管理するのは面倒すぎます。
そこで簡単にSnippetを管理できるツールを作ることにしました。

前提

構成

要件

  • TOML の設定ファイルからSnippetデータを読み取って登録する
    • 管理しやすいように1Snippet1ファイル
  • Validationはさぼりました。Syntaxの言語名とか。プルリクもらえば反映します。
  • delete insert してます。不安な方は実行前に library.dash をバックアップしておけば復旧できます。

セットアップ

ダウンロード

$ git clone https://github.com/tbpgr/dash_snippets_builder.git
  • 以下のようなフォルダ構成になってます
$ cd %git%/dash_snippets_builder
$ tree
.
├── Gemfile
├── Gemfile.lock
├── LICENSE.txt
├── README.md
├── Rakefile
├── img
│   └── after_build.png
└── snippets : you save snippets here
    ├── java
    │   ├── java1.toml
    │   └── java2.toml
    └── ruby
        └── ruby1.toml
  • gemをインストールします
$ bundle install
  • rakeタスクを確認します
$ rake -T
rake dash:build  # build snippets

デモ

注意 このスクリプトはDELETE-INERTでデータを登録します。
既存のスニペットをお持ちの方はSnippetのデータ本体である library.dash を別名保存して退避しておいてください。

実行前

f:id:tbpg:20151216001023p:plain

.env Setting(Sample)

環境変数の管理用に %git%/dash_snippets_builder の直下に .env を作成し、変数を設定します。

$ touch .env

DASH_SNIPPET_PATHlibrary.dash のパスを。 LOG_LEVEL にログレベルを設定します。

DASH_SNIPPET_PATH=/Users/your user name/Library/Application Support/Dash/library.dash
LOG_LEVEL=DEBUG

TOML Setting(Samples)

リポジトリに登録してあるサンプルをそのまま登録してみます。

$ tree
└── snippets : you save snippets here
    ├── java
    │   ├── java1.toml
    │   └── java2.toml
    └── ruby
        └── ruby1.toml

サンプルの中身はこんな感じになってます。
TOMLなので本当は複数行テキストを使えるはずなんですが、
うまく動作しなかったので1行で書いてます。

  • snippets/java/java1.toml
[snippet]
title = "javatitle;;"
body = "line1\nline1\nline2\n"
syntax = "Java"
tag = "Java"
  • snippets/java/java2.toml
[snippet]
title = "javatitle2;;"
body = "line1\nline1\nline2\n"
syntax = "Java"
tag = "Java"
  • snippets/ruby/ruby1.toml
[snippet]
title = "title;;"
body = "line1\nline1\nline2\n"
syntax = "Ruby"
tag = "Ruby"

Build

$ rake dash:build
2015/12/15 22:35:40 - DEBUG - start build snippets
2015/12/15 22:35:40 - DEBUG -  start delete snippets
2015/12/15 22:35:40 - DEBUG -    success delete snippets
2015/12/15 22:35:40 - DEBUG -    success delete tagsIndex
2015/12/15 22:35:40 - DEBUG -    success delete tags
2015/12/15 22:35:40 - DEBUG -  finish delete snippets
2015/12/15 22:35:40 - DEBUG -  create javatitle;;
2015/12/15 22:35:40 - DEBUG -    insert tagsIndex for title:javatitle;; tag: Java
2015/12/15 22:35:40 - DEBUG -    create tag Java
2015/12/15 22:35:40 - DEBUG -    create snippet javatitle;;
2015/12/15 22:35:40 - DEBUG -  create javatitle2;;
2015/12/15 22:35:40 - DEBUG -    insert tagsIndex for title:javatitle2;; tag: Java
2015/12/15 22:35:40 - DEBUG -    create snippet javatitle2;;
2015/12/15 22:35:40 - DEBUG -  create title;;
2015/12/15 22:35:40 - DEBUG -    insert tagsIndex for title:title;; tag: Ruby
2015/12/15 22:35:40 - DEBUG -    create tag Ruby
2015/12/15 22:35:40 - DEBUG -    create snippet ti

再起動

Dashを再起動します。
※アプリ側がキャッシュしてるのか、再起動しないと古いデータが表示されたりする

生成結果

f:id:tbpg:20151216001013p:plain

外部資料