public static string ProductRequirement(this IUrlHelper urlHelper, ProductRequirement productRequirement) { var url = $"/requirements/{productRequirement.NumberFullyQualified}"; if (urlHelper == null) { return(url); } return(urlHelper.Content($"~{url}")); }
public ProductRequirement ParseProductRequirement(string content) { var yaml = _yamlParser.ParseYaml(content); if (yaml.Yaml == null) { yaml = new YamlParseResult(Newtonsoft.Json.JsonConvert.DeserializeObject("{}"), yaml.Markdown); } StringBuilder requirement = new StringBuilder(); StringBuilder verification = new StringBuilder(); StringBuilder current = null; using (var stringReader = new StringReader(yaml.Markdown)) { string line; while ((line = stringReader.ReadLine()) != null) { if (line == "# Requirement") { current = requirement; } else if (line == "# Verification Method") { current = verification; } else { if (current == null) { throw new DocGenException($"Content '{line}' should be within a requirement or verification method"); } current.AppendLine(line); } } } var result = new ProductRequirement(); string number = yaml.Yaml?.Number; if (string.IsNullOrEmpty(number)) { throw new DocGenException("You must provider a number"); } if (!TryParseVersion(number, out Version version)) { throw new DocGenException($"Invalid number format {number}"); } result.Number = version; result.Title = yaml.Yaml?.Title; result.Category = yaml.Yaml?.Category; result.Requirement = requirement.ToString(); result.VerificationMethod = verification.ToString(); result.Requirement = result.Requirement.TrimEnd(Environment.NewLine.ToCharArray()); result.VerificationMethod = result.VerificationMethod.TrimEnd(Environment.NewLine.ToCharArray()); if (string.IsNullOrEmpty(result.Title)) { throw new DocGenException("Title is required"); } if (string.IsNullOrEmpty(result.Category)) { throw new DocGenException("Category is required"); } if (string.IsNullOrEmpty(result.Requirement)) { throw new DocGenException("You must provide requirements"); } if (string.IsNullOrEmpty(result.VerificationMethod)) { throw new DocGenException("You must provide a verification method"); } return(result); }
private Task <SoftwareSpecification> BuildRequirementsFromDirectorySoftwareSpecification(string directory, ProductRequirement productRequirement) { var index = Path.Combine(directory, "index.md"); var directoryName = Path.GetFileName(directory.TrimEnd(Path.DirectorySeparatorChar)); if (!File.Exists(index)) { throw new DocGenException($"File 'index.md' doesn't exist for software specification {directoryName}"); } SoftwareSpecification softwareSpecification; try { softwareSpecification = _requirementsParser.ParseSoftwareSpecification(File.ReadAllText(index)); } catch (Exception ex) { throw new DocGenException($"Error parsing index.md for software specification {directoryName}: {ex.Message}"); } softwareSpecification.ProductRequirement = productRequirement; softwareSpecification.Key = directoryName; foreach (var dir in Directory.GetDirectories(directory).OrderBy(x => x)) { var childDirName = Path.GetFileName(dir.TrimEnd(Path.DirectorySeparatorChar)); if (childDirName.Equals("tests", StringComparison.InvariantCultureIgnoreCase)) { // process tests foreach (var file in Directory.GetFiles(dir, "*.md").OrderBy(x => x)) { var testCase = _requirementsParser.ParseTestCase(File.ReadAllText(file)); testCase.SoftwareSpecification = softwareSpecification; testCase.Key = Path.GetFileNameWithoutExtension(file); softwareSpecification.TestCases.Add(testCase); } } else { throw new DocGenException($"Invalid directory {childDirName} in software specification {directoryName}"); } } AssertUniqueNumbersForTestCases(softwareSpecification.TestCases); softwareSpecification.TestCases = softwareSpecification.TestCases.OrderBy(x => x.Number).ToList(); return(Task.FromResult(softwareSpecification)); }
public ProductRequirementViewModel(ProductRequirement requirement, int currentAmount) : base(requirement.RequiredProductType) { Amount = requirement.Quantity; CurrentAmount = currentAmount; }