private void UpdateMethod(Dictionary <string, MethodData> methods, string methodName, MethodInfo moduleMethod) { CliFunctionAttribute functionAttribute = moduleMethod.GetCustomAttribute <CliFunctionAttribute>(); CliPropertyAttribute propertyAttribute = moduleMethod.GetCustomAttribute <CliPropertyAttribute>(); methods.Remove(methodName, out MethodData commonMethod); commonMethod.InvocationType = InvocationType.Both; commonMethod.IsFunction = functionAttribute != null; if (commonMethod.Description?.Length == 0) { commonMethod.Description = functionAttribute?.Description ?? propertyAttribute?.Description; } if (commonMethod.ResponseDescription?.Length == 0) { commonMethod.ResponseDescription = functionAttribute?.ResponseDescription ?? propertyAttribute?.ResponseDescription; } if (commonMethod.ExampleResponse?.Length == 0) { commonMethod.ExampleResponse = functionAttribute?.ExampleResponse ?? propertyAttribute?.ExampleResponse; } methods.Add(methodName, commonMethod); }
public void Generate() { StringBuilder descriptionsBuilder = new StringBuilder(@"CLI *** CLI access is not currently included in the Nethermind launcher but will be added very soon. "); List <Type> cliModules = new List <Type>(); foreach (string assemblyName in _assemblyNames) { Assembly assembly = Assembly.Load(new AssemblyName(assemblyName)); foreach (Type type in assembly.GetTypes().Where(t => typeof(CliModuleBase).IsAssignableFrom(t)).Where(t => !t.IsInterface && !t.IsAbstract)) { if (!type.Name.Contains("Ndm")) { cliModules.Add(type); } } } foreach (Type cliModule in cliModules.OrderBy(t => t.Name)) { CliModuleAttribute moduleAttribute = cliModule.GetCustomAttribute <CliModuleAttribute>(); descriptionsBuilder.Append($@"{moduleAttribute.ModuleName} {string.Empty.PadLeft(moduleAttribute.ModuleName.Length, '^')} "); var properties = cliModule.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (MethodInfo methodInfo in properties.OrderBy(p => p.Name)) { CliPropertyAttribute propertyAttribute = methodInfo.GetCustomAttribute <CliPropertyAttribute>(); CliFunctionAttribute functionAttribute = methodInfo.GetCustomAttribute <CliFunctionAttribute>(); if (propertyAttribute != null) { descriptionsBuilder.AppendLine($" {propertyAttribute.ObjectName}.{propertyAttribute.PropertyName}") .AppendLine($" {propertyAttribute.Description ?? "<check JSON RPC docs>"}") .AppendLine(); } if (functionAttribute != null) { descriptionsBuilder.AppendLine($" {functionAttribute.ObjectName}.{functionAttribute.FunctionName}({string.Join(", ", methodInfo.GetParameters().Select(p => p.Name))})") .AppendLine($" {functionAttribute.Description ?? "<check JSON RPC docs>"}") .AppendLine(); } } } string result = descriptionsBuilder.ToString(); Console.WriteLine(result); string sourceDir = DocsDirFinder.FindDocsDir(); File.WriteAllText(Path.Combine(sourceDir, "cli.rst"), result); }
private string GetCliMethodName(MethodInfo moduleMethod) { CliFunctionAttribute functionAttribute = moduleMethod.GetCustomAttribute <CliFunctionAttribute>(); CliPropertyAttribute propertyAttribute = moduleMethod.GetCustomAttribute <CliPropertyAttribute>(); return(functionAttribute?.FunctionName ?? propertyAttribute?.PropertyName ?? string.Concat(moduleMethod.Name.Substring(0, 1).ToLower(), moduleMethod.Name.Substring(1))); }
private void AddNewMethod(Dictionary <string, MethodData> methods, string cliModuleName, string methodName, MethodInfo moduleMethod) { CliFunctionAttribute functionAttribute = moduleMethod.GetCustomAttribute <CliFunctionAttribute>(); CliPropertyAttribute propertyAttribute = moduleMethod.GetCustomAttribute <CliPropertyAttribute>(); if (functionAttribute?.ObjectName == cliModuleName || propertyAttribute?.ObjectName == cliModuleName) { MethodData methodData = new MethodData() { ReturnType = moduleMethod.ReturnType, Parameters = moduleMethod.GetParameters(), Description = functionAttribute?.Description ?? propertyAttribute?.Description, ResponseDescription = functionAttribute?.ResponseDescription ?? propertyAttribute?.ResponseDescription, ExampleResponse = functionAttribute?.ExampleResponse ?? propertyAttribute?.ExampleResponse, IsFunction = functionAttribute != null, InvocationType = InvocationType.Cli }; methods.Add(methodName, methodData); } }
private void GenerateDocFileContent(Type cliType, string docsDir) { StringBuilder docBuilder = new StringBuilder(); string moduleName = cliType.Name.Replace("CliModule", ""); MethodInfo[] moduleMethods = cliType.GetMethods(BindingFlags.Public | BindingFlags.Instance).OrderBy(m => m.Name).ToArray(); List <Type> cliTypesToDescribe; docBuilder.AppendLine(@$ "# {moduleName}"); docBuilder.AppendLine(); moduleName = moduleName.ToLower(); // ToFix: GetType, ToString, Equals, GetHashCode force excluding below foreach (MethodInfo method in moduleMethods.Where(method => method.Name != "GetType" && method.Name != "ToString" && method.Name != "Equals" && method.Name != "GetHashCode")) { CliFunctionAttribute attributeFun = method.GetCustomAttribute <CliFunctionAttribute>(); CliPropertyAttribute attributeProp = method.GetCustomAttribute <CliPropertyAttribute>(); ParameterInfo[] parameters = method.GetParameters(); cliTypesToDescribe = new List <Type>(); StringBuilder methodArg = new StringBuilder(); StringBuilder paramBuilder = new StringBuilder(); if (parameters.Length == 0) { paramBuilder.AppendLine("_None_"); } else { paramBuilder.AppendLine("| Parameter name | Type |"); paramBuilder.AppendLine("| :--- | :--- |"); methodArg.Append("("); string cliParameterType; foreach (ParameterInfo parameter in method.GetParameters()) { cliParameterType = _sharedContent.GetTypeToWrite(parameter.ParameterType, cliTypesToDescribe); paramBuilder.AppendLine($"| {parameter.Name} | `{cliParameterType}` |"); methodArg.Append($"{parameter.Name}, "); } methodArg.Remove(methodArg.Length - 2, 2); methodArg.Append(")"); } docBuilder.AppendLine(@$ "## {moduleName}.{attributeFun?.FunctionName ?? attributeProp?.PropertyName ?? method.Name.Substring(0,1).ToLower() + method.Name.Substring(1) }{methodArg}"); docBuilder.AppendLine(); docBuilder.AppendLine(@$ "{attributeFun?.Description ?? attributeProp?.Description ?? " "} "); docBuilder.AppendLine(); _markdownGenerator.OpenTabs(docBuilder); _markdownGenerator.CreateTab(docBuilder, "Request"); docBuilder.AppendLine(@"### **Parameters**"); docBuilder.AppendLine(); docBuilder.Append(paramBuilder); _markdownGenerator.CloseTab(docBuilder); docBuilder.AppendLine(); _markdownGenerator.CreateTab(docBuilder, "Response"); docBuilder.AppendLine(@$ "### Return type"); docBuilder.AppendLine(); Type returnType = method.ReturnType; string returnRpcType = _sharedContent.GetTypeToWrite(returnType, cliTypesToDescribe); docBuilder.AppendLine(@$ "`{returnRpcType}`"); _markdownGenerator.CloseTab(docBuilder); if (cliTypesToDescribe.Count != 0) { docBuilder.AppendLine(); _markdownGenerator.CreateTab(docBuilder, "Object definitions"); _sharedContent.AddObjectsDescription(docBuilder, cliTypesToDescribe); _markdownGenerator.CloseTab(docBuilder); } _markdownGenerator.CloseTabs(docBuilder); docBuilder.AppendLine(); if (attributeFun?.ExampleRequest != null || attributeFun?.ExampleResponse != null) { docBuilder.AppendLine(@"### **Example**"); _markdownGenerator.OpenTabs(docBuilder); _markdownGenerator.CreateTab(docBuilder, "Request"); _markdownGenerator.CreateCodeBlock(docBuilder, $"{attributeFun?.ExampleRequest ?? ""}"); _markdownGenerator.CloseTab(docBuilder); _markdownGenerator.CreateTab(docBuilder, "Response"); _markdownGenerator.CreateCodeBlock(docBuilder, $"{attributeFun?.ExampleResponse ?? ""}"); _markdownGenerator.CloseTab(docBuilder); _markdownGenerator.CloseTabs(docBuilder); docBuilder.AppendLine(); } }