数字で見るGitHubレポジトリ　～LangChainを例に～

## はじめに

この記事では、GitHub APIを使用してリポジトリの統計情報を取得し、分析する方法を紹介します。プロジェクト管理者や開発者がリポジトリの状態をより深く理解するのに役立つ内容となっています。題材としては、非常に開発が活発なLangChainを用います。ソースコードの`repo`変数を変更することで任意のGitHubレポジトリを分析することが可能です。


## 使用するツール

- **Python**: スクリプト言語としてPythonを使用します。
- **Requests**: HTTPリクエストを行うためのPythonライブラリです。
- **GitHub REST API**: リポジトリの統計情報を取得するために使用します。


## 使用したソースコード

下記のソースコードは以下の主要な機能を持っています：

1. **基本統計情報の取得**: リポジトリのスター数、フォーク数、ウォッチャー数、オープンイシュー数、作成日を取得します。
2. **追加統計情報の取得**: コミット数、コードの追加と削除の量を取得します。
3. **最新リリース情報の取得**: リポジトリの最新リリースの詳細を取得します。
4. **トップ5コントリビューターの表示**: リポジトリへの最大貢献者トップ5を表示します。

```github_stats_visualizer.py
import requests


def make_api_request(url):
    """APIリクエストを行い、JSONレスポンスを返す"""
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception(f"GitHub API Error: {response.status_code}")

def get_repo_stats(repo):
    """GitHubリポジトリの基本統計情報を取得する"""
    url = f'https://api.github.com/repos/{repo}'
    data = make_api_request(url)
    return {
        'Stars': data['stargazers_count'],
        'Forks': data['forks_count'],
        'Watchers': data['watchers_count'],
        'Open Issues': data['open_issues_count'],
        'Created At': data['created_at']
    }

def get_additional_stats(repo):
    """追加のリポジトリ統計情報を取得する"""
    commits_data = make_api_request(f'https://api.github.com/repos/{repo}/stats/commit_activity')
    code_freq_data = make_api_request(f'https://api.github.com/repos/{repo}/stats/code_frequency')
    return {
        'Total Commits': sum(week['total'] for week in commits_data),
        'Code Additions': sum(week[1] for week in code_freq_data),
        'Code Deletions': sum(week[2] for week in code_freq_data)
    }

def get_latest_release(repo):
    """リポジトリの最新リリース情報を取得する"""
    releases = make_api_request(f'https://api.github.com/repos/{repo}/releases')
    return releases[0] if releases else None

def display_repo_info(repo):
    """リポジトリの情報を表示する"""
    stats = get_repo_stats(repo)
    stats.update(get_additional_stats(repo))

    print("\nRepository Statistics:")
    for key, value in stats.items():
        print(f"{key}: {value}")

    latest_release = get_latest_release(repo)
    if latest_release:
        print("\nLatest Release:")
        print(f"- {latest_release['name']} (Tag: {latest_release['tag_name']})")

    contributors = make_api_request(f'https://api.github.com/repos/{repo}/contributors')[:5]
    print("\nTop 5 Contributors:")
    for contributor in contributors:
        print(f"- {contributor['login']} (Contributions: {contributor['contributions']})")

if __name__ == "__main__":
    repo = 'langchain-ai/langchain'  # <- 変更することで任意のGitHubレポジトリを分析することが可能です。
    display_repo_info(repo)

```


## 結果と解説

```bash
Repository Statistics:
Stars: 70655
Forks: 10440
Watchers: 70655
Open Issues: 1997
Created At: 2022-10-17T02:58:36Z
Total Commits: 5988
Code Additions: 2787351
Code Deletions: -1963421

Latest Release:
- v0.0.349-rc.2 (Tag: v0.0.349-rc.2)

Top 5 Contributors:
- hwchase17 (Contributions: 1169)
- baskaryan (Contributions: 596)
- nfcampos (Contributions: 239)
- eyurtsev (Contributions: 188)
- hinthornw (Contributions: 188)

```

このスクリプトの実行結果から、LangChainリポジトリが非常に活発に開発されていることがわかります。

**開発の指標の解説**

1. **スター数とフォーク数**: スター数は70,655、フォーク数は10,440という高い数値は、LangChainが広く認知され、多くの開発者に利用されていることを示しています。

2. **コミット数**: 総コミット数が5,988という数は、リポジトリが定期的に更新されていることを示しています。これは、新機能の追加、バグ修正、パフォーマンスの改善など、継続的な開発活動が行われていることを意味します。

3. **コードの追加と削除**: コードの追加量が2,787,351行、削除量が-1,963,421行という大規模な変更は、リポジトリが大きな進化を遂げていることを示しています。これは、新しいアイデアの実装や既存のコードのリファクタリングが頻繁に行われていることを意味します。

4. **最新リリース**: 最新リリース「v0.0.349-rc.2」から、LangChainが定期的に新しいバージョンをリリースしていることを示しています。これは、プロジェクトが活発にメンテナンスされ、新しい機能が定期的に追加されていることを意味します。


上記の統計情報は、LangChainが非常に活発なオープンソースプロジェクトであることを示しています。多くのスターとフォーク、継続的なコミット、定期的なリリースなどは、LangChainが生成AIの開発において重要な役割を果たしていることが読み取れますね！

上記の分析を行うことで、GitHubレポジトリの統計情報を簡単に俯瞰できるので、興味を持たれた方は同様の分析をしてみてください！
（ソースコードの`repo`変数を変更することで任意のGitHubレポジトリを分析することが可能です。）


## 参考文献

この記事は以下の情報を参考にして執筆しました。

https://github.com/langchain-ai/langchain

https://docs.github.com/ja/rest



### ソースコード

本記事で使用したソースコードは、下記のGitHubレポジトリに格納しています。

https://github.com/Isaka-code/openai-api-hands-on