diff options
Diffstat (limited to 'plugins/yaml/python/node.c')
-rw-r--r-- | plugins/yaml/python/node.c | 237 |
1 files changed, 32 insertions, 205 deletions
diff --git a/plugins/yaml/python/node.c b/plugins/yaml/python/node.c index 17aa065..31daa04 100644 --- a/plugins/yaml/python/node.c +++ b/plugins/yaml/python/node.c @@ -37,8 +37,14 @@ -/* Crée un nouvel objet Python de type 'YamlNode'. */ -static PyObject *py_yaml_node_new(PyTypeObject *, PyObject *, PyObject *); +#define YAML_NODE_DOC \ + "YamlNode handles a node in a Yaml tree.\n" \ + "\n" \ + "There are three kinds of node contents defined in the Yaml specifications:\n" \ + "* scalar, implemented by the pychrysalide.plugins.yaml.YamlScalar object.\n" \ + "* sequence and mapping, implemented by the pychrysalide.plugins.yaml.YamlCollection object." + + /* Recherche les noeuds correspondant à un chemin. */ static PyObject *py_yaml_node_find_by_path(PyObject *, PyObject *); @@ -46,59 +52,6 @@ static PyObject *py_yaml_node_find_by_path(PyObject *, PyObject *); /* Recherche l'unique noeud correspondant à un chemin. */ static PyObject *py_yaml_node_find_one_by_path(PyObject *, PyObject *); -/* Fournit la ligne principale associée à un noeud. */ -static PyObject *py_yaml_node_get_yaml_line(PyObject *, void *); - -/* Attache une collection de noeuds Yaml à un noeud. */ -static int py_yaml_node_set_collection(PyObject *, PyObject *, void *); - -/* Fournit une éventuelle collection rattachée à un noeud. */ -static PyObject *py_yaml_node_get_collection(PyObject *, void *); - - - -/****************************************************************************** -* * -* Paramètres : type = type de l'objet à instancier. * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Crée un nouvel objet Python de type 'YamlNode'. * -* * -* Retour : Instance Python mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_node_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Instance à retourner */ - GYamlLine *key; /* Ligne principale du noeud */ - int ret; /* Bilan de lecture des args. */ - GYamlNode *node; /* Création GLib à transmettre */ - -#define YAML_NODE_DOC \ - "YamlNode handle a node in a Yaml tree.\n" \ - "\n" \ - "Instances can be created using the following constructor:\n" \ - "\n" \ - " YamlNode(key)\n" \ - "\n" \ - "Where key is the main Yaml line for the node." - - ret = PyArg_ParseTuple(args, "O&", &convert_to_yaml_line, &key); - if (!ret) return NULL; - - node = g_yaml_node_new(key); - - g_object_ref_sink(G_OBJECT(node)); - result = pygobject_new(G_OBJECT(node)); - g_object_unref(node); - - return result; - -} /****************************************************************************** @@ -117,6 +70,7 @@ static PyObject *py_yaml_node_new(PyTypeObject *type, PyObject *args, PyObject * static PyObject *py_yaml_node_find_by_path(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ + int prepare; /* Orientation des résultats */ const char *path; /* Chemin d'accès à traiter */ int ret; /* Bilan de lecture des args. */ GYamlNode *node; /* Version GLib du noeud */ @@ -126,19 +80,26 @@ static PyObject *py_yaml_node_find_by_path(PyObject *self, PyObject *args) #define YAML_NODE_FIND_BY_PATH PYTHON_METHOD_DEF \ ( \ - find_by_path, "path", \ + find_by_path, "path, /, prepare=False", \ METH_VARARGS, py_yaml_node, \ "Find nodes from a Yaml node using a path.\n" \ "\n" \ "Paths are node keys separated by '/', such as '/my/path/to/node'." \ + "\n" \ + "In case where the path ends with a trailing '/', the operation can" \ + " be used to prepare a further look by returning a node which can be" \ + " searched by a new call to this function instead of returning all its" \ + " contained nodes." \ ) - ret = PyArg_ParseTuple(args, "s", &path); + prepare = 0; + + ret = PyArg_ParseTuple(args, "s|p", &path, &prepare); if (!ret) return NULL; node = G_YAML_NODE(pygobject_get(self)); - g_yaml_node_find_by_path(node, path, &found, &count); + g_yaml_node_find_by_path(node, path, prepare, &found, &count); result = PyTuple_New(count); @@ -179,6 +140,7 @@ static PyObject *py_yaml_node_find_by_path(PyObject *self, PyObject *args) static PyObject *py_yaml_node_find_one_by_path(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ + int prepare; /* Orientation des résultats */ const char *path; /* Chemin d'accès à traiter */ int ret; /* Bilan de lecture des args. */ GYamlNode *node; /* Version GLib du noeud */ @@ -186,21 +148,28 @@ static PyObject *py_yaml_node_find_one_by_path(PyObject *self, PyObject *args) #define YAML_NODE_FIND_ONE_BY_PATH PYTHON_METHOD_DEF \ ( \ - find_one_by_path, "path", \ + find_one_by_path, "path, /, prepare=False", \ METH_VARARGS, py_yaml_node, \ "Find a given node from a Yaml node using a path.\n" \ "\n" \ "Paths are node keys separated by '/', such as '/my/path/to/node'." \ "\n" \ "Only one node has to match the path for the function success." \ + "\n" \ + "In case where the path ends with a trailing '/', the operation can" \ + " be used to prepare a further look by returning a node which can be" \ + " searched by a new call to this function instead of returning all its" \ + " contained nodes." \ ) - ret = PyArg_ParseTuple(args, "s", &path); + prepare = 0; + + ret = PyArg_ParseTuple(args, "s|p", &path, &prepare); if (!ret) return NULL; node = G_YAML_NODE(pygobject_get(self)); - found = g_yaml_node_find_one_by_path(node, path); + found = g_yaml_node_find_one_by_path(node, path, prepare); if (found == NULL) { @@ -220,146 +189,6 @@ static PyObject *py_yaml_node_find_one_by_path(PyObject *self, PyObject *args) /****************************************************************************** * * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la ligne principale associée à un noeud. * -* * -* Retour : Ligne Yaml à l'origine du noeud. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_node_get_yaml_line(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlNode *node; /* Version GLib du noeud */ - GYamlLine *line; /* Line Yaml associée */ - -#define YAML_NODE_YAML_LINE_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - yaml_line, py_yaml_node, \ - "Orginal Yaml line linked to the node." \ -) - - node = G_YAML_NODE(pygobject_get(self)); - - line = g_yaml_node_get_yaml_line(node); - - if (line == NULL) - { - result = Py_None; - Py_INCREF(result); - } - else - { - result = pygobject_new(G_OBJECT(line)); - g_object_unref(G_OBJECT(line)); - } - - return result; - -} - - - - - -/****************************************************************************** -* * -* Paramètres : self = contenu binaire à manipuler. * -* value = collection de noeuds Yaml. * -* closure = adresse non utilisée ici. * -* * -* Description : Attache une collection de noeuds Yaml à un noeud. * -* * -* Retour : Jeu d'attributs liés au contenu courant. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int py_yaml_node_set_collection(PyObject *self, PyObject *value, void *closure) -{ - int result; /* Bilan à renvoyer */ - GYamlNode *node; /* Version GLib du noeud */ - GYamlCollection *collec; /* Version GLib de la valeur */ - - node = G_YAML_NODE(pygobject_get(self)); - - if (value == Py_None) - { - g_yaml_node_set_collection(node, NULL); - result = 0; - } - - else - { - if (!convert_to_yaml_collection(value, &collec)) - result = -1; - - else - { - g_yaml_node_set_collection(node, collec); - result = 0; - } - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = contenu binaire à manipuler. * -* closure = adresse non utilisée ici. * -* * -* Description : Fournit une éventuelle collection rattachée à un noeud. * -* * -* Retour : Collection de noeuds Yaml ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_node_get_collection(PyObject *self, void *closure) -{ - PyObject *result; /* Instance à retourner */ - GYamlNode *node; /* Version GLib du noeud */ - GYamlCollection *collec; /* Collection à transmettre */ - -#define YAML_NODE_COLLECTION_ATTRIB PYTHON_GETSET_DEF_FULL \ -( \ - collection, py_yaml_node, \ - "Provide or define the collection of nodes attached to another Yaml node." \ -) - - node = G_YAML_NODE(pygobject_get(self)); - - collec = g_yaml_node_get_collection(node); - - if (collec == NULL) - { - result = Py_None; - Py_INCREF(result); - } - - else - { - result = pygobject_new(G_OBJECT(collec)); - g_object_unref(collec); - } - - return result; - -} - - -/****************************************************************************** -* * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * @@ -379,8 +208,6 @@ PyTypeObject *get_python_yaml_node_type(void) }; static PyGetSetDef py_yaml_node_getseters[] = { - YAML_NODE_YAML_LINE_ATTRIB, - YAML_NODE_COLLECTION_ATTRIB, { NULL } }; @@ -391,13 +218,13 @@ PyTypeObject *get_python_yaml_node_type(void) .tp_name = "pychrysalide.plugins.yaml.YamlNode", .tp_basicsize = sizeof(PyGObject), - .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_BASETYPE, .tp_doc = YAML_NODE_DOC, .tp_methods = py_yaml_node_methods, .tp_getset = py_yaml_node_getseters, - .tp_new = py_yaml_node_new + .tp_new = no_python_constructor_allowed }; |