/// <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); }
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); }
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); } }
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(); }); }
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); }
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"); }
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); } }
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); } }
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); }
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); }