GitHubからファイルのプログラミング言語をフェッチすることは可能ですか?

野菜

git commitsログからファイルを差分し、きれいに印刷されたhtmlファイルに差分を書き込むPythonスクリプトを準備しています。

GitHub diffで行われるのと同じようにソースコードに色を付けたいので、そのためにpygmentsを使用したいと思います。問題は1つだけです。ソースコードが記述されている言語に関する情報が必要になるため、なんとかして取得する必要があります。

リポジトリのローカルコピー(推奨)またはGitHub自体から直接フェッチする可能性があるかどうか疑問に思いました。GitHubは言語学者を使用しているので、作業はすでに完了しています。なぜそれを使用しないのですか?さらに、GitHub UIインターフェイスの言語バー情報の下から特定の言語リンクを入力すると、選択した言語で記述されていると認識されたすべてのファイルを明確に確認できます。

.gitattributesそこにあるファイルの言語を設定できるファイルに関する情報をいくつか見ましたが、手動で設定する必要があり、プロジェクトの更新後に、追加されたすべてのファイルでそのファイルを更新する必要がありました。

野菜

この質問を書き終えるとすぐに、GitHub RESTAPIが見つかりました。また、ファイル言語をそのまま使用できる関数は見つかりませんでした。2つのGitHubRESTAPIメソッドを組み合わせることが可能であることがわかりました。

以下、Pythonの実装に基づいて説明します。

  1. プロジェクトのすべての言語を一覧表示し、Python辞書に保存します
  2. リポジトリ言語を反復処理し、クエリで言語パラメータを使用して検索を実行します(パラメータqが必要なため、ファイルに含める必要のある文字は「スペース」であると判断したため、探している文字列として%20を指定します)
  3. total_countが1に等しい場合は、言語名を返すことができれば、言語を含むファイルが見つかったことを意味します。
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]

編集
0

コメントを追加

0

関連記事

分類Dev

Web Assembly(wasm)ファイルを特定のプログラミング言語に逆コンパイルすることは可能ですか?

分類Dev

`cron`ファイルはどのプログラミング言語で作られていますか?

分類Dev

LinuxでCプログラミング言語のヘッダーファイルを見つけるにはどうすればよいですか?

分類Dev

Javaプログラミングを介してファイルを意図的に破損させることはできますか?また、ファイルの内容をスクランブリングすることは可能ですか?

分類Dev

Cloud Foundry-フラッピングアプリでファイルをチェックすることは可能ですか?

分類Dev

普遍的な中間プログラミング言語を作成することは可能ですか?

分類Dev

プログラムから内容を取得するファイルを作成することは可能ですか?

分類Dev

プログラムから内容を取得するファイルを作成することは可能ですか?

分類Dev

MS Excelでのxmlファイルのインポート-Pythonまたは他のプログラミング言語を使用してこのフローを自動化するにはどうすればよいですか?

分類Dev

これはどのプログラミング言語ですか?拡張子が* .bbのファイルです

分類Dev

1つのWebサイトで複数のプログラミング言語を使用することは可能ですか

分類Dev

安全なプログラミング。ファイルをチェックしてから書き込むときにTOCTOUの脆弱性を回避する方法

分類Dev

gradle用のgrgitプラグインを介して1つのファイルのみをコミットすることは可能ですか?

分類Dev

ファイルグロブを一緒にチェーンすることは可能ですか?

分類Dev

ヘッダーファイルが他のプログラミング言語で使用されなかったのはなぜですか?

分類Dev

ファイルを追加または変更するたびに、外部hdからpc hddにフォルダファイルをバックアップするバッチプログラムを作成することは可能ですか?

分類Dev

プロジェクトファイルをダウングレードすることは可能ですか?

分類Dev

プロトファイルの列挙値をチェックすることは可能ですか?

分類Dev

Rプログラミング言語を使用してAndroid開発を行うことは可能ですか?

分類Dev

グーグルプレイコンソールのアプリを、使用されている別のプログラミング言語に置き換えることは可能ですか?

分類Dev

バックグラウンドフェッチ(または他のiOSメカニズム)を使用して、指定した間隔でいくつかのファイルをダウンロードすることは可能ですか?

