背景
githubのリポジトリのスター数を色々比較して見たかったので出力できるスクリプトを作ってみた。
実行方法
事前準備
- inファイルを用意しておく
- 対象リポジトリ名一覧を記述
- .envファイルを用意しておく
- GITHUB_TOKENを定義
実行
$ yarn add ygor @octokit/core fs readline dotenv
$ node task.js output_star
コード
task.js
/**
* `https://github.com/{owner}/{repo}` のownerとrepoの情報をまとめたファイルを読み込み、
* スター数一覧を追記したファイルを出力する。
*
* # 実行例
* node task.js output_star
*
* # inファイル例
* ```
* facebook/react
* vuejs/vue
* jquery/jquery
* ```
*
* # outファイル例
* ```
* facebook/react 190187
* vuejs/vue 197000
* jquery/jquery 56371
* ```
* */
const ygor = require("ygor");
const { Octokit } = require("@octokit/core");
const fs = require('fs');
const readline = require("readline");
require('dotenv').config();
const IN_FILE_NAME = 'in';
const OUT_FILE_NAME = 'out';
// arg._[0]: 読み込みファイルパス
// 未設定の場合はIN_FILE_NAMEがデフォルト
async function output_star(arg) {
const octokit = new Octokit({
// .envファイルのGITHUB_TOKENにトークン設定
auth: process.env.GITHUB_TOKEN
})
const reader = _getReader(arg);
await reader.on('line', async (record) => {
let [owner, repo] = record.split('/');
res = await octokit.request('GET /repos/{owner}/{repo}', {
owner: owner,
repo: repo
});
let tmp = [];
// リポジトリ名
tmp.push(record);
// スター数
tmp.push(res['data']['stargazers_count']);
// 詳細
// tmp.push(res['data']['description']);
const str = tmp.join('\t');
console.log(str);
// ファイル出力
fs.appendFile(OUT_FILE_NAME, str+'\n', (err) => {
if (err) throw err;
});
});
}
function _setFile(arg) {
if (arg._[0]){
return arg._[0];
} else {
return IN_FILE_NAME;
}
}
function _getReader(arg) {
const stream = fs.createReadStream(_setFile(arg));
return readline.createInterface({ input: stream });
}
// コマンドの登録 ygor.task(コマンド名, 実行する関数)
// owner, repoの一覧を受け取り、starの一覧を返す
ygor.tasks.add("output_star", output_star);
Editor's Note
スクリプトを書きたい時はたいていpythonかrubyで書いてたけど、最近のnodeはCUIで実行時に結果やオブジェクトのメソッド一覧とかを表示してくれるのね!
めっちゃ便利になっててびっくり!!
js系は流れ早すぎてあまりキャッチアップしてなかったけど、そろそろ触っていこうかなー。
というか、事業コンテンツ考えたり営業活動しようとしていたはずなのにふと横道それてスクリプト組んだりしてたらあっという間に時間が過ぎてたという罠()