public void WhenOneFileFailsParsing_ReportsErrorAndKeepsConverting() { var parser = Substitute.For <ISketchParser>(); var guid = Guid.NewGuid(); var sketchDocument = new SketchDocument(guid, new List <SketchPage>()); parser.Parse(Arg.Any <SketchArchive>()).Returns( _ => { throw new SketchParserException("Whenever I adjust my sail, I fail."); }, _ => sketchDocument); var builder = Substitute.For <IUxBuilder>(); var log = new MessageListLogger(); var converter = new Converter(parser, builder, log); //Just some arbitrary valid sketch files to make sure `Load` works var arrowSketch = Path.Combine(FilesDirectory, "Arrow.sketch"); var lineSketch = Path.Combine(FilesDirectory, "Line.sketch"); converter.Convert(new [] { arrowSketch, lineSketch }, TempDirectory); //Got error for the first file Assert.That(log.ErrorsAndWarnings().Count, Is.EqualTo(1)); Assert.That(log.ErrorsAndWarnings()[0], Does.Match("Arrow.sketch.*I fail")); //Called builder for the second file, and only that builder.ReceivedWithAnyArgs(1).Build(null, null); builder.Received(1).Build(sketchDocument, TempDirectory); }
public void WhenOneFileDoesntExist_ReportsErrorAndKeepsConverting() { var parser = Substitute.For <ISketchParser>(); var guid = Guid.NewGuid(); var sketchDocument = new SketchDocument(guid, new List <SketchPage>()); parser.Parse(Arg.Any <SketchArchive>()).Returns(_ => sketchDocument); var builder = Substitute.For <IUxBuilder>(); var log = new MessageListLogger(); var converter = new Converter(parser, builder, log); var doesntExist = Path.Combine(TempDirectory, "IDontExist.sketch"); var arrowSketch = Path.Combine(FilesDirectory, "Arrow.sketch"); converter.Convert(new[] { doesntExist, arrowSketch }, TempDirectory); //Got error for the first file Assert.That(log.ErrorsAndWarnings().Count, Is.EqualTo(1)); Assert.That(log.ErrorsAndWarnings()[0], Does.Match("Can't convert non-existing Sketch-file.*IDontExist.sketch")); //Called builder for the second file, and only that builder.ReceivedWithAnyArgs(1).Build(null, null); builder.Received(1).Build(sketchDocument, TempDirectory); }
public static SketchDocument WithSymbol(this SketchDocument document, SketchSymbolMaster symbol) { // Fixme just find the Symbols page Assert.That(document.Pages.Count == 1); Assert.That(document.Pages.First().Name == "Symbols"); var firstPage = document.Pages.First(); var newLayers = new List <SketchLayer>(firstPage.Layers) { symbol }; var newPage = new SketchPage(Guid.NewGuid(), firstPage.Frame, firstPage.Name, newLayers); return(new SketchDocument(document.Id, new List <SketchPage> { newPage })); }
public static SketchDocument SketchDocument() { var document = new SketchDocument(Guid.NewGuid(), new List <SketchPage> { new SketchPage ( Guid.NewGuid(), Frame, "Symbols", new List <SketchLayer> { } ) } ); return(document); }
public void Build(SketchDocument document, string outputDirectory) { var symbols = document .Pages .AsEnumerable() .SelectMany(page => page.Layers.OfType <SketchSymbolMaster>()); var symbolClassNameBuilder = new SymbolClassNameBuilder(); symbolClassNameBuilder.Init(symbols); var appNode = new UxNode { ClassName = "App" }; var pageControl = new UxNode { ClassName = "PageControl" }; appNode.Children.Add(pageControl); var artboards = document.Pages .AsEnumerable() .Reverse() .SelectMany(page => page.Layers .OfType <SketchArtboard>() .Reverse()); var builder = new UxBuilder(symbolClassNameBuilder, new AssetEmitter(outputDirectory, _log), _log); var pages = artboards.Select(builder.BuildPage); pageControl.Children.AddRange(pages); var serializerContext = new UxSerializerContext(); var ux = appNode.SerializeUx(serializerContext); var outputFilePath = Path.Combine(outputDirectory, "MainView.ux"); File.WriteAllText(outputFilePath, ux); }
public void Build(SketchDocument document, string outputDirectory) { var symbols = document .Pages .AsEnumerable() .SelectMany(page => page.Layers.OfType <SketchSymbolMaster>()) .Where(s => NameIsValidOrLog(s.Name)) .ToList(); //We don't actually need to remove duplicates, since the ux builder will overwrite symbols with the same name anyway. LogDuplicateSymbolNames(symbols); if (!symbols.Any()) { _log.Info("No UX generated because no Sketch symbols found in sketch file. Sketchy :)"); return; } var symbolClassNameBuilder = new SymbolClassNameBuilder(); symbolClassNameBuilder.Init(symbols); var builder = new UxBuilder(symbolClassNameBuilder, new AssetEmitter(outputDirectory, _log), _log); var serializerContext = new UxSerializerContext(); // write one file per uxClass foreach (var symbol in symbols) { try { var uxClass = builder.BuildSymbolClass(symbol); ApplyTransforms(uxClass); var ux = uxClass.SerializeUx(serializerContext); var className = uxClass.Attributes["ux:Class"] as UxString; if (className != null) { if (symbol.Layers.Any()) { var outputFilePath = Path.Combine(outputDirectory, className.Value + ".ux"); try { File.WriteAllText(outputFilePath, ux); _log.Info($"Wrote '{className.Value}' to '{outputFilePath}'"); } catch (Exception e) { _log.Error("Can't write file '" + outputFilePath + "' " + e.Message); } } else { _log.Warning($"Skipping symbol '{className.Value}' which has no supported layers."); } } else { _log.Error("Can't write file for ux:Class without name"); } } catch (Exception e) { _log.Error("Failed to convert '" + symbol.Name + "': " + e.Message); } } }