分類Dev

プロット:特定のグラフィカルオブジェクトのみをインタラクティブにすることは可能ですか?

分類Dev

プログラミング言語で(のみ)読んだ後、ファイルを閉じる必要がありますか?

分類Dev

goプログラムのプロファイリング時にサンプルレートを上げることは可能ですか?

分類Dev

Neo4J からグラフを抽出し、プログラミング言語で再構築する方法

分類Dev

1つのappengineプロジェクトでプログラミング言語を混在させることはできますか?

分類Dev

統計プログラミング言語Rでポイントフリープログラミングは可能ですか?

分類Dev

Durable Azure Functionsがプログラミング言語間(C#からPython Azure Functions)で通信することは可能ですか?

分類Dev

リストをPythonでファイルとして保存します(ファイルは他のプログラミング言語でも受け入れられる必要があります)

Related 関連記事

  1. 1

    Web Assembly(wasm)ファイルを特定のプログラミング言語に逆コンパイルすることは可能ですか?

  2. 2

    `cron`ファイルはどのプログラミング言語で作られていますか?

  3. 3

    LinuxでCプログラミング言語のヘッダーファイルを見つけるにはどうすればよいですか?

  4. 4

    Javaプログラミングを介してファイルを意図的に破損させることはできますか?また、ファイルの内容をスクランブリングすることは可能ですか?

  5. 5

    Cloud Foundry-フラッピングアプリでファイルをチェックすることは可能ですか?

  6. 6

    普遍的な中間プログラミング言語を作成することは可能ですか?

  7. 7

    プログラムから内容を取得するファイルを作成することは可能ですか?

  8. 8

    プログラムから内容を取得するファイルを作成することは可能ですか?

  9. 9

    MS Excelでのxmlファイルのインポート-Pythonまたは他のプログラミング言語を使用してこのフローを自動化するにはどうすればよいですか?

  10. 10

    これはどのプログラミング言語ですか?拡張子が* .bbのファイルです

  11. 11

    1つのWebサイトで複数のプログラミング言語を使用することは可能ですか

  12. 12

    安全なプログラミング。ファイルをチェックしてから書き込むときにTOCTOUの脆弱性を回避する方法

  13. 13

    gradle用のgrgitプラグインを介して1つのファイルのみをコミットすることは可能ですか?

  14. 14

    ファイルグロブを一緒にチェーンすることは可能ですか?

  15. 15

    ヘッダーファイルが他のプログラミング言語で使用されなかったのはなぜですか?

  16. 16

    ファイルを追加または変更するたびに、外部hdからpc hddにフォルダファイルをバックアップするバッチプログラムを作成することは可能ですか?

  17. 17

    プロジェクトファイルをダウングレードすることは可能ですか?

  18. 18

    プロトファイルの列挙値をチェックすることは可能ですか?

  19. 19

    Rプログラミング言語を使用してAndroid開発を行うことは可能ですか?

  20. 20

    グーグルプレイコンソールのアプリを、使用されている別のプログラミング言語に置き換えることは可能ですか?

  21. 21

    バックグラウンドフェッチ(または他のiOSメカニズム)を使用して、指定した間隔でいくつかのファイルをダウンロードすることは可能ですか?

  22. 22

    プロット:特定のグラフィカルオブジェクトのみをインタラクティブにすることは可能ですか?

  23. 23

    プログラミング言語で(のみ)読んだ後、ファイルを閉じる必要がありますか?

  24. 24

    goプログラムのプロファイリング時にサンプルレートを上げることは可能ですか?

  25. 25

    Neo4J からグラフを抽出し、プログラミング言語で再構築する方法

  26. 26

    1つのappengineプロジェクトでプログラミング言語を混在させることはできますか?

  27. 27

    統計プログラミング言語Rでポイントフリープログラミングは可能ですか?

  28. 28

    Durable Azure Functionsがプログラミング言語間(C#からPython Azure Functions)で通信することは可能ですか?

  29. 29

    リストをPythonでファイルとして保存します(ファイルは他のプログラミング言語でも受け入れられる必要があります)

ホットタグ

アーカイブ