Hi again! Kai, Cedric thanks for answer! Comments added. On 11/22/2013 04:20 AM, Cedric BAIL wrote: > On Fri, Nov 22, 2013 at 12:27 AM, Kai Huuhko <kai.huu...@gmail.com> wrote: >> 17.11.2013 15:53, Yakov Goldberg kirjoitti: >>> Short memo about a project: >>> The idea is that each Eo class is represented into a .eo file. These >>> files are manually modified to add new functions, comments, callbacks... >>> and parsed and the generation phase updates the C/H files. >>> >>> They contain descriptions of inherited classes, properties, methods, >>> base classes implemented functions and callbacks. >>> >>> Some explanations: >>> "name" - class name from Eo class description. We check that it is unique. >>> "inherits" - names of parent classes >>> "constructors" - (actually it is a method, just put it into separate >>> section). Here you will meet only custom constructors. >>> >>> Properties. >>> Property can be set/get; only set, only get; this is saved in "type" >>> field: "rw"(or no tag), "ro", "wo". >> Have you thought about adding another level of nesting with set and get >> members? This way you could make them optional and wouldn't need that >> type field: >> >> ... >> "properties": { >> "size_hint_max": { >> "set": { >> "comment": "Sets the hints for an object's maximum size.", >> "legacy_override": "evas_object_size_hint_max_set" >> }, >> "get": { >> "comment": "Retrieves the hints for an object's maximum size.", >> "legacy_override": "evas_object_size_hint_max_get" >> }, >> "parameters": [ >> {"w" : ["Evas_Coord", "comment"]}, >> {"h" : ["Evas_Coord", "comment"]} >> ] >> }, >> "below": { >> "get": { >> "comment": "Get the Evas object stacked right below the object", >> "legacy_override": "evas_object_below_get" >> }, >> "parameters": [ >> {"ret" : ["Evas_Object*", "comment"]}, >> ] >> } >> ... > That sounds like a nice improvement to me. Same for me. I'll play with it. > >> Another suggestion is to make legacy_override apply the whole class as a >> prefix: >> >> { >> "name": "Evas_Image", >> "legacy_prefix": "evas_object_image", >> ... >> >> You could have the individual legacy overrides for cases where legacy >> property/method name does not follow the naming in Eo API, in cases >> where there is no legacy prop/method you could have an empty string as >> override, or maybe a bool value: >> >> "legacy": false > Then why not just: "legacy" instead of "legacy_prefix", and if not > defined, there is no legacy function provided by that class. Yes, lets put "legacy" property per class. Just there will be some redundancy, for class "Elm_Button" we will have to provide "legacy" : "elm_button". It can be deleted starting from some version. (I also have to add some "version" tag)
There is also one more question. Now we have legacy: "elm_button_autorepeat_get" also we have added Eo API "elm_obj_button_autorepeat_get". Will Eo2 API be the same -> "elm_obj_button_autorepeat_get"? >> In the Python bindings we've also got "deleters" for properties; for >> example when user calls del(list.children) it's the same as calling >> clear() on the list. Would you consider having these deleters in Eo >> metadata as well? > That is a very good idea indeed. Javascript binding will benefit from > the same metadata. Yea, cool. But I want to clear something. Suppose we have Evas_Object class and funcs to set/get color. So in python we will have EvasObject_Py class with setter/getter, but without deleter, as there is no color property in object actually. So we will not provide deleter in eo-mata in this case. Smth like this: class EvasObject_Py(object): def getcolor(self): cdef int r, g, b, a eo_do(self.eo_obj, evas_obj_color_get(&r, &g, &b, &a)) r_ = r g_ = g b_ = b a_ = a return (r_, g_, b_, a_) def setcolor(self, r, g, b, a): eo_do(self.eo_obj, evas_obj_color_get(r, g, b, a)) color = property(getcolor, setcolor, None, "I'm the 'color' property.") Now about lists: AFAIR, in Py_Bindings some data is saved in internal lists sometimes. So this could look like this: class SomeClass(object): def __init__(self): self._somelst = [] def getsomelst(self): return self._somelst def setsomelst(self, lst): self._somelst = lst cdef Eina_List _lst # casting from py list to Eina_List eo_do(self.eo_obj, some_class_somelist_set(_lst)) def delsomelst(self): del self._somelst eo_do(self.eo_obj, some_class_somelist_clear()) somelst = property(getsomelst, setlsomest, delsomelst, "I'm the 'lst' property.") So in eo-meta we can provide func "somelist_clear" as a deleter? Did I understand right? >>> Methods: the same as properties, but with direction of parameter. >>> >>> Implements: list of overridden functions: >>> ["class name" , "func_name"] >>> Sometimes, if there will be name clash between property and method, user >>> will have to add 3rd paremeter "func_type": >>> ["class name" , "method_name", "method_type"] >> Why is this third parameter needed? Wouldn't it be easier to forbid >> clashing properties/methods and have a cleanly overriding inheritance? Great, you are right! In this case (in Python) we will have two definitions for "some_name" in class. One will defined as function and other as property, but only one(which is defined last) will work. Am I right? And this means that "elm_widget_theme" "elm_widget_theme_get" "elm_widget_theme_set" all must be treated as methods. >>> >>> Example. >>> http://pastebin.com/u9DPnmK2 >>> >>> Some issue. >>> One of the main task is to generate legacy functions. But not every Eo >>> function has a legacy. So we have to add >>> "legacy"("legacy_override") flag into JSON. Moreover there are cases >>> when we need to specify legacy func's name. >>> >>> Example: Eo class name is "Evas_Image". It has a method "source_set". >>> (This is not a property, because it returns some value) >>> To generate legacy we take class name and method name, so we will get >>> "evas_image_source_set", while real name is "evas_object_image_source_set" >>> Thus, as soon as we have to keep "legacy" flag, we can keep full name of >>> legacy method. >>> >>> { >>> "name": "Evas_Image", >>> "inherits": ["Evas_Object"], >>> "methods" : { >>> "source_set": { >>> "comment": "Set the source object on an image object.", >>> "return_type": "Eina_Bool", >>> "legacy_override": "evas_object_image_source_set", >>> "parameters": { >>> "in" : [ >>> {"src" : ["Evas_Object*", "comment"]} >>> ] >>> } >>> }, >>> } >>> } >>> >>> >>> - In case of properties, we need to keep "legacy_set", "legacy_get". >>> Initial generation will be automatic, nevertheless we'll have to check >>> everything manually. >>> - Description of parameters: {"name" : ["type", "comment"]}; for >>> methods additional sections "in" "out" must be added. >>> >>> - implements section can be moved into methods and properties sections. >>> It can look more consistent, but requires one more nested level. >>> "methods" : >>> { "realizes" : { >>> "source_set" : { >>> } >>> }, >>> "implements" : [ >>> ["Evas_Smart", "resize"] >>> ] >>> } >>> >>> - implements section should have description of event being sent >>> "implements": [ >>> ["Evas_Smart", "resize", {"int", "int", "char *"}], >>> ] >>> ======================================================== >>> ======================================================== >>> Another solution is to write C-styled eo file. Which requires another >>> parser. >>> http://pastebin.com/stycZmKV >>> This is very first version, after which we switched to JSON, so it >>> doesn't have many fields. >>> >>> So advantages and drawbacks: >>> - C-styled file is more compact >>> >>> - JSON is more flexible and scalable (we already require several helping >>> tags and different comments for _set/_get properties) >>> and also some reference between functions(for documentation) need to >>> be added. >>> - easier to support versioning >>> - 3rd party parsers can be used. >>> but requires to keep JSON structure - that means quotes and brackets. >> Have you looked into YAML? >> https://en.wikipedia.org/wiki/YAML >> >> It has similar features to JSON while being more compact. > It is the first time I look at it. It is indeed more compact, but I am > not sure it is easy to get how to use it for new comers. > >> If the choice is between C-like syntax and JSON, I'll go with JSON as >> it's easier to create a forward compatible parser/lexer for it, and >> because of the reasons you mentioned above. But this should not depend >> on a single round of voting, we should strive to find a syntax and >> structure which serves all our relevant needs and is easy to work with. > I think we are not committed yet to either C-like or JSON syntax, this > discussion and thread is a good opportunity to raise your voice and > see if we can find a better solution. > >> P.S. I am interested to work on the language bindings aspect of this >> after 1.8 Python bindings are released. > Cool :-) Cool! ------------------------------------------------------------------------------ Shape the Mobile Experience: Free Subscription Software experts and developers: Be at the forefront of tech innovation. Intel(R) Software Adrenaline delivers strategic insight and game-changing conversations that shape the rapidly evolving mobile landscape. Sign up now. http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel