diff --git a/README.md b/README.md index 56e07d8..7482569 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ So, currently the lib deal only with one yaml document (it's not recommended to but you can use a special `^imports` clause (special mapping node) to load a subset of yaml files in the main yaml document. -the lib does not manage yet tag directives and tag values (planned). +The lib partially manage tag directives and tag values (basic types and Yaml.Object extended objects types). + **pluie-yaml** use the ![libyaml c library](https://github.com/yaml/libyaml) (License MIT, many thanks to Kirill Simonov) to parse and retriew related yaml events. ![pluie-yaml](https://www.meta-tech.academy/img/pluie-yaml-imports2.png) @@ -237,6 +238,55 @@ or ------------------- +### Tag Directives & Tag values + +an example is available with `samples/yaml-tag.vala` sample +and `resources/tag.yml` file + +on yaml side, proceed like that : + +```yaml +%YAML 1.2 +%TAG !v! tag:pluie.org,2018:vala/ +--- +!v!Pluie.Yaml.Example test1 : + myname : test1object + type_int : !v!int 3306 + type_bool : !v!bool false + type_char : !v!char c + type_string : !v!string mystring1 + type_uchar : !v!uchar L + type_uint : !v!uint 62005 + type_float : !v!float 42.36 + type_double : !v!double 95542123.4579512128 + !v!Pluie.Yaml.SubExample type_object : + toto : totovalue1 + tata : tatavalue1 + titi : 123 + tutu : 1 +``` + +on vala side : + +```vala + ... + Yaml.Example obj = (Yaml.Example) Yaml.Object.from_node (root.first ()); + of.echo("obj.type_int : %d".printf (o.type_int)); + obj.type_object.method_a () +``` + +![pluie-yaml-tag](https://www.meta-tech.academy/img/libyaml-tag-ex.png) + +code from samples/yaml-tag.vala : + +![pluie-yaml-tag](https://www.meta-tech.academy/img/libyaml-tag-code.png) + +output from samples/yaml-tag.vala : + +![pluie-yaml-tag](https://www.meta-tech.academy/img/libyaml-tag-ex2.png) + +------------------- + ### more samples see samples files in ./samples directory @@ -250,6 +300,6 @@ see samples files in ./samples directory * ~~rewrite nodes classes~~ * ~~put doc online~~ * ~~add docker image~~ -* manage tag directives & tag +* manage tag directives & tag (partially done) * improve doc * dumper diff --git a/meson.build b/meson.build index d029313..ad867d9 100644 --- a/meson.build +++ b/meson.build @@ -74,9 +74,11 @@ sources = [ 'src/vala/Pluie/Yaml.Node.vala', 'src/vala/Pluie/Yaml.Object.vala', 'src/vala/Pluie/Yaml.Processor.vala', + 'src/vala/Pluie/Yaml.Root.vala', 'src/vala/Pluie/Yaml.Scalar.vala', 'src/vala/Pluie/Yaml.Scanner.vala', 'src/vala/Pluie/Yaml.Sequence.vala', + 'src/vala/Pluie/Yaml.SubExample.vala', 'src/vala/Pluie/Yaml.Tag.vala', 'src/c/yaml.c' ] diff --git a/resources/tag.yml b/resources/tag.yml index 4d75f70..10e11a2 100644 --- a/resources/tag.yml +++ b/resources/tag.yml @@ -3,7 +3,7 @@ %TAG !v! tag:pluie.org,2018:vala/ --- !v!Pluie.Yaml.Example test1 : - + myname : test1object type_int : !v!int 3306 type_bool : !v!bool false type_char : !v!char c @@ -12,14 +12,24 @@ type_uint : !v!uint 62005 type_float : !v!float 42.36 type_double : !v!double 95542123.4579512128 + !v!Pluie.Yaml.SubExample type_object : + toto : totovalue1 + tata : tatavalue1 + titi : 123 + tutu : 1 !v!Pluie.Yaml.Example test2 : - - type_int : !v!int 3306 - type_bool : !v!bool true - type_char : !v!char g - type_string : !v!string mystring2 - type_uchar : !v!uchar Y - type_uint : !v!uint 63005 - type_float : !v!float 5.28 - type_double : !v!double 9.28 + myname : test2object + type_int : 3306 + type_bool : "true" + type_char : g + type_string : mystring2 + type_uchar : Y + type_uint : 63005 + type_float : 5.28 + type_double : 9.28 + !v!Pluie.Yaml.SubExample type_object : + toto : totovalue2 + tata : tatavalue2 + titi : !v!int 456 + tutu : !v!bool TRUE diff --git a/samples/yaml-tag.vala b/samples/yaml-tag.vala index 0f82755..20cbb1e 100644 --- a/samples/yaml-tag.vala +++ b/samples/yaml-tag.vala @@ -59,12 +59,11 @@ int main (string[] args) node = node.next_sibling (); } } - of.echo (""); // hard code - Yaml.Example? o = new Pluie.Yaml.Example (); + Yaml.Example? o = null; foreach (var entry in list.entries) { - of.action ("Getting Hard coded values for Yaml.Object %s".printf (of.c (ECHO.MICROTIME).s (o.type_from_self ())), entry.key); - if ((o = entry.value as Yaml.Example)!=null) { + if ((o = (Yaml.Example) entry.value)!=null) { + of.action ("Getting Hard coded values for Yaml.Object %s".printf (of.c (ECHO.MICROTIME).s (o.type_from_self ())), entry.key); of.keyval("type_int" , "%d" .printf(o.type_int)); of.keyval("type_bool" , "%s" .printf(o.type_bool.to_string ())); of.keyval("type_char" , "%c" .printf(o.type_char)); @@ -72,6 +71,12 @@ int main (string[] args) of.keyval("type_uchar" , "%u" .printf(o.type_uchar)); of.keyval("type_float" , "%f" .printf(o.type_float)); of.keyval("type_double", "%f" .printf(o.type_double)); + of.keyval("type_object", "%s" .printf(o.type_object.get_type ().name ())); + of.keyval(" toto (string)", "%s" .printf(o.type_object.toto)); + of.keyval(" tapa (string)", "%s" .printf(o.type_object.tata)); + of.keyval(" titi (int)" , "%d" .printf(o.type_object.titi)); + of.keyval(" tutu (bool)" , "%s" .printf(o.type_object.tutu.to_string ())); + o.type_object.method_a (); } } diff --git a/src/vala/Pluie/Yaml.AbstractNode.vala b/src/vala/Pluie/Yaml.AbstractNode.vala index fc3f987..2f925fd 100644 --- a/src/vala/Pluie/Yaml.AbstractNode.vala +++ b/src/vala/Pluie/Yaml.AbstractNode.vala @@ -88,7 +88,17 @@ public abstract class Pluie.Yaml.AbstractNode : GLib.Object return node != null && node.uuid == this.uuid; } - public virtual string to_string (bool withIndent = Yaml.DBG_SHOW_INDENT, bool withParent = Yaml.DBG_SHOW_PARENT, bool withUuid = Yaml.DBG_SHOW_UUID, bool withLevel = Yaml.DBG_SHOW_LEVEL, bool withCount = Yaml.DBG_SHOW_COUNT, bool withRefCount = Yaml.DBG_SHOW_REF){ + public virtual string to_string ( + bool withIndent = Yaml.DBG_SHOW_INDENT, + bool withParent = Yaml.DBG_SHOW_PARENT, + bool withUuid = Yaml.DBG_SHOW_UUID, + bool withLevel = Yaml.DBG_SHOW_LEVEL, + bool withCount = Yaml.DBG_SHOW_COUNT, + bool withRefCount = Yaml.DBG_SHOW_REF, + bool withTag = Yaml.DBG_SHOW_TAG, + bool withType = Yaml.DBG_SHOW_TYPE + ) + { return ""; } diff --git a/src/vala/Pluie/Yaml.Example.vala b/src/vala/Pluie/Yaml.Example.vala index be3aac6..15d77c3 100644 --- a/src/vala/Pluie/Yaml.Example.vala +++ b/src/vala/Pluie/Yaml.Example.vala @@ -33,28 +33,39 @@ */ public class Pluie.Yaml.Example : Yaml.Object { - public string type_string { get; set; } - public int type_int { get; set; } - public uint type_uint { get; set; } - public float type_float { get; set; } - public double type_double { get; set; } - public char type_char { get; set; } - public uchar type_uchar { get; set; } - public unichar type_unichar { get; set; } - public short type_short { get; set; } - public ushort type_ushort { get; set; } - public long type_long { get; set; } - public ulong type_ulong { get; set; } - public size_t type_size_t { get; set; } - public ssize_t type_ssize_t { get; set; } - public int8 type_int8 { get; set; } - public uint8 type_uint8 { get; set; } - public int16 type_int16 { get; set; } - public uint16 type_uint16 { get; set; } - public int32 type_int32 { get; set; } - public uint32 type_uint32 { get; set; } - public int64 type_int64 { get; set; } - public uint64 type_uint64 { get; set; } - public bool type_bool { get; set; } + public string myname { get; set; } + public string type_string { get; set; } + public int type_int { get; set; } + public uint type_uint { get; set; } + public float type_float { get; set; } + public double type_double { get; set; } + public char type_char { get; set; } + public uchar type_uchar { get; set; } + public unichar type_unichar { get; set; } + public short type_short { get; set; } + public ushort type_ushort { get; set; } + public long type_long { get; set; } + public ulong type_ulong { get; set; } + public size_t type_size_t { get; set; } + public ssize_t type_ssize_t { get; set; } + public int8 type_int8 { get; set; } + public uint8 type_uint8 { get; set; } + public int16 type_int16 { get; set; } + public uint16 type_uint16 { get; set; } + public int32 type_int32 { get; set; } + public uint32 type_uint32 { get; set; } + public int64 type_int64 { get; set; } + public uint64 type_uint64 { get; set; } + public bool type_bool { get; set; } + public Yaml.SubExample type_object { get; set; } + + /** + * + */ + protected override void yaml_init () + { + // base.yaml_init (); + Dbg.msg ("Yaml.Object %s (%s) instantiated".printf (this.myname, this.type_from_self ()), Log.LINE, Log.FILE); + } } diff --git a/src/vala/Pluie/Yaml.Mapping.vala b/src/vala/Pluie/Yaml.Mapping.vala index bafeb71..a4a6381 100644 --- a/src/vala/Pluie/Yaml.Mapping.vala +++ b/src/vala/Pluie/Yaml.Mapping.vala @@ -55,7 +55,7 @@ public class Pluie.Yaml.Mapping : Yaml.Node */ public Mapping.with_scalar (Yaml.Node? parent = null, string? name = null, string? data = null) { - base (parent, NODE_TYPE.MAPPING, name); + base (parent, NODE_TYPE.SINGLE_PAIR, name); var s = new Scalar (null, data); this.add (s); } @@ -90,6 +90,9 @@ public class Pluie.Yaml.Mapping : Yaml.Node { base.on_added (child); if (this.keys != null) { + if (!this.ntype.is_single_pair () && this.keys.size == 0 && child.ntype.is_scalar ()) { + this.ntype = Yaml.NODE_TYPE.SINGLE_PAIR; + } this.keys.add(child.name); } } diff --git a/src/vala/Pluie/Yaml.Node.vala b/src/vala/Pluie/Yaml.Node.vala index 916703a..a1766e0 100644 --- a/src/vala/Pluie/Yaml.Node.vala +++ b/src/vala/Pluie/Yaml.Node.vala @@ -259,6 +259,7 @@ public class Pluie.Yaml.Node : Yaml.AbstractChild, Pluie.Yaml.Collection { if (withTitle) { of.action ("display_childs", this.name); + of.echo (""); } of.echo (this.to_string ()); if (!this.empty ()) { @@ -271,13 +272,22 @@ public class Pluie.Yaml.Node : Yaml.AbstractChild, Pluie.Yaml.Collection /** * get a presentation string of current Yaml.Node */ - public override string to_string (bool withIndent = Yaml.DBG_SHOW_INDENT, bool withParent = Yaml.DBG_SHOW_PARENT, bool withUuid = Yaml.DBG_SHOW_UUID, bool withLevel = Yaml.DBG_SHOW_LEVEL, bool withCount = Yaml.DBG_SHOW_COUNT, bool withRefCount = Yaml.DBG_SHOW_REF) + public override string to_string ( + bool withIndent = Yaml.DBG_SHOW_INDENT, + bool withParent = Yaml.DBG_SHOW_PARENT, + bool withUuid = Yaml.DBG_SHOW_UUID, + bool withLevel = Yaml.DBG_SHOW_LEVEL, + bool withCount = Yaml.DBG_SHOW_COUNT, + bool withRefCount = Yaml.DBG_SHOW_REF, + bool withTag = Yaml.DBG_SHOW_TAG, + bool withType = Yaml.DBG_SHOW_TYPE + ) { - return "%s%s%s%s%s%s%s%s%s%s".printf ( + return "%s%s%s%s%s%s%s%s%s%s%s".printf ( this.level == 0 ? "" : of.s_indent ((int8) (withIndent ? (this.level-1)*4 : 0)), of.c (ECHO.OPTION).s ("["), this.name != null && !this.ntype.is_scalar () - ? of.c (ECHO.TIME).s ("%s".printf (this.name)) + ? of.c (ntype.is_root () ? ECHO.MICROTIME : ECHO.TIME).s ("%s".printf (this.name)) : ( this.ntype.is_scalar () ? of.c(ECHO.DATE).s ("%s".printf (this.data)) @@ -285,18 +295,21 @@ public class Pluie.Yaml.Node : Yaml.AbstractChild, Pluie.Yaml.Collection ), withRefCount ? of.c (ECHO.COMMAND).s ("[%lu]".printf (this.ref_count)) : "", !withParent || this.parent == null - ? "" + ? withLevel ? of.c (ECHO.NUM).s (" %d".printf (this.level)) : "" : of.c (ECHO.SECTION).s (" "+this.parent.name)+( withLevel ? of.c (ECHO.NUM).s (" %d".printf (this.level)) : " " ), - of.c (ECHO.OPTION_SEP).s (" %s".printf( - !this.ntype.is_mapping () || this.count () >= 1 && !this.first().ntype.is_scalar () ? this.ntype.infos () : NODE_TYPE.SINGLE_PAIR.infos () - )), - withCount ? of.c (ECHO.MICROTIME).s (" %d".printf(this.count ())) : "", + withType ? of.c (ECHO.OPTION_SEP).s (" %s".printf(this.ntype.infos ())) : "", + withCount && this.ntype.is_collection () ? of.c (ECHO.MICROTIME).s (" %d".printf(this.count ())) : "", withUuid ? of.c (ECHO.COMMENT).s (" %s".printf(this.uuid[0:8]+"...")) : "", - this.tag != null ? of.c (ECHO.OPTION_SEP).s (" %s".printf(this.tag.@value)) : "", -//~ of.c (ECHO.NUM).s ("%d".printf (this.level)), - of.c (ECHO.OPTION).s ("]") + this.tag != null && withTag + ? " %s%s".printf ( + of.c (ECHO.TITLE).s (" %s ".printf(this.tag.handle)), + of.c (ECHO.DEFAULT).s (" %s".printf(this.tag.value)) + ) + : "", + of.c (ECHO.OPTION).s ("]"), + withTag && this.ntype.is_root () ? (this as Yaml.Root).get_display_tag_directives () : "" ); } } diff --git a/src/vala/Pluie/Yaml.Object.vala b/src/vala/Pluie/Yaml.Object.vala index 0819796..bcf3365 100644 --- a/src/vala/Pluie/Yaml.Object.vala +++ b/src/vala/Pluie/Yaml.Object.vala @@ -34,8 +34,19 @@ using Gee; */ public abstract class Pluie.Yaml.Object : GLib.Object { + /** + * + */ private static GLib.Module? p_module; + /** + * + */ + public virtual void yaml_init () + { + Dbg.msg ("Yaml.Object (%s) instantiated".printf (this.type_from_self ()), Log.LINE, Log.FILE); + } + /** * */ @@ -135,18 +146,18 @@ public abstract class Pluie.Yaml.Object : GLib.Object if (Yaml.Scanner.DEBUG) of.echo ("object type founded : %s".printf (type.to_string ())); obj = (Yaml.Object) GLib.Object.new (type); if (node!= null && !node.empty ()) { - GLib.ParamSpec? def = null; - Yaml.Node? snode = null; + GLib.ParamSpec? def = null; + Yaml.Node? scalar = null; foreach (var child in node) { if ((def = obj.get_class ().find_property (child.name)) != null) { - if ((snode = child.first ()) != null) { - if (snode.tag != null) { - obj.set_from_scalar (def.name, def.value_type, snode); - } - else { - obj.set (child.name, snode.data); + if (child.ntype.is_single_pair ()) { + if ((scalar = child.first ()) != null) { + obj.set_from_scalar (def.name, def.value_type, scalar); } } + else if (child.ntype.is_mapping ()) { + obj.set (child.name, from_node(child)); + } } } } @@ -159,6 +170,7 @@ public abstract class Pluie.Yaml.Object : GLib.Object catch (GLib.Error e) { of.warn (e.message); } + obj.yaml_init (); return obj; } @@ -185,7 +197,7 @@ public abstract class Pluie.Yaml.Object : GLib.Object v.set_uchar((uint8)data.data[0]); break; case Type.BOOLEAN : - v.set_boolean (bool.parse(data.down ())); + v.set_boolean (data == "1" || data.down () == "true"); break; case Type.INT : v.set_int(int.parse(data)); diff --git a/src/vala/Pluie/Yaml.Processor.vala b/src/vala/Pluie/Yaml.Processor.vala index 15df154..d1614aa 100644 --- a/src/vala/Pluie/Yaml.Processor.vala +++ b/src/vala/Pluie/Yaml.Processor.vala @@ -86,11 +86,6 @@ public class Pluie.Yaml.Processor */ Gee.HashMap anchors { get; internal set; } - /** - * Tags map definition - */ - Gee.HashMap tags { get; internal set; } - /** * Error event */ @@ -104,7 +99,7 @@ public class Pluie.Yaml.Processor /** * the root Yaml.Node */ - public Yaml.Node root; + public Yaml.Root root; /** * current previous Yaml.Node @@ -133,7 +128,6 @@ public class Pluie.Yaml.Processor { this.events = new Gee.ArrayList(); this.anchors = new Gee.HashMap(); - this.tags = new Gee.HashMap(); } /** @@ -214,8 +208,7 @@ public class Pluie.Yaml.Processor */ private void reset () { - this.root = new Yaml.Mapping (null, "PluieYamlRoot"); - this.root.ntype = Yaml.NODE_TYPE.ROOT; + this.root = new Yaml.Root (); this.prev_node = this.root; this.parent_node = this.root; this.iterator = this.events.iterator (); @@ -273,7 +266,7 @@ public class Pluie.Yaml.Processor { if (Yaml.Scanner.DEBUG) of.action ("on_tag_directive %s".printf (this.event.data["handle"]), this.event.data["prefix"]); - this.tags[this.event.data["handle"]] = this.event.data["prefix"]; + this.root.tag_directives[this.event.data["handle"]] = this.event.data["prefix"]; } /** @@ -318,8 +311,8 @@ public class Pluie.Yaml.Processor if (this.event.evtype.is_tag ()) { if (Yaml.Scanner.DEBUG) of.keyval ("tag %s".printf (this.event.data["handle"]), this.event.data["suffix"]); - if (this.tags.has_key (this.event.data["handle"])) { - var tag = new Yaml.Tag (this.event.data["suffix"], this.tags[this.event.data["handle"]]); + if (this.root.tag_directives.has_key (this.event.data["handle"])) { + var tag = new Yaml.Tag (this.event.data["suffix"], this.event.data["handle"].replace("!", "")); if (onKey) this.keyTag = tag; else diff --git a/src/vala/Pluie/Yaml.Root.vala b/src/vala/Pluie/Yaml.Root.vala new file mode 100644 index 0000000..b71d0d3 --- /dev/null +++ b/src/vala/Pluie/Yaml.Root.vala @@ -0,0 +1,72 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * @software : lib-yaml + * @version : 0.4 + * @date : 2018 + * @licence : GPLv3.0 + * @author : a-Sansara <[dev]at[pluie]dot[org]> + * @copyright : pluie.org + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * This file is part of lib-yaml. + * + * lib-yaml is free software (free as in speech) : you can redistribute it + * and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * lib-yaml is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with lib-yaml. If not, see . + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + */ + +using GLib; +using Pluie; +using Gee; + +/** + * a class representing a mapping node + */ +public class Pluie.Yaml.Root : Yaml.Mapping +{ + /** + * Tags map definition + */ + public Gee.HashMap tag_directives { get; internal set; } + + /** + * + */ + public Root (string? name = "PluieYamlRoot") + { + base (null, name); + this.ntype = Yaml.NODE_TYPE.ROOT; + this.tag_directives = new Gee.HashMap (); + } + + /** + * + */ + public string get_display_tag_directives () + { + var sb = new StringBuilder(); + foreach (var entry in this.tag_directives.entries) { + int len = 10 - entry.key.length -2; + var str = " %TAG "+@" %$(len)s"+" %s %s"; + sb.append ( + "\n %s %s".printf ( + of.c(ECHO.TITLE).s (str.printf (" ", entry.key.replace("!", ""), Color.off ())), + of.c (ECHO.DEFAULT).s (entry.value)) + ); + } + return sb.str; + } + +} diff --git a/src/vala/Pluie/Yaml.SubExample.vala b/src/vala/Pluie/Yaml.SubExample.vala new file mode 100644 index 0000000..3de037b --- /dev/null +++ b/src/vala/Pluie/Yaml.SubExample.vala @@ -0,0 +1,45 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * @software : lib-yaml + * @version : 0.4 + * @date : 2018 + * @licence : GPLv3.0 + * @author : a-Sansara <[dev]at[pluie]dot[org]> + * @copyright : pluie.org + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * This file is part of lib-yaml. + * + * lib-yaml is free software (free as in speech) : you can redistribute it + * and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * lib-yaml is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with lib-yaml. If not, see . + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + */ + +/** + * a test class to implements yamlize + + */ +public class Pluie.Yaml.SubExample : Yaml.Object +{ + public string toto { get; set; } + public string tata { get; set; } + public int titi { get; set; } + public bool tutu { get; set; } + + public void method_a () + { + of.echo (" called method from object %s builded via yaml".printf (this.type_from_self ())); + } +} diff --git a/src/vala/Pluie/Yaml.global.vala b/src/vala/Pluie/Yaml.global.vala index af7ab3b..84e865e 100644 --- a/src/vala/Pluie/Yaml.global.vala +++ b/src/vala/Pluie/Yaml.global.vala @@ -32,11 +32,13 @@ namespace Pluie namespace Yaml { public static bool DBG_SHOW_INDENT = true; - public static bool DBG_SHOW_PARENT = true; + public static bool DBG_SHOW_PARENT = false; public static bool DBG_SHOW_UUID = true; - public static bool DBG_SHOW_LEVEL = true; - public static bool DBG_SHOW_REF = true; + public static bool DBG_SHOW_LEVEL = false; + public static bool DBG_SHOW_REF = false; public static bool DBG_SHOW_COUNT = true; + public static bool DBG_SHOW_TAG = true; + public static bool DBG_SHOW_TYPE = true; /** * ParseError