X-Git-Url: http://nitlanguage.org diff --git a/contrib/github_search_for_jni/src/github_search_for_jni.nit b/contrib/github_search_for_jni/src/github_search_for_jni.nit index 15f6a4a..8029b2e 100644 --- a/contrib/github_search_for_jni/src/github_search_for_jni.nit +++ b/contrib/github_search_for_jni/src/github_search_for_jni.nit @@ -17,15 +17,11 @@ # Script to scan Github for repositories possibly using JNI. module github_search_for_jni -import curl -import simple_json_reader +import github::github_curl -# 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 @@ -36,7 +32,6 @@ redef class HashMap[K, V] var total = 0 for k, v in self do - assert k isa String assert v isa Int total += v end @@ -53,59 +48,11 @@ redef class HashMap[K, V] end end -redef class Curl - # Headers to use on all requests - var header: HeaderMap - - # OAuth token - fun auth: String do return "OAUTH TOKEN (replace with your own)" - - # User agent (is used by github to contact devs in case of problems) - var user_agent = "JNI project finder (nitlanguage.org)" - - redef init - do - super - - header = new HeaderMap - header["Authorization"] = "token {auth}" - end - - # Get the requested URI, and check the HTTP response. Then convert to JSON - # and check for Github errors. - fun get_and_check(uri: String): HashMap[String, nullable Object] - do - var request = new CurlHTTPRequest(uri, self) - request.user_agent = user_agent - request.headers = header - var response = request.execute - - if response isa CurlResponseSuccess then - var obj = response.body_str.json_to_nit_object - assert obj isa HashMap[String, nullable Object] - - if obj.keys.has("message") then - print "Message from Github API: {obj["message"]}" - print "Requested URI: {uri}" - abort - end - - return obj - else if response isa CurlResponseFailed then - print "Request to Github API failed" - print "Requested URI: {uri}" - print "Error code: {response.error_code}" - print "Error msg: {response.error_msg}" - abort - else abort - end -end - # Query sent to Github var main_query = "language:java" # Curl instance use for all requests -var curl = new Curl +var curl = new GithubCurl("OAUTH TOKEN (replace with your own)", "JNI project finder (nitlanguage.org)") if "NIT_TESTING".environ == "true" then exit 0 @@ -115,14 +62,14 @@ 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) + var obj = curl.get_and_check(uri).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") @@ -130,11 +77,11 @@ loop # Download the language list var lang_url = item["languages_url"].as(String) - var langs = curl.get_and_check(lang_url) + var langs = curl.get_and_check(lang_url).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 - if may_be_of_interest then print "{item["name"]}: {item["forks"]}; {langs.keys.join(", ")}; {item["html_url"]}" + if may_be_of_interest then print "{item["name"].to_s}: {item["forks"].to_s}; {langs.keys.join(", ")}; {item["html_url"].to_s}" end # If we got less pages than asked for, we are done!