git commitsログからファイルを差分し、きれいに印刷されたhtmlファイルに差分を書き込むPythonスクリプトを準備しています。
GitHub diffで行われるのと同じようにソースコードに色を付けたいので、そのためにpygmentsを使用したいと思います。問題は1つだけです。ソースコードが記述されている言語に関する情報が必要になるため、なんとかして取得する必要があります。
リポジトリのローカルコピー(推奨)またはGitHub自体から直接フェッチする可能性があるかどうか疑問に思いました。GitHubは言語学者を使用しているので、作業はすでに完了しています。なぜそれを使用しないのですか?さらに、GitHub UIインターフェイスの言語バー情報の下から特定の言語リンクを入力すると、選択した言語で記述されていると認識されたすべてのファイルを明確に確認できます。
.gitattributes
そこにあるファイルの言語を設定できるファイルに関する情報をいくつか見ましたが、手動で設定する必要があり、プロジェクトの更新後に、追加されたすべてのファイルでそのファイルを更新する必要がありました。
この質問を書き終えるとすぐに、GitHub RESTAPIが見つかりました。また、ファイル言語をそのまま使用できる関数は見つかりませんでした。2つのGitHubRESTAPIメソッドを組み合わせることが可能であることがわかりました。
以下、Pythonの実装に基づいて説明します。
import requests
import json
def check_file_lang(filename: str, repo: str):
response = requests.get("https://api.github.com/repos/{}/languages".format(repo))
lang = json.loads(response.text)
for lang in lang.keys():
response = requests.get("https://api.github.com/search/code?q=%20+filename:{}+repo:{}+language:{}".format(filename,
repo,
lang))
search_result = json.loads(response.text)
if search_result['total_count'] == 1:
return lang
f = "Gruntfile.js"
r = "jquery/jquery"
file_lang = check_file_lang(f, r)
print(file_lang)
これに関する1つの問題は、リポジトリに多くの言語がある場合、この要求を完了できなかった可能性があることです。GitHubは1分あたりのリクエスト数を制限しているため(未認証== 10および認証済み== 30)、リポジトリからすべての言語をチェックするために多くのリクエストが必要になる可能性があります。GitHub REST APIレート制限さらに、リポジトリに言語が1つしかない場合でも、ファイルごとに2つのリクエストが必要です。つまり、1分あたり最大5つまたは15のファイルをチェックできます。
その後、提供された言語に基づいてリポジトリからすべてのファイルを返す方が良いと思いますが、GitHubはクエリを制限しますGitHub REST APIタイムアウトと不完全な結果は、大きなプロジェクトではデータが切り捨てられる可能性があるため、リポジトリからすべてのファイルを知ることができませんでした。
def list_all_files_by_language(repo: str):
response = requests.get("https://api.github.com/repos/{}/languages".format(repo))
lang = json.loads(response.text)
ret_dict = {}
for lang in lang.keys():
response = requests.get("https://api.github.com/search/code?q=%20+repo:{}+language:{}".format(repo,
lang))
search_result = json.loads(response.text)
if 'items' in search_result.keys():
ret_dict[lang] = search_result['items']
return ret_dict
ソリューションには欠点がありますが、機能します。誰かがもっと良いものを見つけたら、私はそれを試してみたいと思っています。
GitHub Enterprise(これは私のユースケースです)には制限が記載されていないため、今のところ、この回答は私のニーズに合っているので受け入れます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加