diff --git a/.gitmodules b/.gitmodules
index 204e755d..030aa587 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
[submodule "OSS/markdowndeep"]
path = OSS/markdowndeep
url = https://github.com/OneDrive/markdowndeep.git
+ branch = master
diff --git a/.nuget/NuGet.Config b/.nuget/NuGet.Config
deleted file mode 100644
index 67f8ea04..00000000
--- a/.nuget/NuGet.Config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe
deleted file mode 100644
index 8dd7e45a..00000000
Binary files a/.nuget/NuGet.exe and /dev/null differ
diff --git a/.nuget/NuGet.targets b/.nuget/NuGet.targets
deleted file mode 100644
index 3f8c37b2..00000000
--- a/.nuget/NuGet.targets
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
- $(MSBuildProjectDirectory)\..\
-
-
- false
-
-
- false
-
-
- true
-
-
- false
-
-
-
-
-
-
-
-
-
-
- $([System.IO.Path]::Combine($(SolutionDir), ".nuget"))
-
-
-
-
- $(SolutionDir).nuget
-
-
-
- $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config
- $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config
-
-
-
- $(MSBuildProjectDirectory)\packages.config
- $(PackagesProjectConfig)
-
-
-
-
- $(NuGetToolsPath)\NuGet.exe
- @(PackageSource)
-
- "$(NuGetExePath)"
- mono --runtime=v4.0.30319 "$(NuGetExePath)"
-
- $(TargetDir.Trim('\\'))
-
- -RequireConsent
- -NonInteractive
-
- "$(SolutionDir) "
- "$(SolutionDir)"
-
-
- $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)
- $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols
-
-
-
- RestorePackages;
- $(BuildDependsOn);
-
-
-
-
- $(BuildDependsOn);
- BuildPackage;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ApiDoctor.Console/ApiDoctor.ConsoleApp.csproj b/ApiDoctor.Console/ApiDoctor.ConsoleApp.csproj
index 73b784f6..e7e2dbaa 100644
--- a/ApiDoctor.Console/ApiDoctor.ConsoleApp.csproj
+++ b/ApiDoctor.Console/ApiDoctor.ConsoleApp.csproj
@@ -1,16 +1,9 @@
-
-
-
+
- Debug
- AnyCPU
- {A6F3993F-59C6-4985-ACF1-4D837D61E98F}
+ net5.0
+ true
Exe
- Properties
- ApiDoctor.ConsoleApp
apidoc
- v4.5
- 512
..\
true
false
@@ -28,98 +21,27 @@
1.0.0.%2a
false
true
+ false
+ $(NuspecProperties);version=$(PackageVersion)
- AnyCPU
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
check-docs --path /Users/dspektor/src/graphdocs2
true
-
- AnyCPU
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- true
-
ApiDoctor.ConsoleApp.Program
- false
false
+ false
35MSSharedLib1024.snk
-
- ..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll
-
-
- ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.2.23.302261847\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll
-
-
- ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.2.23.302261847\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll
-
-
- ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {cd27998c-4021-4299-970b-91be877fd01b}
- ApiDoctor.DocumentationGeneration
-
-
- {B675CF73-AA42-4A54-B5E7-FF5F155DA4A7}
- ApiDoctor.Publishing
-
-
- {33B10320-3802-49CF-8965-3510AE66D5EC}
- ApiDoctor.Validation
-
+
+
+
@@ -138,19 +60,9 @@
false
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/ApiDoctor.Console/ApiDoctor.ConsoleApp.nuspec b/ApiDoctor.Console/ApiDoctor.ConsoleApp.nuspec
index a9034ab6..d1b492b5 100644
--- a/ApiDoctor.Console/ApiDoctor.ConsoleApp.nuspec
+++ b/ApiDoctor.Console/ApiDoctor.ConsoleApp.nuspec
@@ -11,12 +11,12 @@
© Microsoft Corporation. All rights reserved.
http://msdn.microsoft.com/en-US/cc300389
http://github.com/onedrive/apidoctor
-
-
-
-
-
+
+
+
+
+
diff --git a/ApiDoctor.Console/App.config b/ApiDoctor.Console/App.config
deleted file mode 100644
index 1f6eeef1..00000000
--- a/ApiDoctor.Console/App.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.Console/Auth/OAuthAccount.cs b/ApiDoctor.Console/Auth/OAuthAccount.cs
index c33319f3..f3cc53ff 100644
--- a/ApiDoctor.Console/Auth/OAuthAccount.cs
+++ b/ApiDoctor.Console/Auth/OAuthAccount.cs
@@ -32,6 +32,7 @@ namespace ApiDoctor.ConsoleApp.Auth
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
+ using System.Net.Http;
public class OAuthAccount : IServiceAccount
{
@@ -202,13 +203,24 @@ private async Task RedeemRefreshTokenAsync()
private async Task RedeemUsernameAndPasswordAsync()
{
if (string.IsNullOrEmpty(this.AccessToken))
- {
- var creds = new Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential(this.Username, this.Password);
- var context = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(this.TokenService);
- var token = await context.AcquireTokenAsync(this.Resource, this.ClientId, creds);
- if (null != token)
+ { // MSAL removed username/password flow in an effort to discourage people from using it in their applications
+ // it's meant to be replaced by device code flow but because we're using the tool in an unattended mode, we can't implement device code.
+ // this implement a call to the endpoint directly https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth-ropc
+ using var client = new HttpClient();
+ var content = new FormUrlEncodedContent(new[]
+ {
+ new KeyValuePair("username", this.Username),
+ new KeyValuePair("password", this.Password),
+ new KeyValuePair("scope", this.Scopes.Aggregate((x, y) => $"{x} {y}")),
+ new KeyValuePair("client_id", this.ClientId),
+ new KeyValuePair("grant_type", "password"),
+ });
+ using var response = await client.PostAsync(this.TokenService, content); // "https://login.microsoftonline.com/common/oauth2.0/token"
+ var stringBody = await response.Content.ReadAsStringAsync();
+ var jsonContent = JsonConvert.DeserializeObject(stringBody);
+ if (!string.IsNullOrEmpty(jsonContent.access_token))
{
- this.AccessToken = token.AccessToken;
+ this.AccessToken = jsonContent.access_token;
}
else
{
diff --git a/ApiDoctor.Console/CommandLineOptions.cs b/ApiDoctor.Console/CommandLineOptions.cs
index 7312af61..f9070c25 100644
--- a/ApiDoctor.Console/CommandLineOptions.cs
+++ b/ApiDoctor.Console/CommandLineOptions.cs
@@ -51,50 +51,10 @@ class CommandLineOptions
public const string VerbGenerateDocs = "generate-docs";
public const string VerbGenerateSnippets = "generate-snippets";
-
- [VerbOption(VerbPrint, HelpText = "Print files, resources, and methods discovered in the documentation.")]
- public PrintOptions PrintVerbOptions { get; set; }
-
- [VerbOption(VerbCheckLinks, HelpText = "Verify links in the documentation aren't broken.")]
- public CheckLinkOptions CheckLinksVerb { get; set; }
-
- [VerbOption(VerbDocs, HelpText = "Check for errors in the documentation (resources + examples).")]
- public BasicCheckOptions CheckDocsVerb { get; set; }
-
- [VerbOption(VerbCheckAll, HelpText = "Check for errors in the documentation (links + resources + examples)")]
- public CheckLinkOptions CheckAllVerbs { get; set; }
-
- [VerbOption(VerbService, HelpText = "Check for errors between the documentation and service.")]
- public CheckServiceOptions CheckServiceVerb { get; set; }
-
- [VerbOption(VerbPublish, HelpText = "Publish a version of the documentation, optionally converting it into other formats.")]
- public PublishOptions PublishVerb { get; set; }
-
- [VerbOption(VerbPublishMetadata, HelpText = "Publish or update metadata based on information in the docset.")]
- public PublishMetadataOptions EdmxPublishVerb { get; set; }
-
- [VerbOption(VerbMetadata, HelpText = "Check service CSDL metadata against documentation.")]
- public CheckMetadataOptions CheckMetadataVerb { get; set; }
-
- [VerbOption(VerbFix, HelpText = "Fix documentation based on input CSDL.")]
- public FixDocsOptions FixDocsVerb { get; set; }
-
- [VerbOption(VerbGenerateDocs, HelpText = "Generate documentation from an CSDL model")]
- public GenerateDocsOptions GenerateDocsVerb { get; set; }
-
- [VerbOption(VerbGenerateSnippets, HelpText = "Generate code snippets from requests in documentation")]
- public GenerateSnippetsOptions GenerateSnippetsVerb { get; set; }
-
- [VerbOption(VerbAbout, HelpText = "Print about information for this application.")]
- public BaseOptions AboutVerb { get; set; }
-
- [HelpVerbOption]
- public string GetUsage(string verb)
- {
- return HelpText.AutoBuild(this, verb);
- }
}
+ [Verb(CommandLineOptions.VerbAbout, HelpText = "Print about information for this application.")]
+ class AboutOptions : BaseOptions { }
class BaseOptions
{
@@ -121,7 +81,8 @@ class BaseOptions
- public Dictionary PageParameterDict {
+ public Dictionary PageParameterDict
+ {
get
{
if (string.IsNullOrEmpty(AdditionalPageParameters))
@@ -182,6 +143,7 @@ public override bool HasRequiredProperties(out string[] missingArguments)
}
}
+ [Verb(CommandLineOptions.VerbMetadata, HelpText = "Check service CSDL metadata against documentation.")]
class CheckMetadataOptions : DocSetOptions
{
[Option("metadata", HelpText = "Path or URL for the service metadata CSDL")]
@@ -189,6 +151,7 @@ class CheckMetadataOptions : DocSetOptions
}
+ [Verb(CommandLineOptions.VerbFix, HelpText = "Fix documentation based on input CSDL.")]
class FixDocsOptions : CheckMetadataOptions
{
[Option("fixbasetypes", HelpText = "Set base types")]
@@ -222,6 +185,7 @@ public HashSet Matches
}
}
+ [Verb(CommandLineOptions.VerbPrint, HelpText = "Print files, resources, and methods discovered in the documentation.")]
class PrintOptions : DocSetOptions
{
[Option("files", HelpText = "Print the files discovered as part of the documentation")]
@@ -253,35 +217,41 @@ public override bool HasRequiredProperties(out string[] missingArguments)
}
}
- class CheckLinkOptions : BasicCheckOptions {
- [Option("orphan-page-warning", HelpText="Print a warning for each page without any incoming links.")]
+ [Verb(CommandLineOptions.VerbCheckLinks, HelpText = "Verify links in the documentation aren't broken.")]
+ class CheckLinkOptions : BasicCheckOptions
+ {
+ [Option("orphan-page-warning", HelpText = "Print a warning for each page without any incoming links.")]
public bool IncludeOrphanPageWarning { get; set; }
}
+ [Verb(CommandLineOptions.VerbCheckAll, HelpText = "Check for errors in the documentation (links + resources + examples)")]
+ class CheckAllLinkOptions : CheckLinkOptions { }
+ [Verb(CommandLineOptions.VerbDocs, HelpText = "Check for errors in the documentation (resources + examples).")]
class BasicCheckOptions : DocSetOptions
{
- [Option('m', "method", HelpText = "Name of the method to test. If omitted, all defined methods are tested.", MutuallyExclusiveSet="fileOrMethod")]
+ [Option('m', "method", HelpText = "Name of the method to test. If omitted, all defined methods are tested.", SetName = "fileOrMethod")]
public string MethodName { get; set; }
- [Option("file", HelpText="Name of the files to test. Wildcard(*) is allowed. If missing, methods across all files are tested.", MutuallyExclusiveSet="fileOrMethod")]
+ [Option("file", HelpText = "Name of the files to test. Wildcard(*) is allowed. If missing, methods across all files are tested.", SetName = "fileOrMethod")]
public string FileName { get; set; }
- [Option("force-all", HelpText="Force all defined scenarios to be executed, even if disabled.")]
+ [Option("force-all", HelpText = "Force all defined scenarios to be executed, even if disabled.")]
public bool ForceAllScenarios { get; set; }
[Option("relax-string-validation", HelpText = "Relax the validation of JSON string properties.")]
public bool? RelaxStringTypeValidation { get; set; }
- [Option("changes-since-branch-only", HelpText="Only perform validation on files changed since the specified branch.")]
+ [Option("changes-since-branch-only", HelpText = "Only perform validation on files changed since the specified branch.")]
public string FilesChangedFromOriginalBranch { get; set; }
- [Option("git-path", HelpText="Path to the git executable. Required for changes-since-branch-only.")]
+ [Option("git-path", HelpText = "Path to the git executable. Required for changes-since-branch-only.")]
public string GitExecutablePath { get; set; }
[Option("link-case-match", HelpText = "Require the CaSe of relative links within the content to match the filenames.")]
public bool RequireFilenameCaseMatch { get; set; }
}
+ [Verb(CommandLineOptions.VerbService, HelpText = "Check for errors between the documentation and service.")]
class CheckServiceOptions : BasicCheckOptions
{
private const string AccessTokenArgument = "access-token";
@@ -309,19 +279,19 @@ public CheckServiceOptions()
// 2. Using environment variables for oauth properties - auto-detected
// 3. Using an accounts file - auto-detected
- [Option("account", HelpText="Specify the name of an account in the account configuration file. If omitted all enabled accounts will be used.")]
+ [Option("account", HelpText = "Specify the name of an account in the account configuration file. If omitted all enabled accounts will be used.")]
public string AccountName { get; set; }
- [Option("secondary-account", HelpText="Specify the name of a secondary account in the account configuration file.")]
+ [Option("secondary-account", HelpText = "Specify the name of a secondary account in the account configuration file.")]
public string SecondaryAccountName { get; set; }
- [Option("pause", HelpText="Pause between method requests.")]
+ [Option("pause", HelpText = "Pause between method requests.")]
public bool PauseBetweenRequests { get; set; }
[Option("headers", HelpText = "Additional headers to add to requests to the service. For example If-Match: *")]
public string AdditionalHeaders { get; set; }
- [Option("odata-metadata", HelpText="Set the odata.metadata level in the accept header.", DefaultValue=null)]
+ [Option("odata-metadata", HelpText = "Set the odata.metadata level in the accept header.", Default = null)]
public string ODataMetadataLevel { get; set; }
public List FoundAccounts { get; set; }
@@ -329,18 +299,18 @@ public CheckServiceOptions()
[Option("branch-name")]
public string BranchName { get; set; }
- [Option("parallel", HelpText = "Run service tests in parallel.", DefaultValue = false)]
+ [Option("parallel", HelpText = "Run service tests in parallel.", Default = false)]
public bool ParallelTests { get; set; }
[Option("username", HelpText = "Provide a username for basic authentication.")]
public string Username { get; set; }
- [Option("password", HelpText="Provide a password for basic authentication.")]
+ [Option("password", HelpText = "Provide a password for basic authentication.")]
public string Password { get; set; }
- [Option(HttpLoggerArgument, HelpText="Create an HTTP Session archive at the specify path.")]
+ [Option(HttpLoggerArgument, HelpText = "Create an HTTP Session archive at the specify path.")]
public string HttpLoggerOutputPath { get; set; }
- [Option(IgnoreRequiredScopesArgument, HelpText="Disable checking accounts for required scopes before calling methods")]
+ [Option(IgnoreRequiredScopesArgument, HelpText = "Disable checking accounts for required scopes before calling methods")]
public bool IgnoreRequiredScopes { get; set; }
[Option(ProvidedScopesArgument, HelpText = "Comma separated list of scopes provided for the command line account")]
@@ -443,21 +413,22 @@ public override bool HasRequiredProperties(out string[] missingArguments)
}
+ [Verb(CommandLineOptions.VerbPublishMetadata, HelpText = "Publish or update metadata based on information in the docset.")]
class PublishMetadataOptions : DocSetOptions
{
[Option("output", Required = true, HelpText = "Folder for the output metadata file.")]
public string OutputDirectory { get; set; }
- [Option("source", HelpText="Source metadata input file.")]
+ [Option("source", HelpText = "Source metadata input file.")]
public string SourceMetadataPath { get; set; }
- [Option("merge-with", HelpText= "Specify a second metadata input file to merge with the first.")]
+ [Option("merge-with", HelpText = "Specify a second metadata input file to merge with the first.")]
public string SecondSourceMetadataPath { get; set; }
[Option("compare-to", HelpText = "Specify a metadata input file to sort and compare with the published output. Both will be output to {name}-sorted.edmx")]
public string CompareToMetadataPath { get; set; }
- [Option("format", DefaultValue=MetadataFormat.Default, HelpText="Specify the input and output formats for metadata.")]
+ [Option("format", Default = MetadataFormat.Default, HelpText = "Specify the input and output formats for metadata.")]
public MetadataFormat DataFormat { get; set; }
[Option("namespaces", HelpText = "Specify the namespaces that are included when publishing Edmx. Semicolon separated values.")]
@@ -466,7 +437,7 @@ class PublishMetadataOptions : DocSetOptions
[Option("sort", HelpText = "Sort the output. This is supported for EDMX publishing currently.")]
public bool SortOutput { get; set; }
- [Option("transform", HelpText="Apply a named publishSchemaChanges transformation to the output file.")]
+ [Option("transform", HelpText = "Apply a named publishSchemaChanges transformation to the output file.")]
public string TransformOutput { get; set; }
[Option("version", HelpText = "Specify a version to generate the output file for. By default elements from all versions are included in the output.")]
@@ -478,7 +449,7 @@ class PublishMetadataOptions : DocSetOptions
[Option("keep-unrecognized-objects-from-compare-to", HelpText = "By default, we drop any extra elements that the 'compare-to' file has. When this is true, we keep them.")]
public bool KeepUnrecognizedObjects { get; set; }
- [Option("annotations", DefaultValue = AnnotationOptions.None, HelpText = "Specify whether and how to output annotations.")]
+ [Option("annotations", Default = AnnotationOptions.None, HelpText = "Specify whether and how to output annotations.")]
public AnnotationOptions Annotations { get; set; }
[Option("validate", HelpText = "Perform validation on the resulting schema to check for errors.")]
@@ -516,63 +487,65 @@ public CsdlWriterOptions GetOptions()
}
}
+ [Verb(CommandLineOptions.VerbPublish, HelpText = "Publish a version of the documentation, optionally converting it into other formats.")]
class PublishOptions : DocSetOptions, IPublishOptions
{
- [Option("output", Required=true, HelpText="Output directory for sanitized documentation.")]
+ [Option("output", Required = true, HelpText = "Output directory for sanitized documentation.")]
public string OutputDirectory { get; set; }
- [Option("format", DefaultValue=PublishFormat.Markdown, HelpText="Format of the output documentation. Possiblev values are html, markdown, mustache, jsontoc, swagger, and edmx.")]
+ [Option("format", Default = PublishFormat.Markdown, HelpText = "Format of the output documentation. Possiblev values are html, markdown, mustache, jsontoc, swagger, and edmx.")]
public PublishFormat Format { get; set; }
[Option("template", HelpText = "Specify the folder where output template files are located.")]
public string TemplatePath { get; set; }
- [Option("template-filename", HelpText="Override the default template filename.", DefaultValue = "template.htm")]
+ [Option("template-filename", HelpText = "Override the default template filename.", Default = "template.htm")]
public string TemplateFilename { get; set; }
- [Option("file-ext", HelpText="Override the default output file extension.", DefaultValue = ".htm")]
+ [Option("file-ext", HelpText = "Override the default output file extension.", Default = ".htm")]
public string OutputExtension { get; set; }
[Option("line-ending",
- DefaultValue=LineEndings.Default,
- HelpText="Change the line endings for output files. Values: default, windows, unix, or macintosh")]
+ Default = LineEndings.Default,
+ HelpText = "Change the line endings for output files. Values: default, windows, unix, or macintosh")]
public LineEndings LineEndings { get; set; }
[Option("files", HelpText = "Specify a particular source file that should be published, semicolon separated.")]
public string SourceFiles { get; set; }
- [Option("toc", HelpText="Specify the relative path to the output folder where the TOC should be written.")]
+ [Option("toc", HelpText = "Specify the relative path to the output folder where the TOC should be written.")]
public string TableOfContentsOutputRelativePath
{
get; set;
}
- public string[] FilesToPublish {
- get { return (this.SourceFiles ?? string.Empty).Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries); }
+ public string[] FilesToPublish
+ {
+ get { return (this.SourceFiles ?? string.Empty).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); }
set { this.SourceFiles = value.ComponentsJoinedByString(";"); }
}
- [Option("allow-unsafe-html", HelpText="Allows HTML tags in the markdown source to be passed through to the output markdown.")]
+ [Option("allow-unsafe-html", HelpText = "Allows HTML tags in the markdown source to be passed through to the output markdown.")]
public bool AllowUnsafeHtmlContentInMarkdown { get; set; }
- [Option("respect-ordered-lists", HelpText="Respect the start values of ordered lists when converting to HTML. By default OL's start at 1 always.")]
+ [Option("respect-ordered-lists", HelpText = "Respect the start values of ordered lists when converting to HTML. By default OL's start at 1 always.")]
public bool RespectOrderedListValues { get; set; }
#region Swagger2 output controls
- [Option("swagger-title", DefaultValue=null, HelpText="Title to include in the published documentation")]
+ [Option("swagger-title", Default = null, HelpText = "Title to include in the published documentation")]
public string Title { get; set; }
-
- [Option("swagger-description", DefaultValue = null, HelpText = "Description to include in the published documentation")]
+
+ [Option("swagger-description", Default = null, HelpText = "Description to include in the published documentation")]
public string Description { get; set; }
-
- [Option("swagger-version", DefaultValue=null, HelpText="Api Version information to include in documentation")]
+
+ [Option("swagger-version", Default = null, HelpText = "Api Version information to include in documentation")]
public string Version { get; set; }
[Option("swagger-auth-scope", HelpText = "Override the auth scope detection with a default auth scope on every method")]
public string AuthScopeDefault { get; set; }
- [Option("template-format", HelpText = "For EDMX publishing, only publish a single schema in CSDL format instead of the full EDMX.", DefaultValue = MetadataFormat.Default)]
+ [Option("template-format", HelpText = "For EDMX publishing, only publish a single schema in CSDL format instead of the full EDMX.", Default = MetadataFormat.Default)]
public MetadataFormat TemplateFormat { get; set; }
@@ -619,12 +592,14 @@ public enum PublishFormat
}
}
+ [Verb(CommandLineOptions.VerbGenerateDocs, HelpText = "Generate documentation from an CSDL model")]
class GenerateDocsOptions : CheckMetadataOptions
{
[Option("resource-template", HelpText = "Specifies the path to a mustache template file to use for generating documentation for resources (complex and entity types)", Required = false)]
public string ResourceTemplateFile { get; set; }
}
+ [Verb(CommandLineOptions.VerbGenerateSnippets, HelpText = "Generate code snippets from requests in documentation")]
class GenerateSnippetsOptions : BasicCheckOptions
{
[Option("snippet-generator-path", HelpText = "Full Path to the snippet generator url", Required = true)]
diff --git a/ApiDoctor.Console/Program.cs b/ApiDoctor.Console/Program.cs
index 04ce2b59..5c00911c 100644
--- a/ApiDoctor.Console/Program.cs
+++ b/ApiDoctor.Console/Program.cs
@@ -75,37 +75,41 @@ static void Main(string[] args)
if (args.Length > 0)
FancyConsole.WriteLine("Command line: " + args.ComponentsJoinedByString(" "));
- string verbName = null;
- BaseOptions verbOptions = null;
-
- var options = new CommandLineOptions();
- if (!Parser.Default.ParseArguments(args, options,
- (verb, subOptions) =>
- {
- // if parsing succeeds the verb name and correct instance
- // will be passed to onVerbCommand delegate (string,object)
- verbName = verb;
- verbOptions = (BaseOptions)subOptions;
- }))
- {
- FancyConsole.WriteLine(ConsoleColor.Red, "COMMAND LINE PARSE ERROR");
- Exit(failure: true);
- }
-
- IgnoreErrors = verbOptions.IgnoreErrors;
-#if DEBUG
- if (verbOptions.AttachDebugger == 1)
+ try
{
- Debugger.Launch();
- }
+ Parser.Default.ParseArguments(args)
+ .WithParsed((options) =>
+ {
+ IgnoreErrors = options.IgnoreErrors;
+#if DEBUG
+ if (options.AttachDebugger == 1)
+ {
+ Debugger.Launch();
+ }
#endif
- SetStateFromOptions(verbOptions);
-
- var task = Task.Run(() => RunInvokedMethodAsync(options, verbName, verbOptions));
- try
- {
- task.Wait();
+ SetStateFromOptions(options);
+ })
+ .MapResult(
+ (PrintOptions options) => RunInvokedMethodAsync(options),
+ (CheckLinkOptions options) => RunInvokedMethodAsync(options),
+ (BasicCheckOptions options) => RunInvokedMethodAsync(options),
+ (CheckAllLinkOptions options) => RunInvokedMethodAsync(options),
+ (CheckServiceOptions options) => RunInvokedMethodAsync(options),
+ (PublishOptions options) => RunInvokedMethodAsync(options),
+ (PublishMetadataOptions options) => RunInvokedMethodAsync(options),
+ (CheckMetadataOptions options) => RunInvokedMethodAsync(options),
+ (FixDocsOptions options) => RunInvokedMethodAsync(options),
+ (GenerateDocsOptions options) => RunInvokedMethodAsync(options),
+ (AboutOptions options) => RunInvokedMethodAsync(options),
+ (GenerateSnippetsOptions options) => RunInvokedMethodAsync(options),
+ (errors) =>
+ {
+ FancyConsole.WriteLine(ConsoleColor.Red, "COMMAND LINE PARSE ERROR");
+ Exit(failure: true);
+ return Task.FromResult(default(BaseOptions));
+ })
+ .Wait();
}
catch (Exception ex)
{
@@ -166,8 +170,7 @@ public static void LoadCurrentConfiguration(DocSetOptions options)
Console.WriteLine("Using configuration file: {0}", CurrentConfiguration.SourcePath);
}
}
-
- private static async Task RunInvokedMethodAsync(CommandLineOptions origCommandLineOpts, string invokedVerb, BaseOptions options)
+ private static async Task RunInvokedMethodAsync(BaseOptions options)
{
var issues = new IssueLogger()
{
@@ -176,11 +179,9 @@ private static async Task RunInvokedMethodAsync(CommandLineOptions origCommandLi
#endif
};
- string[] missingProps;
- if (!options.HasRequiredProperties(out missingProps))
+ if (!options.HasRequiredProperties(out var missingProps))
{
issues.Error(ValidationErrorCode.MissingRequiredArguments, $"Command line is missing required arguments: {missingProps.ComponentsJoinedByString(", ")}");
- FancyConsole.WriteLine(origCommandLineOpts.GetUsage(invokedVerb));
await WriteOutErrorsAndFinishTestAsync(issues, options.SilenceWarnings, printFailuresOnly: options.PrintFailuresOnly);
Exit(failure: true);
}
@@ -189,42 +190,42 @@ private static async Task RunInvokedMethodAsync(CommandLineOptions origCommandLi
bool returnSuccess = true;
- switch (invokedVerb)
+ switch (options)
{
- case CommandLineOptions.VerbPrint:
- await PrintDocInformationAsync((PrintOptions)options, issues);
+ case PrintOptions o:
+ await PrintDocInformationAsync(o, issues);
break;
- case CommandLineOptions.VerbCheckLinks:
- returnSuccess = await CheckLinksAsync((CheckLinkOptions)options, issues);
+ case CheckAllLinkOptions o:
+ returnSuccess = await CheckDocsAllAsync(o, issues);
break;
- case CommandLineOptions.VerbDocs:
- returnSuccess = await CheckDocsAsync((BasicCheckOptions)options, issues);
+ case CheckServiceOptions o:
+ returnSuccess = await CheckServiceAsync(o, issues);
break;
- case CommandLineOptions.VerbCheckAll:
- returnSuccess = await CheckDocsAllAsync((CheckLinkOptions)options, issues);
+ case GenerateDocsOptions o:
+ returnSuccess = await GenerateDocsAsync(o);
break;
- case CommandLineOptions.VerbService:
- returnSuccess = await CheckServiceAsync((CheckServiceOptions)options, issues);
+ case FixDocsOptions o:
+ returnSuccess = await FixDocsAsync(o, issues);
break;
- case CommandLineOptions.VerbPublish:
- returnSuccess = await PublishDocumentationAsync((PublishOptions)options, issues);
+ case CheckLinkOptions o:
+ returnSuccess = await CheckLinksAsync(o, issues);
break;
- case CommandLineOptions.VerbPublishMetadata:
- returnSuccess = await PublishMetadataAsync((PublishMetadataOptions)options, issues);
+ case GenerateSnippetsOptions o:
+ returnSuccess = await GenerateSnippetsAsync(o, issues);
break;
- case CommandLineOptions.VerbMetadata:
- await CheckServiceMetadataAsync((CheckMetadataOptions)options, issues);
+ case BasicCheckOptions o:
+ returnSuccess = await CheckDocsAsync(o, issues);
break;
- case CommandLineOptions.VerbGenerateDocs:
- returnSuccess = await GenerateDocsAsync((GenerateDocsOptions)options);
+ case PublishOptions o:
+ returnSuccess = await PublishDocumentationAsync(o, issues);
break;
- case CommandLineOptions.VerbFix:
- returnSuccess = await FixDocsAsync((FixDocsOptions)options, issues);
+ case PublishMetadataOptions o:
+ returnSuccess = await PublishMetadataAsync(o, issues);
break;
- case CommandLineOptions.VerbGenerateSnippets:
- returnSuccess = await GenerateSnippetsAsync((GenerateSnippetsOptions)options, issues);
+ case CheckMetadataOptions o:
+ await CheckServiceMetadataAsync(o, issues);
break;
- case CommandLineOptions.VerbAbout:
+ case AboutOptions o:
PrintAboutMessage();
Exit(failure: false);
break;
@@ -234,7 +235,7 @@ private static async Task RunInvokedMethodAsync(CommandLineOptions origCommandLi
issues,
options.IgnoreWarnings,
indent: " ",
- printUnusedSuppressions: invokedVerb == CommandLineOptions.VerbCheckAll);
+ printUnusedSuppressions: options is CheckAllLinkOptions);
if (returnSuccess)
{
@@ -1917,7 +1918,7 @@ private static async Task GenerateSnippetsAsync(GenerateSnippetsOptions op
FancyConsole.WriteLine(FancyConsole.ConsoleSuccessColor, "Generating snippets from Snippets API..");
var guid = Guid.NewGuid().ToString();
- var snippetsPath = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), guid);
+ var snippetsPath = Path.Combine(Path.GetTempPath(), guid);
Directory.CreateDirectory(snippetsPath);
WriteHttpSnippetsIntoFile(snippetsPath, methods, issues);
diff --git a/ApiDoctor.Console/Properties/AssemblyInfo.cs b/ApiDoctor.Console/Properties/AssemblyInfo.cs
index 0dade0d2..69426c82 100644
--- a/ApiDoctor.Console/Properties/AssemblyInfo.cs
+++ b/ApiDoctor.Console/Properties/AssemblyInfo.cs
@@ -31,5 +31,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ApiDoctor.Console/packages.config b/ApiDoctor.Console/packages.config
deleted file mode 100644
index 8d6f240d..00000000
--- a/ApiDoctor.Console/packages.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.DocumentationGeneration.UnitTests/ApiDoctor.DocumentationGeneration.UnitTests.csproj b/ApiDoctor.DocumentationGeneration.UnitTests/ApiDoctor.DocumentationGeneration.UnitTests.csproj
index d6aa5a54..a7bbcc35 100644
--- a/ApiDoctor.DocumentationGeneration.UnitTests/ApiDoctor.DocumentationGeneration.UnitTests.csproj
+++ b/ApiDoctor.DocumentationGeneration.UnitTests/ApiDoctor.DocumentationGeneration.UnitTests.csproj
@@ -1,104 +1,33 @@
-
-
+
- Debug
- AnyCPU
- {32323786-6B69-4A7A-A5DA-DBBBF1148387}
+ net5.0
Library
- Properties
- ApiDoctor.DocumentationGeneration.UnitTests
- ApiDoctor.DocumentationGeneration.UnitTests
- v4.5
- 512
- 10.0
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
- $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
- False
- UnitTest
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- false
+ false
..\ApiDoctor.Console\35MSSharedLib1024.snk
false
+ false
-
- ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
-
-
- ..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
- {CD27998C-4021-4299-970B-91BE877FD01B}
- ApiDoctor.DocumentationGeneration
-
-
- {EE3453F1-FD69-406C-9BD7-0643D6E999F3}
- ApiDoctor.Validation.UnitTests
-
-
- {33B10320-3802-49CF-8965-3510AE66D5EC}
- ApiDoctor.Validation
-
-
- {1569ed47-c7c9-4261-b6f4-7445bd0f2c95}
- MarkdownDeep
-
+
+
+
+
35MSSharedLib1024.snk
-
+
+
+
+
+
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.DocumentationGeneration.UnitTests/packages.config b/ApiDoctor.DocumentationGeneration.UnitTests/packages.config
deleted file mode 100644
index a9d23c36..00000000
--- a/ApiDoctor.DocumentationGeneration.UnitTests/packages.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.DocumentationGeneration/ApiDoctor.DocumentationGeneration.csproj b/ApiDoctor.DocumentationGeneration/ApiDoctor.DocumentationGeneration.csproj
index 2bbbffa2..55759871 100644
--- a/ApiDoctor.DocumentationGeneration/ApiDoctor.DocumentationGeneration.csproj
+++ b/ApiDoctor.DocumentationGeneration/ApiDoctor.DocumentationGeneration.csproj
@@ -1,70 +1,18 @@
-
-
-
+
- Debug
- AnyCPU
- {CD27998C-4021-4299-970B-91BE877FD01B}
+ net5.0
Library
- Properties
- ApiDoctor.DocumentationGeneration
- ApiDoctor.DocumentationGeneration
- v4.5
- 512
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- false
+ false
..\ApiDoctor.Console\35MSSharedLib1024.snk
false
+ false
-
- ..\packages\mustache-sharp.0.2.8.2\lib\net40\mustache-sharp.dll
- True
-
-
- ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
True
True
Templates.resx
@@ -74,31 +22,17 @@
35MSSharedLib1024.snk
-
- Designer
-
-
+
ResXFileCodeGenerator
Templates.Designer.cs
-
-
- {b675cf73-aa42-4a54-b5e7-ff5f155da4a7}
- ApiDoctor.Publishing
-
-
- {33b10320-3802-49cf-8965-3510ae66d5ec}
- ApiDoctor.Validation
-
+
+
+
+
+
+
-
-
\ No newline at end of file
diff --git a/ApiDoctor.DocumentationGeneration/Properties/Templates.resx b/ApiDoctor.DocumentationGeneration/Properties/Templates.resx
index 38df450c..8403ceb1 100644
--- a/ApiDoctor.DocumentationGeneration/Properties/Templates.resx
+++ b/ApiDoctor.DocumentationGeneration/Properties/Templates.resx
@@ -119,6 +119,6 @@
- ..\templates\resource.md.mustache;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ ..\Templates\resource.md.mustache;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
\ No newline at end of file
diff --git a/ApiDoctor.DocumentationGeneration/packages.config b/ApiDoctor.DocumentationGeneration/packages.config
deleted file mode 100644
index e3112244..00000000
--- a/ApiDoctor.DocumentationGeneration/packages.config
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.Publishing/ApiDoctor.Publishing.csproj b/ApiDoctor.Publishing/ApiDoctor.Publishing.csproj
index 2adc7458..dbc0c714 100644
--- a/ApiDoctor.Publishing/ApiDoctor.Publishing.csproj
+++ b/ApiDoctor.Publishing/ApiDoctor.Publishing.csproj
@@ -1,108 +1,31 @@
-
-
-
+
- Debug
- AnyCPU
- {B675CF73-AA42-4A54-B5E7-FF5F155DA4A7}
+ net5.0
Library
- Properties
- ApiDoctor.Publishing
- ApiDoctor.Publishing
- v4.5
- 512
..\
true
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- false
+ false
+ $(NuspecProperties);version=$(PackageVersion)
..\ApiDoctor.Console\35MSSharedLib1024.snk
false
+ false
-
- ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
-
-
-
-
-
-
-
-
-
- ..\packages\mustache-sharp.0.2.8.2\lib\net40\mustache-sharp.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {33B10320-3802-49CF-8965-3510AE66D5EC}
- ApiDoctor.Validation
-
-
- {1569ED47-C7C9-4261-B6F4-7445BD0F2C95}
- MarkdownDeep
-
+
+
35MSSharedLib1024.snk
-
-
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/ApiDoctor.Publishing/ApiDoctor.Publishing.nuspec b/ApiDoctor.Publishing/ApiDoctor.Publishing.nuspec
index acc2df25..951ac5b4 100644
--- a/ApiDoctor.Publishing/ApiDoctor.Publishing.nuspec
+++ b/ApiDoctor.Publishing/ApiDoctor.Publishing.nuspec
@@ -12,16 +12,12 @@
http://msdn.microsoft.com/en-US/cc300389
© Microsoft Corporation. All rights reserved.
-
-
+
-
-
-
-
+
diff --git a/ApiDoctor.Publishing/packages.config b/ApiDoctor.Publishing/packages.config
deleted file mode 100644
index e3112244..00000000
--- a/ApiDoctor.Publishing/packages.config
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.Validation.UnitTests/ApiDoctor.Validation.UnitTests.csproj b/ApiDoctor.Validation.UnitTests/ApiDoctor.Validation.UnitTests.csproj
index 278ce952..130f7fa5 100644
--- a/ApiDoctor.Validation.UnitTests/ApiDoctor.Validation.UnitTests.csproj
+++ b/ApiDoctor.Validation.UnitTests/ApiDoctor.Validation.UnitTests.csproj
@@ -1,127 +1,49 @@
-
-
-
+
- Debug
- AnyCPU
- {EE3453F1-FD69-406C-9BD7-0643D6E999F3}
+ net5.0
Library
- Properties
- ApiDoctor.Validation.UnitTests
- ApiDoctor.Validation.UnitTests
- v4.5
- 512
..\
true
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- false
+ false
..\ApiDoctor.Console\35MSSharedLib1024.snk
false
+ false
-
- ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
-
-
- ..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
True
True
Resources.resx
-
-
-
-
-
35MSSharedLib1024.snk
-
-
-
-
-
-
-
- {33B10320-3802-49CF-8965-3510AE66D5EC}
- ApiDoctor.Validation
-
-
- {1569ed47-c7c9-4261-b6f4-7445bd0f2c95}
- MarkdownDeep
-
+
+
-
+
ResXFileCodeGenerator
Resources.Designer.cs
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ApiDoctor.Validation.UnitTests/packages.config b/ApiDoctor.Validation.UnitTests/packages.config
deleted file mode 100644
index a9d23c36..00000000
--- a/ApiDoctor.Validation.UnitTests/packages.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ApiDoctor.Validation/ApiDoctor.Validation.csproj b/ApiDoctor.Validation/ApiDoctor.Validation.csproj
index 731b72db..01cf84b7 100644
--- a/ApiDoctor.Validation/ApiDoctor.Validation.csproj
+++ b/ApiDoctor.Validation/ApiDoctor.Validation.csproj
@@ -1,204 +1,33 @@
-
-
-
+
- Debug
- AnyCPU
- {33B10320-3802-49CF-8965-3510AE66D5EC}
+ net5.0
Library
- Properties
- ApiDoctor.Validation
- ApiDoctor.Validation
- v4.5
- 512
..\
true
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- false
+ false
+ $(NuspecProperties);version=$(PackageVersion)
..\ApiDoctor.Console\35MSSharedLib1024.snk
false
+ false
-
-
- ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- True
- True
- Resources.resx
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
35MSSharedLib1024.snk
-
-
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
-
- ResXFileCodeGenerator
- Resources.Designer.cs
-
+
-
- {1569ED47-C7C9-4261-B6F4-7445BD0F2C95}
- MarkdownDeep
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ApiDoctor.Validation/ApiDoctor.Validation.nuspec b/ApiDoctor.Validation/ApiDoctor.Validation.nuspec
index 50bf69d5..941657a2 100644
--- a/ApiDoctor.Validation/ApiDoctor.Validation.nuspec
+++ b/ApiDoctor.Validation/ApiDoctor.Validation.nuspec
@@ -12,16 +12,13 @@
http://msdn.microsoft.com/en-US/cc300389
© Microsoft Corporation. All rights reserved.
-
-
+
+
-
-
-
-
-
+
+
diff --git a/ApiDoctor.Validation/Http/HttpParser.cs b/ApiDoctor.Validation/Http/HttpParser.cs
index 3487dec1..0bc069e6 100644
--- a/ApiDoctor.Validation/Http/HttpParser.cs
+++ b/ApiDoctor.Validation/Http/HttpParser.cs
@@ -32,8 +32,8 @@ namespace ApiDoctor.Validation.Http
using System.Globalization;
using System.IO;
using System.Text;
- using System.Web;
using ApiDoctor.Validation.Error;
+ using Microsoft.AspNetCore.WebUtilities;
public class HttpParser
{
@@ -252,7 +252,10 @@ public static NameValueCollection ParseQueryString(string input)
{
if (input != null && input[0] != '?') input = "?" + input;
- var output = HttpUtility.ParseQueryString(input);
+ var values = QueryHelpers.ParseQuery(input);
+ var output = new NameValueCollection();
+ foreach (var value in values)
+ output.Add(value.Key, value.Value);
return output;
}
diff --git a/ApiDoctor.Validation/ObjectGraph/objectgraphmerger.cs b/ApiDoctor.Validation/ObjectGraph/objectgraphmerger.cs
index 5f7ab31a..04f4ca55 100644
--- a/ApiDoctor.Validation/ObjectGraph/objectgraphmerger.cs
+++ b/ApiDoctor.Validation/ObjectGraph/objectgraphmerger.cs
@@ -1,4 +1,5 @@
-using System;
+using Microsoft.AspNetCore.WebUtilities;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
@@ -360,8 +361,8 @@ private static Dictionary