json: Make `json_to_nit_object` returns a `Jsonable`.
authorJean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>
Fri, 14 Nov 2014 16:18:35 +0000 (11:18 -0500)
committerJean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>
Mon, 17 Nov 2014 16:22:15 +0000 (11:22 -0500)
Signed-off-by: Jean-Christophe Beaupré <jcbrinfo@users.noreply.github.com>

contrib/github_merge.nit
contrib/github_search_for_jni/src/github_search_for_jni.nit
lib/github_api.nit
lib/json/dynamic.nit
lib/json/static.nit
lib/json_serialization.nit

index c30732f..0d5e052 100644 (file)
@@ -20,14 +20,14 @@ import template
 
 redef class Object
        # Factorize cast
-       fun json_as_a: Array[nullable Object] do return self.as(Array[nullable Object])
+       fun json_as_a: JsonArray do return self.as(JsonArray)
        # Factorize cast
-       fun json_as_map: Map[String, nullable Object] do return self.as(Map[String, nullable Object])
+       fun json_as_map: JsonObject do return self.as(JsonObject)
 end
 
 redef class GithubCurl
        # Get a given pull request (PR)
-       fun getpr(number: Int): Map[String, nullable Object]
+       fun getpr(number: Int): JsonObject
        do
                var pr = get_and_check("https://api.github.com/repos/privat/nit/pulls/{number}")
                var prm = pr.json_as_map
@@ -46,7 +46,7 @@ redef class GithubCurl
        end
 
        # Get reviewers of a PR
-       fun getrev(pr: Map[String, nullable Object]): Array[String]
+       fun getrev(pr: JsonObject): Array[String]
        do
                var number = pr["number"].as(Int)
                var user = pr["user"].json_as_map["login"].as(String)
index d12f288..35b19b2 100644 (file)
@@ -19,13 +19,12 @@ module github_search_for_jni
 
 import github_api
 
-# 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.
-redef class HashMap[K, V]
+redef class JsonObject
        # The repository has at least 50% Java code
        fun has_lots_of_java: Bool
        do
-               assert self isa HashMap[String, nullable Object]
                var java_count = 0
                if keys.has("Java") then java_count = self["Java"].as(Int)
 
@@ -43,7 +42,6 @@ redef class HashMap[K, V]
        # The repository has at least 100 lines of C code
        fun has_some_c: Bool
        do
-               assert self isa HashMap[String, nullable Object]
                var c_count = 0
                if keys.has("C") then c_count = self["C"].as(Int)
                return c_count > 100
@@ -64,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).as(HashMap[String, nullable Object])
+       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")
@@ -79,7 +77,7 @@ loop
 
                # 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 = 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
index 2394592..f2e5a69 100644 (file)
@@ -45,7 +45,7 @@ class GithubCurl
 
        # Get the requested URI, and check the HTTP response. Then convert to JSON
        # and check for Github errors.
-       fun get_and_check(uri: String): nullable Object
+       fun get_and_check(uri: String): nullable Jsonable
        do
                var request = new CurlHTTPRequest(uri, self)
                request.user_agent = user_agent
@@ -54,7 +54,7 @@ class GithubCurl
 
                if response isa CurlResponseSuccess then
                        var obj = response.body_str.json_to_nit_object
-                       if obj isa HashMap[String, nullable Object] then
+                       if obj isa JsonObject then
                                if obj.keys.has("message") then
                                        print "Message from Github API: {obj["message"] or else ""}"
                                        print "Requested URI: {uri}"
index f51ccfb..4ab9aa3 100644 (file)
@@ -123,14 +123,14 @@ class JsonValue
        #
        #     assert """{"a": 123}""".to_json_value.is_map
        #     assert not "123".to_json_value.is_map
-       fun is_map: Bool do return value isa HashMap[String, nullable Object]
+       fun is_map: Bool do return value isa MapRead[String, nullable Object]
 
        # Get this value as a `Map[String, JsonValue]`
        #
        # require: `self.is_map`
        fun to_map: Map[String, JsonValue] do
                var value = value
-               assert value isa HashMap[String, nullable Object]
+               assert value isa MapRead[String, nullable Object]
 
                var map = new HashMap[String, JsonValue]
                for k, v in value do map[k] = new JsonValue(v)
