/// <summary>
        /// Loads a user's schema file
        /// </summary>
        internal static TemplateSchema Load(IObjectReader objectReader)
        {
            var context = new TemplateContext
            {
                CancellationToken = CancellationToken.None,
                Errors            = new TemplateValidationErrors(maxErrors: 10, maxMessageLength: 500),
                Memory            = new TemplateMemory(
                    maxDepth: 50,
                    maxEvents: 1000000,     // 1 million
                    maxBytes: 1024 * 1024), // 1 mb
                TraceWriter = new EmptyTraceWriter(),
            };

            var value = TemplateReader.Read(context, TemplateConstants.TemplateSchema, objectReader, null, Schema, out _);

            if (context.Errors.Count > 0)
            {
                throw new TemplateValidationException(context.Errors);
            }

            var mapping = value.AssertMapping(TemplateConstants.TemplateSchema);
            var schema  = new TemplateSchema(mapping);

            schema.Validate();
            return(schema);
        }
Exemplo n.º 2
0
        public void Generate(IEnumerable <ClassDefinition> classDefinitions)
        {
            var classTemplate = TemplateReader.Read("ControllerTemplate.cs.txt");

            var addServiceCommands = new List <string>();

            foreach (var classDefinition in classDefinitions)
            {
                var domainObjectName = classDefinition.Name;
                var className        = domainObjectName + "Controller";

                classTemplate.TypeName = className;
                classTemplate.Set("[[DomainObjectName]]", domainObjectName);

                ProjectFileWriter.WriteToProject(
                    TargetFolderPath,
                    "WebApi",
                    "Controllers",
                    classTemplate);

                AppendAddServiceCommands(addServiceCommands, classDefinition);
            }

            GenerateStartupFile(addServiceCommands);
        }
Exemplo n.º 3
0
        public void Generate(IEnumerable <ClassDefinition> classDefinitions)
        {
            var interfaceTemplate = TemplateReader.Read("IServiceTemplate.cs.txt");
            var classTemplate     = TemplateReader.Read("ServiceTemplate.cs.txt");

            foreach (var classDefinition in classDefinitions)
            {
                var domainObjectName = classDefinition.Name;
                var className        = domainObjectName + "Service";
                var interfaceName    = "I" + className;

                interfaceTemplate.TypeName = interfaceName;
                interfaceTemplate.Set("[[DomainObjectName]]", domainObjectName);

                ProjectFileWriter.WriteToProject(
                    TargetFolderPath,
                    "Services",
                    null,
                    interfaceTemplate);

                classTemplate.TypeName = className;
                classTemplate.Set("[[DomainObjectName]]", domainObjectName);

                ProjectFileWriter.WriteToProject(
                    TargetFolderPath,
                    "Services",
                    null,
                    classTemplate);
            }
        }
Exemplo n.º 4
0
        public void ReadTemplateTest_NoBaseTroopError()
        {
            string contents = File.ReadAllText(flyingMonkeyJson);

            //Setup base monkey troop
            TroopReader    troopReader = new TroopReader();
            TemplateReader reader      = new TemplateReader(contents, troopReader.TroopTypes);

            Assert.Throws <InvalidOperationException>(() =>
            {
                TroopType flyingMonkey = reader.Read();
            });
        }
Exemplo n.º 5
0
        private void GenerateStartupFile(List <string> addServiceCommands)
        {
            var startupTemplate = TemplateReader.Read("StartupTemplate.cs.txt");

            var startupLineSeparator = Environment.NewLine + "                ";

            var addServiceCommandString = string.Join(startupLineSeparator, addServiceCommands);

            startupTemplate.TypeName = "Startup";
            startupTemplate.Set("[[AddServiceCommands]]", addServiceCommandString);

            ProjectFileWriter.WriteToProject(
                TargetFolderPath,
                "WebApi",
                null,
                startupTemplate);
        }
