/bin/std/tools/haxelib/Datas.hx

http://github.com/Yoomee/clippy · Haxe · 150 lines · 132 code · 18 blank · 0 comment · 24 complexity · 951ad79e5bb1b445c37c63157acb926f MD5 · raw file

  1. package tools.haxelib;
  2. import neko.zip.Reader;
  3. import haxe.xml.Check;
  4. typedef UserInfos = {
  5. var name : String;
  6. var fullname : String;
  7. var email : String;
  8. var projects : Array<String>;
  9. }
  10. typedef VersionInfos = {
  11. var date : String;
  12. var name : String;
  13. var comments : String;
  14. }
  15. typedef ProjectInfos = {
  16. var name : String;
  17. var desc : String;
  18. var website : String;
  19. var owner : String;
  20. var license : String;
  21. var curversion : String;
  22. var versions : Array<VersionInfos>;
  23. var tags : List<String>;
  24. }
  25. typedef XmlInfos = {
  26. var project : String;
  27. var website : String;
  28. var desc : String;
  29. var license : String;
  30. var version : String;
  31. var versionComments : String;
  32. var developers : List<String>;
  33. var tags : List<String>;
  34. var dependencies : List<{ project : String, version : String }>;
  35. }
  36. class Datas {
  37. public static var XML = "haxelib.xml";
  38. public static var DOCXML = "haxedoc.xml";
  39. public static var REPOSITORY = "files";
  40. public static var alphanum = ~/^[A-Za-z0-9_.-]+$/;
  41. static var LICENSES = ["GPL","LGPL","BSD","Public"];
  42. static function requiredAttribute( x : Xml, name ) {
  43. var v = x.get(name);
  44. if( v == null )
  45. throw "Missing required attribute '"+name+"' in node "+x.nodeName;
  46. return v;
  47. }
  48. static function requiredNode( x : Xml, name ) {
  49. var v = x.elementsNamed(name).next();
  50. if( v == null )
  51. throw "Missing required node '"+name+"' in node "+x.nodeName;
  52. return v;
  53. }
  54. static function requiredText( x : Xml ) {
  55. var v = x.firstChild();
  56. if( v == null || (v.nodeType != Xml.PCData && v.nodeType != Xml.CData) )
  57. throw "Missing required text in node "+x.nodeName;
  58. return v.nodeValue;
  59. }
  60. public static function safe( name : String ) {
  61. if( !alphanum.match(name) )
  62. throw "Invalid parameter : "+name;
  63. return name.split(".").join(",");
  64. }
  65. public static function unsafe( name : String ) {
  66. return name.split(",").join(".");
  67. }
  68. public static function fileName( lib : String, ver : String ) {
  69. return safe(lib)+"-"+safe(ver)+".zip";
  70. }
  71. public static function readDoc( zip : List<ZipEntry> ) : String {
  72. for( f in zip )
  73. if( StringTools.endsWith(f.fileName,DOCXML) )
  74. return neko.zip.Reader.unzip(f).toString();
  75. return null;
  76. }
  77. public static function readInfos( zip : List<ZipEntry>, check : Bool ) : XmlInfos {
  78. var xmldata = null;
  79. for( f in zip )
  80. if( StringTools.endsWith(f.fileName,XML) ) {
  81. xmldata = neko.zip.Reader.unzip(f).toString();
  82. break;
  83. }
  84. if( xmldata == null )
  85. throw XML+" not found in package";
  86. return readData(xmldata,check);
  87. }
  88. static function doCheck( doc : Xml ) {
  89. var sname = Att("name",FReg(alphanum));
  90. var schema = RNode(
  91. "project",
  92. [ sname, Att("url"), Att("license",FEnum(LICENSES)) ],
  93. RList([
  94. RMulti( RNode("user",[sname]), true ),
  95. RMulti( RNode("tag",[Att("v",FReg(alphanum))]) ),
  96. RNode("description",[],RData()),
  97. RNode("version",[sname],RData()),
  98. RMulti( RNode("depends",[sname,Att("version",FReg(alphanum),"")]) ),
  99. ])
  100. );
  101. haxe.xml.Check.checkDocument(doc,schema);
  102. }
  103. public static function readData( xmldata : String, check : Bool ) : XmlInfos {
  104. var doc = Xml.parse(xmldata);
  105. if( check )
  106. doCheck(doc);
  107. var p = new haxe.xml.Fast(doc).node.project;
  108. var project = p.att.name;
  109. if( project.length < 3 )
  110. throw "Project name must contain at least 3 characters";
  111. var tags = new List();
  112. for( t in p.nodes.tag )
  113. tags.add(t.att.v.toLowerCase());
  114. var devs = new List();
  115. for( d in p.nodes.user )
  116. devs.add(d.att.name);
  117. var deps = new List();
  118. for( d in p.nodes.depends )
  119. deps.add({ project : d.att.name, version : if( d.has.version ) d.att.version else "" });
  120. return {
  121. project : project,
  122. website : p.att.url,
  123. desc : p.node.description.innerData,
  124. version : p.node.version.att.name,
  125. versionComments : p.node.version.innerData,
  126. license : p.att.license,
  127. tags : tags,
  128. developers : devs,
  129. dependencies : deps,
  130. }
  131. }
  132. }