@@ -145,7 +145,7 @@ class JsonValue
        #     assert "[1, 2, 3, 4, 5]".to_json_value.is_array
        #     assert "[null, true, false, 0.0, 1, \"str\"]".to_json_value.is_array
        #     assert """["a", "b", "c"]""".to_json_value.is_array
-       fun is_array: Bool do return value isa Array[nullable Object]
+       fun is_array: Bool do return value isa SequenceRead[nullable Object]
 
        # Get this value as an `Array[JsonValue]`
        #
@@ -155,7 +155,7 @@ class JsonValue
        fun to_a: Array[JsonValue]
        do
                var value = value
-               assert value isa Array[nullable Object]
+               assert value isa SequenceRead[nullable Object]
 
                var a = new Array[JsonValue]
                for e in value do a.add(new JsonValue(e))
@@ -186,9 +186,9 @@ class JsonValue
        fun [](key: Object): JsonValue
        do
                var value = value
-               if value isa HashMap[String, nullable Object] then
+               if value isa MapRead[String, nullable Object] then
                        return new JsonValue(value[key.to_s])
-               else if value isa Array[nullable Object] then
+               else if value isa SequenceRead[nullable Object] then
                        assert key isa Int
                        return new JsonValue(value[key])
                else abort
@@ -209,7 +209,7 @@ class JsonValue
                var keys = query.split(".")
                var value = value
                for key in keys do
-                       assert value isa HashMap[String, nullable Object]
+                       assert value isa MapRead[String, nullable Object]
                        value = value[key]
                end
                return new JsonValue(value)
index 59f7629..4ebf1c0 100644 (file)
@@ -75,8 +75,7 @@ redef class Text
                return buffer.write_to_string
        end
 
-       fun json_to_nit_object: nullable Object
-       do
+       fun json_to_nit_object: nullable Jsonable do
                var lexer = new Lexer_json(to_s)
                var parser = new Parser_json
                var tokens = lexer.lex
@@ -237,7 +236,7 @@ end
 # Redef parser
 
 redef class Nvalue
-       fun to_nit_object: nullable Object is abstract
+       fun to_nit_object: nullable Jsonable is abstract
 end
 
 redef class Nvalue_number
@@ -304,9 +303,8 @@ redef class Nstring
 end
 
 redef class Nvalue_object
-       redef fun to_nit_object
-       do
-               var obj = new HashMap[String, nullable Object]
+       redef fun to_nit_object do
+               var obj = new JsonObject
                var members = n_members
                if members != null then
                        var pairs = members.pairs
@@ -335,13 +333,13 @@ end
 
 redef class Npair
        fun name: String do return n_string.to_nit_string
-       fun value: nullable Object do return n_value.to_nit_object
+       fun value: nullable Jsonable do return n_value.to_nit_object
 end
 
 redef class Nvalue_array
        redef fun to_nit_object
        do
-               var arr = new Array[nullable Object]
+               var arr = new JsonArray
                var elements = n_elements
                if elements != null then
                        var items = elements.items
index 6a2d82a..4de3b23 100644 (file)
@@ -71,8 +71,8 @@ end
 class JsonDeserializer
        super Deserializer
 
-       var root: nullable Object
-       var path = new Array[HashMap[String, nullable Object]]
+       var root: nullable Jsonable
+       var path = new Array[JsonObject]
        var id_to_object = new HashMap[Int, Object]
 
        var just_opened_id: nullable Int = null
@@ -80,7 +80,7 @@ class JsonDeserializer
        init(text: Text)
        do
                var root = text.json_to_nit_object
-               if root isa HashMap[String, nullable Object] then path.add(root)
+               if root isa JsonObject then path.add(root)
                self.root = root
        end
 
@@ -107,7 +107,7 @@ class JsonDeserializer
        # Convert from simple Json object to Nit object
        private fun convert_object(object: nullable Object): nullable Object
        do
-               if object isa HashMap[String, nullable Object] then
+               if object isa JsonObject then
                        assert object.keys.has("__kind")
                        var kind = object["__kind"]
 
@@ -259,7 +259,7 @@ redef class Array[E]
                        v.notify_of_creation self
 
                        var length = v.deserialize_attribute("__length").as(Int)
-                       var arr = v.path.last["__items"].as(Array[nullable Object])
+                       var arr = v.path.last["__items"].as(SequenceRead[nullable Object])
                        for i in length.times do
                                var obj = v.convert_object(arr[i])
                                self.add obj