Exemplo n.º 6
0
        public void ReadTemplateTest_Valid()
        {
            string monkeyData = File.ReadAllText(monkeyJson);
            string contents   = File.ReadAllText(flyingMonkeyJson);

            //Setup base monkey troop
            TroopReader troopReader = new TroopReader();

            troopReader.AddJson(monkeyData);
            TroopType monkey = troopReader.TroopTypes["Monkey"];


            TemplateReader reader       = new TemplateReader(contents, troopReader.TroopTypes);
            TroopType      flyingMonkey = reader.Read();

            Assert.AreEqual(flyingMonkey.Damage, monkey.Damage);
            Assert.AreEqual(flyingMonkey.Health, monkey.Health);
            Assert.AreEqual(flyingMonkey.Type, "Air");
            Assert.AreEqual(flyingMonkey.PreferredTarget, "Air");
        }
Exemplo n.º 7
0
        public void Generate(IEnumerable <ClassDefinition> classDefinitions)
        {
            var template = TemplateReader.Read("ViewModelTemplate.cs.txt");

            foreach (var classDefinition in classDefinitions)
            {
                var propertiesString = CreatePropertiesString(classDefinition.Properties);

                var viewModelClassName = classDefinition.Name + "ViewModel";

                template.TypeName = viewModelClassName;
                template.Set("[[ClassName]]", viewModelClassName);
                template.Set("[[Properties]]", propertiesString);

                ProjectFileWriter.WriteToProject(
                    TargetFolderPath,
                    "ViewModels",
                    null,
                    template);
            }
        }
Exemplo n.º 8
0
        public void Generate(IEnumerable <ClassDefinition> classDefinitions)
        {
            var interfaceTemplate = TemplateReader.Read("IMapTemplate.cs.txt");
            var classTemplate     = TemplateReader.Read("MapTemplate.cs.txt");

            foreach (var classDefinition in classDefinitions)
            {
                var domainObjectName = classDefinition.Name;
                var className        = domainObjectName + "Map";
                var interfaceName    = "I" + className;

                interfaceTemplate.TypeName = interfaceName;
                interfaceTemplate.Set("[[DomainObjectName]]", domainObjectName);

                ProjectFileWriter.WriteToProject(
                    TargetFolderPath,
                    "Services",
                    null,
                    interfaceTemplate);

                classTemplate.TypeName = className;
                classTemplate.Set("[[DomainObjectName]]", domainObjectName);
                classTemplate.Set(
                    "[[DomainToViewModelMappings]]",
                    GenerateMappingString("domain", "viewModel", classDefinition.Properties));
                classTemplate.Set(
                    "[[ViewModelToDomainMappings]]",
                    GenerateMappingString("viewModel", "domain", classDefinition.Properties));

                ProjectFileWriter.WriteToProject(
                    TargetFolderPath,
                    "Services",
                    null,
                    classTemplate);
            }
        }
