要点 


Githubのリポジトリ情報で重要な指標を抜粋・導出し、マークダウン形式のテーブルフォーマットで出力してくれるツールgirepoを作成しました。

またそのツールをPyPIに登録してpipで導入が可能にし、使いやすくしました。

Tool

はじめに 


OSSを利用する際に、そのOSSの機能性や知名度、普及度を調査して、実際にそのOSSを使うかの判断材料に一助にしています。その知名度や普及度、開発状況などを調査する方法としてGithubのリポジトリ情報を利用する事が多くありました。ただ、WebPage上では欲しい情報が一箇所に集約されていないため、手間を省くためにはWebAPIを利用する必要があります。

以前、WebAPIを経由してデータを取得しCSVフォーマットで出力するコードを書いて使用していました (gist上のコード)。しかし色々と気になることが増えていき、機能・柔軟性を確保したいと思いました。そうなると今のままのコマンドラインベースだと面倒になることは目に見えたため、Pythonでツールとして作ることにしました。

最初はただツールとして作成し、Github上に公開して終わりのつもりだったのですが、ふと、PyPIに登録してみたくなりました。PyPIはソフトウェアリポジトリで、PyPIで公開されているソフトウェア(パッケージ)はpipコマンドで手軽に利用することが出来るようになるサイトです。

pipは他言語でいうと、RubyならgemやNodeならnpm辺りを指します。OSのパッケージマネージャーならば、homebrewapt-getのイメージです。

あえてツールを公開した動機付けですが、ScalaやTypescriptに関しては仕事でライブラリを作成し、インハウスリポジトリに公開したり、協業相手に提供した経験があったのですが、Pythonに関しては経験ありませんでした。そこでPythonでも経験しておくことは良い機会と感じました。

またソフトウェアを使うときは「定量的に他のソフトウェアとして比較して技術選択したいし、マークダウン形式で比較表を作りたいよね」というニッチな思考を持つ同志の助けとなればということで公開することにしました。

ツール 

機能 


コマンドラインではなくPythonにして解決した事を、保守性や拡張性と言ったゆるふわ表現ではなく、箇条書きにします。基本的にはシェルでも出来るけれど、シェルでやろうとすると面倒だよね、視点です。

  • リポジトリ名の表現の揺らぎ吸収とバリデーション
    • ブラウザ上でコピーすると、ページによって区切り文字/の側にスペースが混入しますがわざわざ手で消すのは面倒なのでツール側で処理
  • コマンドライン引数の細かい解析
    • argparseが非常に優秀でbashのgetoptより少ない記述量で多くの処理が可能でした
  • 出力フォーマットへの整形

公開先 


実例 


例えばフロントエンドのフレームワークについて見てみたい時、下記のようにコマンドを実行します。

girepo angular/angular facebook/react vuejs/vue --desc star

そうするとスターで降順ソートされた、下記のような結果が得られます。

owner name star star/day created_at updated_at license language description url
vuejs vue 147197 66.16 2013-07-29 2019-08-31 MIT License JavaScript 🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web. https://github.com/vuejs/vue
facebook react 135279 59.05 2013-05-24 2019-08-31 MIT License JavaScript A declarative, efficient, and flexible JavaScript library for building user interfaces. https://github.com/facebook/react
angular angular 50871 28.12 2014-09-18 2019-08-31 MIT License TypeScript One framework. Mobile & desktop. https://github.com/angular/angular

指標の意図 


ツールが出力したテーブルのカラム数が増えすぎても、実際に表示した際に困ることになります。そのため指標の数を絞りました。表示される指標は以下の思惑で選択しました。

  • owner
    • リポジトリの所有者で会社、コミュニティ、個人があります。
    • 規模の大きな会社やコミュニティであれば、エタりにくい。
  • name
    • リポジトリ名。わかりやすくするため表示。
  • star
    • ファボ数。どのぐらいの人に意図的に知られていおり、好印象を持たれているか。
  • star/day
    • 1日あたりを出すことで、比較的新しいリポジトリと古いリポジトリを比較しやすくする。
  • created_at
    • どのぐらい昔からあるか。
  • updated_at
    • 最近までちゃんと更新されているか。
  • license
    • 利用する場合に確認必須のため。
  • language
    • 改修容易性判断。自分たちの知っている言語なら改修しやすいため。
  • description
    • リポジトリの様を分かりやすくするため。
  • url
    • 実際にリポジトリに飛びやすくするため。
    • テーブルが横に長くなる一因…。

おわりに 


自分用にドキュメントヘルパーな立ち位置のツールを作成し、PyPIに登録して一般公開しました。

一般公開するのは初めてだったので無駄に緊張してしまい、本記事の文量が増えたり、パッケージング時に変な物が含まれていないか何度も確認してしまい、パッケージング周りでちょっと時間がかかってしまいました!

その代わり今回の経験で一般公開されたリポジトリでの登録の流れを抑える事が出来たので、次回以降や他の言語で同様の事をする際はスムーズにできそうです。

ツールの今後についてですが、指標の種類を増やし、表示内容の選択幅を少し増やすぐらいの改修はするかもしれません。starだけでなく、used_byやwatch, forkといった指標も人気度という点では考えられるので、重み付き調和平均でいい感じにオレオレ指標を導出するといった具合です。

ただ、used_byや最新リリースのバージョン等は別のAPIを呼ぶ必要があり、未認証でAPIコールをする場合は1時間毎に制限があるのでちょっと揺れています。ちょっと調べたいだけなのに、わざわざ認証をしないと使えないは辛いかなと。