Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

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

f:id:tbpg:20151207233201j:plain

経緯

DashのSnippetですが、Dash Guideやネットにある情報を見る限り
DashのGUIから登録する方法しか提供されていないようだ。

が、大量のデータをSnippetとして利用したい場合にこれはあまりに不便である。
そこでTwitterでSnippetについてつぶやいてみたところ

このような情報をいただいた。
ありがとうございます!!

ちょうどこの時こちらでもDashのDocsetsはSQLiteで管理されてるようなので、
SnippetsもおそらくSQLiteだろうという予想のもと

%Dash%library.dash

sqlite3 コマンドで開き、中にあるテーブル一覧から snippets を見つけて確認したところでした。

調査

SQLiteCLIツールを調べる

SQLiteはほぼ使ったことがないので、その部分も調べながら進めていく。

Command Line Shell For SQLite - SQLite

sqlite3 コマンドがあるようだ。
確認してみよう。

$ cd %Dash
$ sqlite3 library.dash
sqlite> .tables
smartTags  snippets   tags       tagsIndex

ふむ、4テーブルあるようだ。

SQLiteスキーマ構造を確認する

登録データの確認

事前に登録しておいた情報を頼りにテーブル構造を把握してみる。
登録済み情報は以下のようにしておきました。

f:id:tbpg:20151210234357g:plain

Abbreviation Body Tag
test;; test
test
test
test
test
test2 test2
test2
test
rubyif;; if(__condition__) { __logic__ } ruby

SQLiteの各テーブルを確認

  • snippets
sqlite> .schema snippets
CREATE TABLE snippets(sid INTEGER PRIMARY KEY, title TEXT, body TEXT, syntax VARCHAR(20), usageCount INTEGER, FOREIGN KEY(sid) REFERENCES tagsIndex(sid) ON DELETE CASCADE ON UPDATE CASCADE);

sqlite> select * from snippets;
1|test;;|test
test
test
test
|None|0
2|test2|test2
test2|None|0
3|rubyif;;|if(__condition__) { __logic__ }|Ruby|0
  • tags
sqlite> .schema tags
CREATE TABLE tags(tid INTEGER PRIMARY KEY, tag TEXT UNIQUE, FOREIGN KEY(tid) REFERENCES tagsIndex(tid) ON DELETE CASCADE ON UPDATE CASCADE);

sqlite> select * from tags;
1|test
2|ruby
  • tagsIndex
sqlite> .schema tagsIndex
CREATE TABLE tagsIndex(tid INTEGER, sid INTEGER);

sqlite> select * from tagsIndex;
1|1
1|2
2|3

これはtagのidとsnippetのidを紐付けるテーブルですね。

以下の様な構造になっているようですね。
※括弧なしが画面の項目名。括弧ありがDBのtable + column名です。

sid title body syntax tid tag usageCount
1 test;; test
test
test
test
None 1 test 0
2 test2 test2
test2
None 1 test 0
3 rubyif;; if(__condition__) { __logic__ } Ruby 2 ruby 0

usageCountは名前の通りだと使用回数になりそうだけど、Snippetを使ってみても変化はなかった。

データを追加

テーブル構造も分かったし想定されるデータを追加したらGUIのSnippetに反映されるか確認してみましょう。

追加するデータは

sid title body syntax tid tag usageCount
4 sqlite_title;; sqlite_body Ruby 2 ruby 0

にします。

sqlite> insert into tagsIndex values((select tid from tags where tag = "ruby"), (select max(sid) from tagsIndex) + 1);
sqlite> select * from tagsIndex;
1|1
1|2
2|3
2|4

sqlite> insert into snippets values((select max(sid) from tagsIndex),"sqlite_title","sqlite_body","Ruby",0);
sqlite> select * from snippets;
1|test;;|test
test
test
test
|None|0
2|test2|test2
test2|None|0
3|rubyif;;|if(__condition__) { __logic__ }|Ruby|0
4|sqlite_title|sqlite_body|Ruby|0

Tagが新規登録の場合は先にタグを追加するフェーズを足せばいいでしょう。

画面から登録データを確認

SQLiteから登録したデータが表示されているか確認します。

f:id:tbpg:20151210234332p:plain

無事表示されています!

まとめ

SQLiteからデータを登録できることを確認できました。

さて、この手順はひどく面倒なものなのでSnippetの情報を管理する設定ファイル(yamlなど)と スクリプト一発でSnippetを最新化できると嬉しいです。

そう、ここからが本番だったのです・・・

to be continued...

外部資料