Exemplo n.º 9
0
        public ActionDefinitionData Load(IExecutionContext executionContext, string manifestFile)
        {
            var templateContext = CreateContext(executionContext);
            ActionDefinitionData actionDefinition = new ActionDefinitionData();

            // Clean up file name real quick
            // Instead of using Regex which can be computationally expensive,
            // we can just remove the # of characters from the fileName according to the length of the basePath
            string basePath         = HostContext.GetDirectory(WellKnownDirectory.Actions);
            string fileRelativePath = manifestFile;

            if (manifestFile.Contains(basePath))
            {
                fileRelativePath = manifestFile.Remove(0, basePath.Length + 1);
            }

            try
            {
                var token = default(TemplateToken);

                // Get the file ID
                var fileId = templateContext.GetFileId(fileRelativePath);

                // Add this file to the FileTable in executionContext if it hasn't been added already
                // we use > since fileID is 1 indexed
                if (fileId > executionContext.FileTable.Count)
                {
                    executionContext.FileTable.Add(fileRelativePath);
                }

                // Read the file
                var fileContent = File.ReadAllText(manifestFile);
                using (var stringReader = new StringReader(fileContent))
                {
                    var yamlObjectReader = new YamlObjectReader(fileId, stringReader);
                    token = TemplateReader.Read(templateContext, "action-root", yamlObjectReader, fileId, out _);
                }

                var actionMapping       = token.AssertMapping("action manifest root");
                var actionOutputs       = default(MappingToken);
                var actionRunValueToken = default(TemplateToken);

                foreach (var actionPair in actionMapping)
                {
                    var propertyName = actionPair.Key.AssertString($"action.yml property key");

                    switch (propertyName.Value)
                    {
                    case "name":
                        actionDefinition.Name = actionPair.Value.AssertString("name").Value;
                        break;

                    case "outputs":
                        if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA")))
                        {
                            actionOutputs = actionPair.Value.AssertMapping("outputs");
                            break;
                        }
                        Trace.Info($"Ignore action property outputs. Outputs for a whole action is not supported yet.");
                        break;

                    case "description":
                        actionDefinition.Description = actionPair.Value.AssertString("description").Value;
                        break;

                    case "inputs":
                        ConvertInputs(templateContext, actionPair.Value, actionDefinition);
                        break;

                    case "runs":
                        // Defer runs token evaluation to after for loop to ensure that order of outputs doesn't matter.
                        actionRunValueToken = actionPair.Value;
                        break;

                    default:
                        Trace.Info($"Ignore action property {propertyName}.");
                        break;
                    }
                }

                // Evaluate Runs Last
                if (actionRunValueToken != null)
                {
                    actionDefinition.Execution = ConvertRuns(executionContext, templateContext, actionRunValueToken, actionOutputs);
                }
            }
            catch (Exception ex)
            {
                Trace.Error(ex);
                templateContext.Errors.Add(ex);
            }

            if (templateContext.Errors.Count > 0)
            {
                foreach (var error in templateContext.Errors)
                {
                    Trace.Error($"Action.yml load error: {error.Message}");
                    executionContext.Error(error.Message);
                }

                throw new ArgumentException($"Fail to load {fileRelativePath}");
            }

            if (actionDefinition.Execution == null)
            {
                executionContext.Debug($"Loaded action.yml file: {StringUtil.ConvertToJson(actionDefinition)}");
                throw new ArgumentException($"Top level 'runs:' section is required for {fileRelativePath}");
            }
            else
            {
                Trace.Info($"Loaded action.yml file: {StringUtil.ConvertToJson(actionDefinition)}");
            }

            return(actionDefinition);
        }
Exemplo n.º 10
0
        public ActionDefinitionData Load(IExecutionContext executionContext, string manifestFile)
        {
            var context = CreateContext(executionContext, null);
            ActionDefinitionData actionDefinition = new ActionDefinitionData();

            try
            {
                var token = default(TemplateToken);

                // Get the file ID
                var fileId      = context.GetFileId(manifestFile);
                var fileContent = File.ReadAllText(manifestFile);
                using (var stringReader = new StringReader(fileContent))
                {
                    var yamlObjectReader = new YamlObjectReader(null, stringReader);
                    token = TemplateReader.Read(context, "action-root", yamlObjectReader, fileId, out _);
                }

                var actionMapping = token.AssertMapping("action manifest root");
                foreach (var actionPair in actionMapping)
                {
                    var propertyName = actionPair.Key.AssertString($"action.yml property key");

                    switch (propertyName.Value)
                    {
                    case "name":
                        actionDefinition.Name = actionPair.Value.AssertString("name").Value;
                        break;

                    case "description":
                        actionDefinition.Description = actionPair.Value.AssertString("description").Value;
                        break;

                    case "inputs":
                        ConvertInputs(context, actionPair.Value, actionDefinition);
                        break;

                    case "runs":
                        actionDefinition.Execution = ConvertRuns(context, actionPair.Value);
                        break;

                    default:
                        Trace.Info($"Ignore action property {propertyName}.");
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Trace.Error(ex);
                context.Errors.Add(ex);
            }

            if (context.Errors.Count > 0)
            {
                foreach (var error in context.Errors)
                {
                    Trace.Error($"Action.yml load error: {error.Message}");
                    executionContext.Error(error.Message);
                }

                throw new ArgumentException($"Fail to load {manifestFile}");
            }

            if (actionDefinition.Execution == null)
            {
                executionContext.Debug($"Loaded action.yml file: {StringUtil.ConvertToJson(actionDefinition)}");
                throw new ArgumentException($"Top level 'run:' section is required for {manifestFile}");
            }
            else
            {
                Trace.Info($"Loaded action.yml file: {StringUtil.ConvertToJson(actionDefinition)}");
            }

            return(actionDefinition);
        }