Datas.hx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. }
  24. typedef XmlInfos = {
  25. var project : String;
  26. var website : String;
  27. var desc : String;
  28. var license : String;
  29. var version : String;
  30. var versionComments : String;
  31. var developers : List<String>;
  32. var dependencies : List<{ project : String, version : String }>;
  33. }
  34. class Datas {
  35. public static var XML = "haxelib.xml";
  36. public static var REPOSITORY = "files";
  37. public static var alphanum = ~/^[A-Za-z0-9_.-]+$/;
  38. static var LICENSES = ["GPL","LGPL","BSD","Public"];
  39. static function requiredAttribute( x : Xml, name ) {
  40. var v = x.get(name);
  41. if( v == null )
  42. throw "Missing required attribute '"+name+"' in node "+x.nodeName;
  43. return v;
  44. }
  45. static function requiredNode( x : Xml, name ) {
  46. var v = x.elementsNamed(name).next();
  47. if( v == null )
  48. throw "Missing required node '"+name+"' in node "+x.nodeName;
  49. return v;
  50. }
  51. static function requiredText( x : Xml ) {
  52. var v = x.firstChild();
  53. if( v == null || (v.nodeType != Xml.PCData && v.nodeType != Xml.CData) )
  54. throw "Missing required text in node "+x.nodeName;
  55. return v.nodeValue;
  56. }
  57. public static function safe( name : String ) {
  58. if( !alphanum.match(name) )
  59. throw "Invalid parameter : "+name;
  60. return name.split(".").join(",");
  61. }
  62. public static function unsafe( name : String ) {
  63. return name.split(",").join(".");
  64. }
  65. public static function fileName( lib : String, ver : String ) {
  66. return safe(lib)+"-"+safe(ver)+".zip";
  67. }
  68. public static function readInfos( zip : List<ZipEntry> ) : XmlInfos {
  69. var xmldata = null;
  70. for( f in zip )
  71. if( StringTools.endsWith(f.fileName,XML) ) {
  72. xmldata = neko.zip.Reader.unzip(f).toString();
  73. break;
  74. }
  75. if( xmldata == null )
  76. throw XML+" not found in package";
  77. return readData(xmldata);
  78. }
  79. public static function readData( xmldata : String ) : XmlInfos {
  80. var sname = Att("name",FReg(alphanum));
  81. var schema = RNode(
  82. "project",
  83. [ sname, Att("url"), Att("license",FEnum(LICENSES)) ],
  84. RList([
  85. RMulti( RNode("user",[sname]), true ),
  86. RNode("description",[],RData()),
  87. RNode("version",[sname],RData()),
  88. RMulti( RNode("depends",[sname,Att("version",FReg(alphanum),"")]) ),
  89. ])
  90. );
  91. var doc = Xml.parse(xmldata);
  92. haxe.xml.Check.checkDocument(doc,schema);
  93. var p = new haxe.xml.Fast(doc).node.project;
  94. var project = p.att.name;
  95. if( project.length < 3 )
  96. throw "Project name must contain at least 3 characters";
  97. var devs = new List();
  98. for( d in p.nodes.user )
  99. devs.add(d.att.name);
  100. var deps = new List();
  101. for( d in p.nodes.depends )
  102. deps.add({ project : d.att.name, version : d.att.version });
  103. return {
  104. project : project,
  105. website : p.att.url,
  106. desc : p.node.description.innerData,
  107. version : p.node.version.att.name,
  108. versionComments : p.node.version.innerData,
  109. license : p.att.license,
  110. developers : devs,
  111. dependencies : deps,
  112. }
  113. }
  114. }