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);
        }
Exemple #3
0
        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
            }));
        }
Exemple #4
0
        public static SketchDocument SketchDocument()
        {
            var document = new SketchDocument(Guid.NewGuid(), new List <SketchPage>
            {
                new SketchPage
                (
                    Guid.NewGuid(),
                    Frame,
                    "Symbols",
                    new List <SketchLayer>
                {
                }
                )
            }
                                              );

            return(document);
        }
Exemple #5
0
        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);
                }
            }
        }