やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubのコンピュータ言語DBを作成する

プログラミング言語ごとの色とか。

成果物

GitHubGitHub.Language.Database.Create.201703160747

開発環境

前回まで

http://ytyaru.hatenablog.com/entry/2017/08/11/000000
http://ytyaru.hatenablog.com/entry/2017/08/12/000000
http://ytyaru.hatenablog.com/entry/2017/08/13/000000
http://ytyaru.hatenablog.com/entry/2017/08/14/000000
http://ytyaru.hatenablog.com/entry/2017/08/15/000000

リポジトリ一覧に、言語ごと、ライセンスごとの検索機能をつけたい。そのために各DBが必要。

http://ytyaru.hatenablog.com/entry/2017/08/26/000000
http://ytyaru.hatenablog.com/entry/2017/08/27/000000
http://ytyaru.hatenablog.com/entry/2017/08/28/000000

調べてみた

GitHubの言語ごとにつけている色の情報を取得したい。

大本のURLを調査

languages.ymlの項目を列挙

GitHubに知られているすべての言語を定義するらしい。

項目 必須 説明
Key string 言語を特定するキー文字列
Type string data, programming, markup, prose, nilのいずれか。
Extensions string配列 ファイルの拡張子。最初の拡張子がプライマリ拡張子。".blade.php"`など複数カンマの場合もある。
Color string #000000#FFFFFF。 typeが “programming"または "prose"の場合にのみ使用。
tm_scope string TextMateScope。grammars.ymlのどれかと一致する必要がある。ない場合はnoneを使う。
ace_mode string http://git.io/3XO_Cgのファイル名の一つと一致する必要がある。強調表示に使われるAceMode名。モードが存在しない場合は “text"を使う。text,abap,verilog
language_id integer 識別子。0〜
aliases string配列 ags。別名?
codemirror_mode string https://git.io/vi9Fxと一致する必要がある。clike
codemirror_mime_type string text/x-c++src
interpreters string配列型 解釈者。apl,aplx,dyalog,(なし)
wrap booblean 折り返すか否か。true。
group string 親言語の名前。Yacc,HTML,Haskell
filenames string配列 http://git.io/3XO_Cgのファイル名の1つと一致する必要がある。CMakeLists.txt
searchable booblean false

RDBMSとの差異

  • Extensionsの値を文字列型にしてカンマ区切りで複数格納してLIKE句で検索する方法は成立しなさそう。
    • .pyもあれば、.pyxもある。.pyで部分検索するとどちらもヒットしてしまう。
  • groupSQL予約語でエラーになる

SQLite3

DBファイル 説明
GitHub.Languages.sqlite3 GitHubで認識するコンピュータ言語のマスターDB。
テーブル名 説明
Languages GitHubで認識するコンピュータ言語のマスターテーブル。
Extensions GitHubで認識するコンピュータ言語に紐づくファイルの拡張子。
Aliases GitHubで認識するコンピュータ言語に紐づく別名定義。
Interpreters GitHubで認識するコンピュータ言語に紐づく解釈者。
FileNames GitHubで認識するコンピュータ言語に紐づくファイル名。

Languages

create table Languages(
    Id                      integer primary key,
    LanguageId              text unique not null,
    Key                     text unique not null,
    Type                    text not null,
    Color                   text,
    TextMateScope           text default NULL,
    AceMode                 text default 'text',
    CodeMirrorMode          text,
    CodeMirrorMimeType      text,
    GroupName               text,
    Wrap                    integer default 0 check(Wrap = 0 or Wrap = 1),
    Searchable              integer default 1 check(Searchable = 0 or Searchable = 1)
);

Aliases

create table Aliases(
    Id                  integer primary key,
    LanguageId          integer not null,
    Aliase              text not null,
    foreign key(LanguageId) references Languages(Id)
);

Extensions

create table Extensions(
    Id                  integer primary key,
    LanguageId          integer not null,
    Extension           text not null,
    IsPrimary           integer default 0 check(IsPrimary = 0 or IsPrimary = 1),
    foreign key(LanguageId) references Languages(Id)
); 

Interpreters

create table Interpreters(
    Id                  integer primary key,
    LanguageId          integer not null,
    Interpreter         text not null,
    foreign key(LanguageId) references Languages(Id)
);

FileNames

create table FileNames(
    Id                  integer primary key,
    LanguageId          integer not null,
    FileName            text not null,
    foreign key(LanguageId) references Languages(Id)
);

課題

リポジトリのコードサイズを保存したテーブルも変更が必要になるか。それとも現状のままKey名で結合すればいいか。

所感

次は元データのyamlファイルからDBへ挿入するPythonスクリプトを書く。