# Script to scan Github for repositories possibly using JNI.
module github_search_for_jni
-import github_api
+import github::api
+import json::static
-# The proprieties introduced by this redef are to be used only on HashMap
+# The proprieties introduced by this redef are to be used only on a JSON object
# representing a Github repository.
-#
-# REQUIRE `assert self isa HashMap[String, nullable Object]`
-# REQUIRE `for v in self.values do assert v isa Int
-redef class HashMap[K, V]
+redef class JsonObject
# The repository has at least 50% Java code
fun has_lots_of_java: Bool
do
var total = 0
for k, v in self do
- assert k isa String
assert v isa Int
total += v
end
# Query sent to Github
var main_query = "language:java"
-# Curl instance use for all requests
-var curl = new GithubCurl("OAUTH TOKEN (replace with your own)", "JNI project finder (nitlanguage.org)")
+# API client instance use for all requests
+var api = new GithubAPI("OAUTH TOKEN (replace with your own)", "JNI project finder (nitlanguage.org)")
if "NIT_TESTING".environ == "true" then exit 0
var per_page = 100
loop
# Get a page of the main query
- var uri = "https://api.github.com/search/repositories?q={main_query}&page={page}&per_page={per_page}&sort=stars"
- var obj = curl.get_and_check(uri).as(HashMap[String, nullable Object])
+ var uri = "/search/repositories?q={main_query}&page={page}&per_page={per_page}&sort=stars"
+ var obj = api.send("GET", uri).parse_json.as(JsonObject)
# Main object has "total_count" and "items"
- var items = obj["items"].as(Array[nullable Object])
+ var items = obj["items"].as(JsonArray)
# "items" is an array of Json objects
for item in items do
- assert item isa HashMap[String, nullable Object]
+ assert item isa JsonObject
# Each item has "name" and "languages_url"
assert item.keys.has("name")
# Download the language list
var lang_url = item["languages_url"].as(String)
- var langs = curl.get_and_check(lang_url).as(HashMap[String, nullable Object])
+ var langs = api.send("GET", lang_url).parse_json.as(JsonObject)
# The project is of interest if it has lots of Java and at least some C
var may_be_of_interest = langs.has_lots_of_java and langs.has_some_c