From 4b3aa6fde9b3029330fdf8b4ddc182fb3fec6bdb Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Thu, 25 Jul 2019 10:53:45 +0300 Subject: [PATCH 01/25] add getting version --- .../discovery/JsonProjectDeserializer.kt | 15 +++++- .../dotnet/discovery/JsonProjectDto.kt | 1 + .../discovery/MSBuildProjectDeserializer.kt | 41 ++++++++++++---- .../discovery/MSBuildSolutionDeserializer.kt | 22 ++++----- .../jetbrains/dotnet/discovery/Reference.kt | 8 +++- .../test/JsonProjectDeserializerTest.kt | 9 +++- .../test/MSBuildProjectDeserializerTest.kt | 18 +++---- .../test/MSBuildSolutionDeserializerTest.kt | 6 +-- .../dotnet/test/ProjectTypeSelectorTest.kt | 48 +++++++++---------- .../dotnet/test/SolutionDiscoverTest.kt | 6 +-- 10 files changed, 110 insertions(+), 64 deletions(-) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index 23d345f..67dc086 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -2,6 +2,8 @@ package org.jetbrains.dotnet.discovery import com.google.gson.Gson import com.google.gson.GsonBuilder +import com.google.gson.JsonObject +import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION import java.util.regex.Pattern class JsonProjectDeserializer( @@ -29,6 +31,17 @@ class JsonProjectDeserializer( } ?: emptyList() val frameworks = project.frameworks?.keys?.map { Framework(it) } ?: emptyList() val runtimes = project.runtimes?.keys?.map { Runtime(it) } ?: emptyList() + val references = project.dependencies?.mapNotNull { (name, info) -> + val version = when(info) { + is String -> info + is JsonObject -> { + info["version"]?.asString + } + else -> null + } ?: DEFAULT_VERSION + Reference(name, version) + } ?: emptyList() + Solution( listOf( Project( @@ -36,7 +49,7 @@ class JsonProjectDeserializer( configurations, frameworks, runtimes, - emptyList() + references ) ) ) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDto.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDto.kt index eaee3fc..a49ab21 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDto.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDto.kt @@ -17,4 +17,5 @@ class JsonProjectDto { var configurations: Map? = null var frameworks: Map? = null var runtimes: Map? = null + var dependencies: Map? = null } diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index 9582316..53850cc 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -2,6 +2,7 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.common.XmlDocumentService +import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.NodeList @@ -21,10 +22,8 @@ class MSBuildProjectDeserializer( val doc = _xmlDocumentService.deserialize(it) val configurations = getAttributes(doc, "/Project/*[@Condition]", "Condition") - .map { ConditionPattern.find(it) } - .map { it?.let { it.groupValues[2] } } - .filter { !it.isNullOrBlank() } - .map { it as String } + .mapNotNull { ConditionPattern.find(it)?.groupValues?.get(2) } + .filter { it.isNotBlank() } .plus(getContents(doc, "/Project/PropertyGroup/Configuration")) .distinct() .map { Configuration(it) } @@ -44,14 +43,21 @@ class MSBuildProjectDeserializer( .map { Runtime(it) } .toList() - val references = getAttributes(doc, "/Project/ItemGroup/PackageReference[@Include]", "Include") - .filter { !it.isBlank() } + val references = getPackageReferences(doc, "/Project/ItemGroup/PackageReference[@Include]") + .filter { it.id.isNotBlank() } .plus( getAttributes(doc, "/Project/ItemGroup/Reference[@Include]", "Include") - .map { it.split(',').firstOrNull() } - .filter { !it.isNullOrBlank() }) + .map { + val attributes = it.split(',') + val id = attributes.first() + val version = attributes + .mapNotNull { versionPattern.find(it)?.groupValues?.get(1) } + .firstOrNull() ?: DEFAULT_VERSION + + Reference(id, version) + } + .filter { it.id.isNotBlank() }) .distinct() - .map { Reference(it!!) } .toList() val targets = getAttributes(doc, "/Project/Target[@Name]", "Name") @@ -93,11 +99,28 @@ class MSBuildProjectDeserializer( private fun getAttributes(doc: Document, xpath: String, attributeName: String): Sequence = getElements(doc, xpath).map { it.getAttribute(attributeName) }.filter { !it.isNullOrBlank() } + private fun getPackageReferences(doc: Document, xpath: String): Sequence = + getElements(doc, xpath) + .map { Reference(it.getAttribute("Include") ?: "", getVersion(it))} + .filter { it.id.isNotEmpty() } + + private fun getVersion(element: Element): String { + val rawVersion = when { + element.hasAttribute("Version") -> element.getAttribute("Version") + else -> element.getElementsByTagName("Version")?.item(0)?.textContent + } + return if (rawVersion.isNullOrBlank()) { + DEFAULT_VERSION + } else { + rawVersion + } + } private val xPath = XPathFactory.newInstance().newXPath() companion object { private val ConditionPattern: Regex = Regex("'\\$\\(Configuration\\)([^']*)' == '([^|]*)([^']*)'", RegexOption.IGNORE_CASE) private val PathPattern: Pattern = Pattern.compile("^.+\\.(proj|csproj|vbproj)$", CASE_INSENSITIVE) + private val versionPattern: Regex = Regex("""^\s*Version\s*=\s*(.*)$""") } } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index 406a6a2..eb5f52e 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -15,21 +15,17 @@ class MSBuildSolutionDeserializer( val projects = it .readLines() .asSequence() - .map { ProjectPathPattern.matcher(it) } + .mapNotNull { ProjectPathPattern.matcher(it) } .filter { it.find() } - .map { - it?.let { - val projectPath = normalizePath(path, it.group(1)) - if (_msBuildProjectDeserializer.accept(projectPath)) { - _msBuildProjectDeserializer.deserialize(projectPath, streamFactory) - .projects.asSequence() - } else { - emptySequence() - } - } ?: emptySequence() + .flatMap { + val projectPath = normalizePath(path, it.group(1)) + if (_msBuildProjectDeserializer.accept(projectPath)) { + _msBuildProjectDeserializer.deserialize(projectPath, streamFactory) + .projects.asSequence() + } else { + emptySequence() + } } - .asSequence() - .flatMap { it } .distinctBy { it.project } .toList() diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt index 02cfb5e..6dac4c1 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt @@ -1,3 +1,9 @@ package org.jetbrains.dotnet.discovery -data class Reference(val id: String) \ No newline at end of file +data class Reference(val id: String, val version: String) { + constructor(pair: Pair) : this(pair.first, pair.second) + + companion object { + const val DEFAULT_VERSION = "*" + } +} \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index 051c852..1b586aa 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -9,6 +9,13 @@ import org.testng.annotations.Test class JsonProjectDeserializerTest { @DataProvider fun testDeserializeData(): Array> { + val referencies = listOf("Microsoft.Bcl.Immutable" to "1.1.18-beta-*", + "Microsoft.AspNet.ConfigurationModel" to "0.1-alpha-*", + "Microsoft.AspNet.DependencyInjection" to "0.1-alpha-*", + "Microsoft.AspNet.Logging" to "0.1-alpha-*", + "System.Data.Common" to "0.1-alpha-*" + ).map { Reference(it) } + return arrayOf( arrayOf( "/project.json", @@ -22,7 +29,7 @@ class JsonProjectDeserializerTest { Framework("dnxcore50") ), emptyList(), - emptyList() + referencies ) ) ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index 7959daf..ca3aef8 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -58,10 +58,10 @@ class MSBuildProjectDeserializerTest { emptyList(), emptyList(), listOf( - Reference("nunit.engine.api"), - Reference("System"), - Reference("System.Data"), - Reference("System.Xml") + Reference("nunit.engine.api", "3.0.0.0"), + Reference("System", "*"), + Reference("System.Data", "*"), + Reference("System.Xml", "*") ) ) ) @@ -77,8 +77,8 @@ class MSBuildProjectDeserializerTest { listOf(Framework("netcoreapp1.0")), emptyList(), listOf( - Reference("Microsoft.NET.Sdk"), - Reference("Microsoft.NET.Test.Sdk") + Reference("Microsoft.NET.Sdk", "1.0.0-alpha-20161104-2"), + Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02") ) ) ) @@ -113,8 +113,8 @@ class MSBuildProjectDeserializerTest { listOf(Framework("netcoreapp1.0")), emptyList(), listOf( - Reference("Microsoft.NET.Sdk"), - Reference("Microsoft.NET.Test.Sdk") + Reference("Microsoft.NET.Sdk", "1.0.0-alpha-20161104-2"), + Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02") ) ) ) @@ -132,7 +132,7 @@ class MSBuildProjectDeserializerTest { Framework("netstandard1.3") ), emptyList(), - listOf(Reference("Newtonsoft.Json")) + listOf(Reference("Newtonsoft.Json", "10.0.3")) ) ) ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index def3177..f6e08ce 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -34,7 +34,7 @@ class MSBuildSolutionDeserializerTest { Runtime("win-7x86"), Runtime("ubuntu.16.10-x64") ), - listOf(Reference("Microsoft.NET.Sdk")) + listOf(Reference("Microsoft.NET.Sdk", "*")) ) ) ) @@ -49,8 +49,8 @@ class MSBuildSolutionDeserializerTest { Runtime("win-7x86") ), listOf( - Reference("Microsoft.NET.sdk"), - Reference("Microsoft.NET.test.sdk") + Reference("Microsoft.NET.sdk", "*"), + Reference("Microsoft.NET.test.sdk", "*") ) ) ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt index 8e46860..47cc5d1 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt @@ -13,32 +13,32 @@ class ProjectTypeSelectorTest { fun testData(): Array> { return arrayOf( // Test - arrayOf(create(false, "Microsoft.NET.Test.Sdk"), setOf(ProjectType.Test)), - arrayOf(create(false, "microsofT.net.test.SDK"), setOf(ProjectType.Test)), - arrayOf(create(false, "Microsoft.NET.Test.Sdk", "abc"), setOf(ProjectType.Test)), - arrayOf(create(false, "abc.Microsoft.NET.Test.Sdk"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "abcMicrosoft.NET.Test.Sdk"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "Microsoft.NET.Test.Sdk.abc"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "Microsoft.NET.Test.Sdkabc"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "Microsoft.NET.Test.Sdkū"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "abc.Microsoft.NET.Test.Sdk.abc"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "abcMicrosoft.NET.Test.Sdkabc"), setOf(ProjectType.Unknown)), - arrayOf(create(false, ".Microsoft.NET.Test."), setOf(ProjectType.Unknown)), + arrayOf(create(false, "Microsoft.NET.Test.Sdk" to "1.0"), setOf(ProjectType.Test)), + arrayOf(create(false, "microsofT.net.test.SDK" to "10.1.1"), setOf(ProjectType.Test)), + arrayOf(create(false, "Microsoft.NET.Test.Sdk" to "1.0", "abc" to "*"), setOf(ProjectType.Test)), + arrayOf(create(false, "abc.Microsoft.NET.Test.Sdk" to "*"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "abcMicrosoft.NET.Test.Sdk" to "1"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "Microsoft.NET.Test.Sdk.abc" to "123"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "Microsoft.NET.Test.Sdkabc" to "20"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "Microsoft.NET.Test.Sdkū" to "4.0.4"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "abc.Microsoft.NET.Test.Sdk.abc" to "lol"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "abcMicrosoft.NET.Test.Sdkabc" to "kek"), setOf(ProjectType.Unknown)), + arrayOf(create(false, ".Microsoft.NET.Test." to "*"), setOf(ProjectType.Unknown)), // Publish - arrayOf(create(false, "Microsoft.aspnet.Abc"), setOf(ProjectType.Publish)), - arrayOf(create(false, "Microsoft.ASPNET.Abc"), setOf(ProjectType.Publish)), - arrayOf(create(false, "Microsoft.aspnet.Abc", "abc"), setOf(ProjectType.Publish)), - arrayOf(create(false, "Microsoft.aspnet."), setOf(ProjectType.Publish)), - arrayOf(create(true, "Microsoft.aspnet.Abc"), setOf(ProjectType.Publish)), + arrayOf(create(false, "Microsoft.aspnet.Abc" to "abc"), setOf(ProjectType.Publish)), + arrayOf(create(false, "Microsoft.ASPNET.Abc" to "aaa"), setOf(ProjectType.Publish)), + arrayOf(create(false, "Microsoft.aspnet.Abc" to "*", "abc" to "*"), setOf(ProjectType.Publish)), + arrayOf(create(false, "Microsoft.aspnet." to "3.2.1"), setOf(ProjectType.Publish)), + arrayOf(create(true, "Microsoft.aspnet.Abc" to "1010101"), setOf(ProjectType.Publish)), arrayOf(create(true), setOf(ProjectType.Publish)), - arrayOf(create(false, "Microsoft.aspnet."), setOf(ProjectType.Publish)), - arrayOf(create(false, ".Microsoft.aspnet.abc"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "abc.Microsoft.aspnet.abc"), setOf(ProjectType.Unknown)), - arrayOf(create(false, "abcMicrosoft.aspnetabc"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "Microsoft.aspnet." to "*"), setOf(ProjectType.Publish)), + arrayOf(create(false, ".Microsoft.aspnet.abc" to "*"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "abc.Microsoft.aspnet.abc" to "0.1"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "abcMicrosoft.aspnetabc" to "10"), setOf(ProjectType.Unknown)), // Mixed - arrayOf(create(true, "Microsoft.NET.Test.Sdk", "abc"), setOf(ProjectType.Publish, ProjectType.Test)), + arrayOf(create(true, "Microsoft.NET.Test.Sdk" to "16.1.4", "abc" to "6.1"), setOf(ProjectType.Publish, ProjectType.Test)), // Empty - arrayOf(create(false, "abc"), setOf(ProjectType.Unknown)), + arrayOf(create(false, "abc" to "*"), setOf(ProjectType.Unknown)), arrayOf(create(), setOf(ProjectType.Unknown)) ) } @@ -55,13 +55,13 @@ class ProjectTypeSelectorTest { Assert.assertEquals(actualProjectTypes, expectedProjectTypes) } - private fun create(generatePackageOnBuild: Boolean = false, vararg references: String): Project = + private fun create(generatePackageOnBuild: Boolean = false, vararg references: Pair): Project = Project( "abc.proj", emptyList(), emptyList(), emptyList(), - references.map { Reference(it) }, + references.map { Reference(it.first, it.second) }, emptyList(), generatePackageOnBuild ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt index d3874ce..1acc692 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt @@ -34,7 +34,7 @@ class SolutionDiscoverTest { Runtime("win-7x86"), Runtime("ubuntu.16.10-x64") ), - listOf(Reference("Microsoft.NET.Sdk")) + listOf(Reference("Microsoft.NET.Sdk", "")) ) ) ) @@ -49,8 +49,8 @@ class SolutionDiscoverTest { Runtime("win-7x86") ), listOf( - Reference("Microsoft.NET.sdk"), - Reference("Microsoft.NET.test.sdk") + Reference("Microsoft.NET.sdk", ""), + Reference("Microsoft.NET.test.sdk", "") ) ) ) From 4959cf6c8a36baa76836a74cfda5283ba74595a2 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Thu, 25 Jul 2019 12:48:11 +0300 Subject: [PATCH 02/25] up jvm target 1.6 -> 1.8 + support packages.config --- build.gradle | 4 +- .../discovery/MSBuildProjectDeserializer.kt | 141 ++++++++++-------- .../test/MSBuildProjectDeserializerTest.kt | 41 ++++- .../dotnet/test/StreamFactoryStub.kt | 7 +- src/test/resources/packages.config | 5 + 5 files changed, 122 insertions(+), 76 deletions(-) create mode 100644 src/test/resources/packages.config diff --git a/build.gradle b/build.gradle index 19afec6..18af7b9 100644 --- a/build.gradle +++ b/build.gradle @@ -38,8 +38,8 @@ dependencies { } compileKotlin { - kotlinOptions.jvmTarget = "1.6" + kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { - kotlinOptions.jvmTarget = "1.6" + kotlinOptions.jvmTarget = "1.8" } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index 53850cc..cf72d11 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -6,6 +6,8 @@ import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.NodeList +import java.nio.file.Path +import java.nio.file.Paths import java.util.regex.Pattern import java.util.regex.Pattern.CASE_INSENSITIVE import javax.xml.xpath.XPathConstants @@ -17,72 +19,77 @@ class MSBuildProjectDeserializer( override fun accept(path: String): Boolean = PathPattern.matcher(path).find() override fun deserialize(path: String, streamFactory: StreamFactory): Solution = - streamFactory.tryCreate(path)?.let { - it.use { - val doc = _xmlDocumentService.deserialize(it) - - val configurations = getAttributes(doc, "/Project/*[@Condition]", "Condition") - .mapNotNull { ConditionPattern.find(it)?.groupValues?.get(2) } - .filter { it.isNotBlank() } - .plus(getContents(doc, "/Project/PropertyGroup/Configuration")) - .distinct() - .map { Configuration(it) } - .toList() - - val frameworks = getContents(doc, "/Project/PropertyGroup/TargetFrameworks") - .flatMap { it.split(';').asSequence() } - .plus(getContents(doc, "/Project/PropertyGroup/TargetFramework")) - .distinct() - .map { Framework(it) } - .toList() - - val runtimes = getContents(doc, "/Project/PropertyGroup/RuntimeIdentifiers") - .flatMap { it.split(';').asSequence() } - .plus(getContents(doc, "/Project/PropertyGroup/RuntimeIdentifier")) - .distinct() - .map { Runtime(it) } - .toList() - - val references = getPackageReferences(doc, "/Project/ItemGroup/PackageReference[@Include]") - .filter { it.id.isNotBlank() } - .plus( - getAttributes(doc, "/Project/ItemGroup/Reference[@Include]", "Include") - .map { - val attributes = it.split(',') - val id = attributes.first() - val version = attributes - .mapNotNull { versionPattern.find(it)?.groupValues?.get(1) } - .firstOrNull() ?: DEFAULT_VERSION - - Reference(id, version) - } - .filter { it.id.isNotBlank() }) - .distinct() - .toList() - - val targets = getAttributes(doc, "/Project/Target[@Name]", "Name") - .distinct() - .map { Target(it) } - .toList() - - val generatePackageOnBuild = getContents(doc, "/Project/PropertyGroup/GeneratePackageOnBuild") - .filter { "true".equals(it.trim(), true) } - .any() - - Solution( - listOf( - Project( - path, - configurations, - frameworks, - runtimes, - references, - targets, - generatePackageOnBuild - ) + streamFactory.tryCreate(path)?.use { + val doc = _xmlDocumentService.deserialize(it) + + val packagesConfigPath = Paths.get(Path.of(path).parent?.toString() ?: ".", "packages.config").toString() + + val packagesConfig = streamFactory.tryCreate(packagesConfigPath)?.use { + loadPackagesConfig(_xmlDocumentService.deserialize(it)) + } ?: emptySequence() + + val configurations = getAttributes(doc, "/Project/*[@Condition]", "Condition") + .mapNotNull { ConditionPattern.find(it)?.groupValues?.get(2) } + .filter { it.isNotBlank() } + .plus(getContents(doc, "/Project/PropertyGroup/Configuration")) + .distinct() + .map { Configuration(it) } + .toList() + + val frameworks = getContents(doc, "/Project/PropertyGroup/TargetFrameworks") + .flatMap { it.split(';').asSequence() } + .plus(getContents(doc, "/Project/PropertyGroup/TargetFramework")) + .distinct() + .map { Framework(it) } + .toList() + + val runtimes = getContents(doc, "/Project/PropertyGroup/RuntimeIdentifiers") + .flatMap { it.split(';').asSequence() } + .plus(getContents(doc, "/Project/PropertyGroup/RuntimeIdentifier")) + .distinct() + .map { Runtime(it) } + .toList() + + val references = getPackageReferences(doc, "/Project/ItemGroup/PackageReference[@Include]") + .plus( + getAttributes(doc, "/Project/ItemGroup/Reference[@Include]", "Include") + .map { + val attributes = it.split(',') + val id = attributes.first() + val version = attributes + .mapNotNull { versionPattern.find(it)?.groupValues?.get(1) } + .firstOrNull() ?: DEFAULT_VERSION + + Reference(id, version) + } + ) + .plus(packagesConfig) + .filter { it.id.isNotBlank() } + .distinct() + .toList() + + val targets = getAttributes(doc, "/Project/Target[@Name]", "Name") + .distinct() + .map { Target(it) } + .toList() + + val generatePackageOnBuild = getContents(doc, "/Project/PropertyGroup/GeneratePackageOnBuild") + .filter { "true".equals(it.trim(), true) } + .any() + + Solution( + listOf( + Project( + path, + configurations, + frameworks, + runtimes, + references, + targets, + generatePackageOnBuild ) ) - } + ) } ?: Solution(emptyList()) private fun getElements(doc: Document, xpath: String): Sequence = sequence { @@ -115,6 +122,12 @@ class MSBuildProjectDeserializer( rawVersion } } + + private fun loadPackagesConfig(doc: Document): Sequence = + getElements(doc, "/packages/package") + .map { Reference(it.getAttribute("id") ?: "", it.getAttribute("version") ?: DEFAULT_VERSION) } + .filter { it.id.isNotBlank() } + private val xPath = XPathFactory.newInstance().newXPath() companion object { diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index ca3aef8..aba0d1a 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -24,7 +24,10 @@ class MSBuildProjectDeserializerTest { Runtime("win-7x86"), Runtime("ubuntu.16.10-x64") ), - emptyList() + listOf( + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") + ) ) ) ) @@ -38,7 +41,10 @@ class MSBuildProjectDeserializerTest { emptyList(), listOf(Framework("netstandard2.0")), emptyList(), - emptyList(), + listOf( + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") + ), emptyList(), true ) @@ -61,7 +67,9 @@ class MSBuildProjectDeserializerTest { Reference("nunit.engine.api", "3.0.0.0"), Reference("System", "*"), Reference("System.Data", "*"), - Reference("System.Xml", "*") + Reference("System.Xml", "*"), + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") ) ) ) @@ -78,7 +86,9 @@ class MSBuildProjectDeserializerTest { emptyList(), listOf( Reference("Microsoft.NET.Sdk", "1.0.0-alpha-20161104-2"), - Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02") + Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02"), + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") ) ) ) @@ -93,7 +103,10 @@ class MSBuildProjectDeserializerTest { listOf(Configuration("Release")), emptyList(), emptyList(), - emptyList(), + listOf( + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") + ), listOf( Target("GetNuGet"), Target("Build"), @@ -114,7 +127,9 @@ class MSBuildProjectDeserializerTest { emptyList(), listOf( Reference("Microsoft.NET.Sdk", "1.0.0-alpha-20161104-2"), - Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02") + Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02"), + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") ) ) ) @@ -132,7 +147,11 @@ class MSBuildProjectDeserializerTest { Framework("netstandard1.3") ), emptyList(), - listOf(Reference("Newtonsoft.Json", "10.0.3")) + listOf( + Reference("Newtonsoft.Json", "10.0.3"), + Reference("jQuery", "3.1.1"), + Reference("NLog", "4.3.10") + ) ) ) ) @@ -144,7 +163,13 @@ class MSBuildProjectDeserializerTest { fun shouldDeserialize(target: String, expectedSolution: Solution) { // Given val path = "projectPath" - val streamFactory = StreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) + val packagesConfigPath = "packages.config" + val streamFactory = + StreamFactoryStub() + .add(path, this::class.java.getResourceAsStream(target)) + .add(packagesConfigPath, this::class.java.getResourceAsStream("/packages.config")) + + val deserializer = MSBuildProjectDeserializer(XmlDocumentServiceImpl()) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt b/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt index 43b9fe0..ee45c6c 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt @@ -2,16 +2,19 @@ package org.jetbrains.dotnet.test import org.jetbrains.dotnet.discovery.StreamFactory import java.io.InputStream +import java.nio.file.Path class StreamFactoryStub : StreamFactory { private val _streams: MutableMap = mutableMapOf() fun add(path: String, inputStream: InputStream): StreamFactoryStub { - _streams[path] = inputStream + _streams[normalize(path)] = inputStream return this } + private fun normalize(path: String) = Path.of(path).normalize().toString() + override fun tryCreate(path: String): InputStream? { - return _streams[path] + return _streams[normalize(path)] } } \ No newline at end of file diff --git a/src/test/resources/packages.config b/src/test/resources/packages.config new file mode 100644 index 0000000..9332e7c --- /dev/null +++ b/src/test/resources/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From d126a68dcc7cf2e5167dc06050f0605c96bbec2a Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Thu, 25 Jul 2019 12:58:17 +0300 Subject: [PATCH 03/25] refactor some tautologies --- .../discovery/JsonProjectDeserializer.kt | 62 +++++++++---------- .../discovery/MSBuildSolutionDeserializer.kt | 38 ++++++------ 2 files changed, 48 insertions(+), 52 deletions(-) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index 67dc086..d3ac861 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -20,40 +20,38 @@ class JsonProjectDeserializer( override fun accept(path: String): Boolean = PathPattern.matcher(path).find() override fun deserialize(path: String, streamFactory: StreamFactory): Solution = - streamFactory.tryCreate(path)?.let { - it.use { - _readerFactory.create(it).use { - val project = _gson.fromJson(it, JsonProjectDto::class.java) - val configurations = project.configurations?.keys?.map { - Configuration( - it - ) - } ?: emptyList() - val frameworks = project.frameworks?.keys?.map { Framework(it) } ?: emptyList() - val runtimes = project.runtimes?.keys?.map { Runtime(it) } ?: emptyList() - val references = project.dependencies?.mapNotNull { (name, info) -> - val version = when(info) { - is String -> info - is JsonObject -> { - info["version"]?.asString - } - else -> null - } ?: DEFAULT_VERSION - Reference(name, version) - } ?: emptyList() - - Solution( - listOf( - Project( - path, - configurations, - frameworks, - runtimes, - references - ) + streamFactory.tryCreate(path)?.use { + _readerFactory.create(it).use { + val project = _gson.fromJson(it, JsonProjectDto::class.java) + val configurations = project.configurations?.keys?.map { + Configuration( + it + ) + } ?: emptyList() + val frameworks = project.frameworks?.keys?.map { Framework(it) } ?: emptyList() + val runtimes = project.runtimes?.keys?.map { Runtime(it) } ?: emptyList() + val references = project.dependencies?.mapNotNull { (name, info) -> + val version = when(info) { + is String -> info + is JsonObject -> { + info["version"]?.asString + } + else -> null + } ?: DEFAULT_VERSION + Reference(name, version) + } ?: emptyList() + + Solution( + listOf( + Project( + path, + configurations, + frameworks, + runtimes, + references ) ) - } + ) } } ?: Solution(emptyList()) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index eb5f52e..a2a5e16 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -9,28 +9,26 @@ class MSBuildSolutionDeserializer( override fun accept(path: String): Boolean = PathPattern.matcher(path).find() override fun deserialize(path: String, streamFactory: StreamFactory): Solution = - streamFactory.tryCreate(path)?.let { - it.use { - _readerFactory.create(it).use { - val projects = it - .readLines() - .asSequence() - .mapNotNull { ProjectPathPattern.matcher(it) } - .filter { it.find() } - .flatMap { - val projectPath = normalizePath(path, it.group(1)) - if (_msBuildProjectDeserializer.accept(projectPath)) { - _msBuildProjectDeserializer.deserialize(projectPath, streamFactory) - .projects.asSequence() - } else { - emptySequence() - } + streamFactory.tryCreate(path)?.use { + _readerFactory.create(it).use { + val projects = it + .readLines() + .asSequence() + .mapNotNull { ProjectPathPattern.matcher(it) } + .filter { it.find() } + .flatMap { + val projectPath = normalizePath(path, it.group(1)) + if (_msBuildProjectDeserializer.accept(projectPath)) { + _msBuildProjectDeserializer.deserialize(projectPath, streamFactory) + .projects.asSequence() + } else { + emptySequence() } - .distinctBy { it.project } - .toList() + } + .distinctBy { it.project } + .toList() - Solution(projects, path) - } + Solution(projects, path) } } ?: Solution(emptyList()) From 18611736a61484f7625df3ff383049cec66a9fa7 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Fri, 26 Jul 2019 14:53:31 +0300 Subject: [PATCH 04/25] change paths types from String to Path --- build.gradle | 2 ++ .../org/jetbrains/dotnet/common/Utils.kt | 17 ++++++++++++++ .../dotnet/common/XmlDocumentServiceImpl.kt | 1 - .../dotnet/discovery/FileStreamFactory.kt | 6 +++-- .../JsonAssetsProjectDeserializer.kt | 17 ++++++++++++++ .../discovery/JsonProjectDeserializer.kt | 12 +++++----- .../discovery/MSBuildProjectDeserializer.kt | 9 ++++---- .../discovery/MSBuildSolutionDeserializer.kt | 22 +++++++++---------- .../dotnet/discovery/SolutionDeserializer.kt | 6 +++-- .../dotnet/discovery/SolutionDiscoverImpl.kt | 5 +++-- .../dotnet/discovery/SolutionDiscoverer.kt | 4 +++- .../dotnet/discovery/StreamFactory.kt | 3 ++- .../test/JsonProjectDeserializerTest.kt | 6 +++-- .../test/MSBuildProjectDeserializerTest.kt | 8 ++++--- .../test/MSBuildSolutionDeserializerTest.kt | 22 ++++++++++--------- .../dotnet/test/SolutionDiscoverTest.kt | 5 +++-- .../dotnet/test/StreamFactoryStub.kt | 11 +++++----- 17 files changed, 102 insertions(+), 54 deletions(-) create mode 100644 src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt diff --git a/build.gradle b/build.gradle index 18af7b9..4543d76 100644 --- a/build.gradle +++ b/build.gradle @@ -32,9 +32,11 @@ dependencies { compile 'com.google.code.gson:gson:2.5' compile 'org.slf4j:slf4j-api:1.7.25' compile 'org.slf4j:slf4j-simple:1.7.25' + compile group: 'commons-io', name: 'commons-io', version: '2.6' testCompile 'org.testng:testng:6.14.3' testCompile 'org.jmock:jmock:2.5.1' + } compileKotlin { diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt b/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt new file mode 100644 index 0000000..e28fc52 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt @@ -0,0 +1,17 @@ +package org.jetbrains.dotnet.common + +import org.apache.commons.io.FilenameUtils +import java.nio.file.Path + +internal fun Path.toUnixString(): String = this.toString().normalizeSystem(true) + +internal fun String.normalizeSystem(isUnix: Boolean = !isWindows()) = + FilenameUtils.normalize(this, isUnix) + +internal fun Path.normalizeSystem(isUnix: Boolean = !isWindows()) = + Path.of(this.toString().normalizeSystem(isUnix)) + + +private fun isWindows(): Boolean { + return System.getProperty("os.name").toLowerCase().contains("win") +} \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/XmlDocumentServiceImpl.kt b/src/main/kotlin/org/jetbrains/dotnet/common/XmlDocumentServiceImpl.kt index 1cd1f8a..3b90e53 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/common/XmlDocumentServiceImpl.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/common/XmlDocumentServiceImpl.kt @@ -22,7 +22,6 @@ class XmlDocumentServiceImpl : XmlDocumentService { } catch (ex: ParserConfigurationException) { throw IllegalStateException("Error during creating xml document") } - return docBuilder.newDocument() } diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt index 72e76c2..2dbe60d 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt @@ -1,13 +1,15 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.common.toUnixString import org.slf4j.Logger import org.slf4j.LoggerFactory import java.io.File import java.io.InputStream +import java.nio.file.Path class FileStreamFactory(private val baseDirectory: File) : StreamFactory { - override fun tryCreate(path: String): InputStream? { - val file = File(baseDirectory, path) + override fun tryCreate(path: Path): InputStream? { + val file = File(baseDirectory, path.toUnixString()) if (!file.exists()) { LOG.debug("File $path was not found") return null diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt new file mode 100644 index 0000000..d973381 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt @@ -0,0 +1,17 @@ +package org.jetbrains.dotnet.discovery + +import com.google.gson.Gson +import java.nio.file.Path + +class JsonAssetsProjectDeserializer : SolutionDeserializer { + + private val gson: Gson = Gson() + + override fun accept(path: Path): Boolean = + path.endsWith("project.assets.json") + + + override fun deserialize(path: Path, streamFactory: StreamFactory): Solution { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index d3ac861..cb06b6c 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -3,7 +3,9 @@ package org.jetbrains.dotnet.discovery import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonObject +import org.jetbrains.dotnet.common.toUnixString import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION +import java.nio.file.Path import java.util.regex.Pattern class JsonProjectDeserializer( @@ -17,16 +19,14 @@ class JsonProjectDeserializer( _gson = builder.create() } - override fun accept(path: String): Boolean = PathPattern.matcher(path).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() - override fun deserialize(path: String, streamFactory: StreamFactory): Solution = + override fun deserialize(path: Path, streamFactory: StreamFactory): Solution = streamFactory.tryCreate(path)?.use { _readerFactory.create(it).use { val project = _gson.fromJson(it, JsonProjectDto::class.java) val configurations = project.configurations?.keys?.map { - Configuration( - it - ) + Configuration(it) } ?: emptyList() val frameworks = project.frameworks?.keys?.map { Framework(it) } ?: emptyList() val runtimes = project.runtimes?.keys?.map { Runtime(it) } ?: emptyList() @@ -44,7 +44,7 @@ class JsonProjectDeserializer( Solution( listOf( Project( - path, + path.toUnixString(), configurations, frameworks, runtimes, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index cf72d11..39c0341 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -2,6 +2,7 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.common.XmlDocumentService +import org.jetbrains.dotnet.common.toUnixString import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION import org.w3c.dom.Document import org.w3c.dom.Element @@ -16,13 +17,13 @@ import javax.xml.xpath.XPathFactory class MSBuildProjectDeserializer( private val _xmlDocumentService: XmlDocumentService ) : SolutionDeserializer { - override fun accept(path: String): Boolean = PathPattern.matcher(path).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() - override fun deserialize(path: String, streamFactory: StreamFactory): Solution = + override fun deserialize(path: Path, streamFactory: StreamFactory): Solution = streamFactory.tryCreate(path)?.use { val doc = _xmlDocumentService.deserialize(it) - val packagesConfigPath = Paths.get(Path.of(path).parent?.toString() ?: ".", "packages.config").toString() + val packagesConfigPath = Paths.get(path.parent?.toString() ?: "", "packages.config") val packagesConfig = streamFactory.tryCreate(packagesConfigPath)?.use { loadPackagesConfig(_xmlDocumentService.deserialize(it)) @@ -80,7 +81,7 @@ class MSBuildProjectDeserializer( Solution( listOf( Project( - path, + path.toUnixString(), configurations, frameworks, runtimes, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index a2a5e16..8a2a554 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -1,14 +1,17 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.common.normalizeSystem +import org.jetbrains.dotnet.common.toUnixString +import java.nio.file.Path import java.util.regex.Pattern class MSBuildSolutionDeserializer( private val _readerFactory: ReaderFactory, private val _msBuildProjectDeserializer: SolutionDeserializer ) : SolutionDeserializer { - override fun accept(path: String): Boolean = PathPattern.matcher(path).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() - override fun deserialize(path: String, streamFactory: StreamFactory): Solution = + override fun deserialize(path: Path, streamFactory: StreamFactory): Solution = streamFactory.tryCreate(path)?.use { _readerFactory.create(it).use { val projects = it @@ -17,7 +20,7 @@ class MSBuildSolutionDeserializer( .mapNotNull { ProjectPathPattern.matcher(it) } .filter { it.find() } .flatMap { - val projectPath = normalizePath(path, it.group(1)) + val projectPath = getProjectPath(path, Path.of(it.group(1))) if (_msBuildProjectDeserializer.accept(projectPath)) { _msBuildProjectDeserializer.deserialize(projectPath, streamFactory) .projects.asSequence() @@ -28,18 +31,13 @@ class MSBuildSolutionDeserializer( .distinctBy { it.project } .toList() - Solution(projects, path) + Solution(projects, path.toUnixString()) } } ?: Solution(emptyList()) - fun normalizePath(basePath: String, path: String): String { - val baseParent = basePath.replace('\\', '/').split('/').reversed().drop(1).reversed().joinToString("/") - val normalizedPath = path.replace('\\', '/') - if (baseParent.isBlank()) { - return normalizedPath - } - - return "$baseParent/$normalizedPath" + fun getProjectPath(basePath: Path, path: Path): Path { + val baseParent = basePath.normalizeSystem().parent ?: Path.of("") + return baseParent.resolve(path.normalizeSystem()) } private companion object { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt index 275e460..ef030e6 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt @@ -1,7 +1,9 @@ package org.jetbrains.dotnet.discovery +import java.nio.file.Path + interface SolutionDeserializer { - fun accept(path: String): Boolean + fun accept(path: Path): Boolean - fun deserialize(path: String, streamFactory: StreamFactory): Solution + fun deserialize(path: Path, streamFactory: StreamFactory): Solution } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt index 5455f29..85fbbaf 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt @@ -2,15 +2,16 @@ package org.jetbrains.dotnet.discovery import org.slf4j.Logger import org.slf4j.LoggerFactory +import java.nio.file.Path class SolutionDiscoverImpl( private val _discoverers: List ) : SolutionDiscover { - override fun discover(streamFactory: StreamFactory, paths: Sequence): Sequence = + override fun discover(streamFactory: StreamFactory, paths: Sequence): Sequence = paths.map { createSolutionSource(streamFactory, it) }.flatMap { it } - private fun createSolutionSource(streamFactory: StreamFactory, path: String): Sequence = sequence { + private fun createSolutionSource(streamFactory: StreamFactory, path: Path): Sequence = sequence { LOG.debug("Discover \"$path\"") for (discoverer in _discoverers) { if (!discoverer.accept(path)) { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt index 2f85612..1ee6d89 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt @@ -1,5 +1,7 @@ package org.jetbrains.dotnet.discovery +import java.nio.file.Path + interface SolutionDiscover { - fun discover(streamFactory: StreamFactory, paths: Sequence): Sequence + fun discover(streamFactory: StreamFactory, paths: Sequence): Sequence } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt index 0aecc08..48f3620 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt @@ -1,7 +1,8 @@ package org.jetbrains.dotnet.discovery import java.io.InputStream +import java.nio.file.Path interface StreamFactory { - fun tryCreate(path: String): InputStream? + fun tryCreate(path: Path): InputStream? } \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index 1b586aa..1bdf18c 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -5,6 +5,7 @@ import org.jetbrains.dotnet.discovery.* import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test +import java.nio.file.Path class JsonProjectDeserializerTest { @DataProvider @@ -40,7 +41,7 @@ class JsonProjectDeserializerTest { @Test(dataProvider = "testDeserializeData") fun shouldDeserialize(target: String, expectedSolution: Solution) { // Given - val path = "projectPath" + val path = Path.of("projectPath") val streamFactory = StreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) val deserializer = JsonProjectDeserializer(ReaderFactoryImpl()) @@ -73,12 +74,13 @@ class JsonProjectDeserializerTest { } @Test(dataProvider = "testAcceptData") - fun shouldAccept(path: String, expectedAccepted: Boolean) { + fun shouldAccept(stringPath: String, expectedAccepted: Boolean) { // Given val deserializer = JsonProjectDeserializer(ReaderFactoryImpl()) // When + val path = Path.of(stringPath) val actualAccepted = deserializer.accept(path) // Then diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index aba0d1a..971a206 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -6,6 +6,7 @@ import org.jetbrains.dotnet.discovery.Target import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test +import java.nio.file.Path class MSBuildProjectDeserializerTest { @DataProvider @@ -162,8 +163,8 @@ class MSBuildProjectDeserializerTest { @Test(dataProvider = "testDeserializeData") fun shouldDeserialize(target: String, expectedSolution: Solution) { // Given - val path = "projectPath" - val packagesConfigPath = "packages.config" + val path = Path.of("projectPath") + val packagesConfigPath = Path.of("packages.config") val streamFactory = StreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) @@ -208,12 +209,13 @@ class MSBuildProjectDeserializerTest { } @Test(dataProvider = "testAcceptData") - fun shouldAccept(path: String, expectedAccepted: Boolean) { + fun shouldAccept(stringPath: String, expectedAccepted: Boolean) { // Given val deserializer = MSBuildProjectDeserializer(XmlDocumentServiceImpl()) // When + val path = Path.of(stringPath) val actualAccepted = deserializer.accept(path) // Then diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index f6e08ce..ae150c0 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -1,18 +1,20 @@ package org.jetbrains.dotnet.test +import org.jetbrains.dotnet.common.toUnixString import org.jetbrains.dotnet.discovery.* import org.jmock.Expectations import org.jmock.Mockery import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test +import java.nio.file.Path class MSBuildSolutionDeserializerTest { @Test fun shouldDeserialize() { // Given val target = "/solution.sln" - val path = "projectPath/aaa.sln" + val path = Path.of("projectPath/aaa.sln") val streamFactory = StreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) val ctx = Mockery() val msBuildProjectDeserializer = ctx.mock(SolutionDeserializer::class.java) @@ -56,29 +58,29 @@ class MSBuildSolutionDeserializerTest { ) ) val expectedSolution = - Solution(solution1.projects.plus(solution2.projects), path) + Solution(solution1.projects.plus(solution2.projects), path.toUnixString()) ctx.checking(object : Expectations() { init { - oneOf(msBuildProjectDeserializer).accept("projectPath/proj1.csproj") + oneOf(msBuildProjectDeserializer).accept(Path.of("projectPath/proj1.csproj")) will(returnValue(true)) oneOf(msBuildProjectDeserializer).deserialize( - "projectPath/proj1.csproj", + Path.of("projectPath/proj1.csproj"), streamFactory ) will(returnValue(solution1)) - oneOf(msBuildProjectDeserializer).accept("projectPath/dir2/proj2.csproj") + oneOf(msBuildProjectDeserializer).accept(Path.of("projectPath/dir2/proj2.csproj")) will(returnValue(true)) oneOf(msBuildProjectDeserializer).deserialize( - "projectPath/dir2/proj2.csproj", + Path.of("projectPath/dir2/proj2.csproj"), streamFactory ) will(returnValue(solution2)) - oneOf(msBuildProjectDeserializer).accept("projectPath/Solution Items") + oneOf(msBuildProjectDeserializer).accept(Path.of("projectPath/Solution Items")) will(returnValue(false)) } }) @@ -124,7 +126,7 @@ class MSBuildSolutionDeserializerTest { ) // When - val actualAccepted = deserializer.accept(path) + val actualAccepted = deserializer.accept(Path.of(path)) // Then Assert.assertEquals(actualAccepted, expectedAccepted) @@ -153,9 +155,9 @@ class MSBuildSolutionDeserializerTest { ) // When - val actualPath = deserializer.normalizePath(basePath, path) + val actualPath = deserializer.getProjectPath(Path.of(basePath), Path.of(path)) // Then - Assert.assertEquals(actualPath, expectedPath) + Assert.assertEquals(actualPath.toUnixString(), expectedPath) } } \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt index 1acc692..0c18f76 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt @@ -5,13 +5,14 @@ import org.jmock.Expectations import org.jmock.Mockery import org.testng.Assert import org.testng.annotations.Test +import java.nio.file.Path class SolutionDiscoverTest { @Test fun shouldDiscover() { // Given - val path1 = "projectPath1/aaa.sln" - val path2 = "projectPath2/proj.sln" + val path1 = Path.of("projectPath1/aaa.sln") + val path2 = Path.of("projectPath2/proj.sln") val streamFactory = StreamFactoryStub() val ctx = Mockery() diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt b/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt index ee45c6c..447d377 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt @@ -1,5 +1,6 @@ package org.jetbrains.dotnet.test +import org.jetbrains.dotnet.common.toUnixString import org.jetbrains.dotnet.discovery.StreamFactory import java.io.InputStream import java.nio.file.Path @@ -7,14 +8,12 @@ import java.nio.file.Path class StreamFactoryStub : StreamFactory { private val _streams: MutableMap = mutableMapOf() - fun add(path: String, inputStream: InputStream): StreamFactoryStub { - _streams[normalize(path)] = inputStream + fun add(path: Path, inputStream: InputStream): StreamFactoryStub { + _streams[path.toUnixString()] = inputStream return this } - private fun normalize(path: String) = Path.of(path).normalize().toString() - - override fun tryCreate(path: String): InputStream? { - return _streams[normalize(path)] + override fun tryCreate(path: Path): InputStream? { + return _streams[path.toUnixString()] } } \ No newline at end of file From c354f032d5b75ff1cdc55d8fc5754d6175e588c9 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 29 Jul 2019 16:52:14 +0300 Subject: [PATCH 05/25] add JsonAssetsProjectDeserializer with tests --- .../org/jetbrains/dotnet/common/Utils.kt | 1 + ...Factory.kt => FileProjectStreamFactory.kt} | 2 +- .../JsonAssetsProjectDeserializer.kt | 72 +- .../dotnet/discovery/JsonAssetsProjectDto.kt | 26 + .../discovery/JsonProjectDeserializer.kt | 15 +- .../discovery/MSBuildProjectDeserializer.kt | 7 +- .../discovery/MSBuildSolutionDeserializer.kt | 6 +- .../org/jetbrains/dotnet/discovery/Project.kt | 1 + ...reamFactory.kt => ProjectStreamFactory.kt} | 4 +- .../jetbrains/dotnet/discovery/Reference.kt | 6 +- .../dotnet/discovery/SolutionDeserializer.kt | 2 +- .../dotnet/discovery/SolutionDiscoverImpl.kt | 8 +- .../dotnet/discovery/SolutionDiscoverer.kt | 2 +- .../org/jetbrains/dotnet/discovery/Source.kt | 3 + .../test/JsonAssetsProjectDeserializerTest.kt | 73 + .../test/JsonProjectDeserializerTest.kt | 2 +- .../test/MSBuildProjectDeserializerTest.kt | 3 +- .../test/MSBuildSolutionDeserializerTest.kt | 2 +- ...oryStub.kt => ProjectStreamFactoryStub.kt} | 10 +- .../dotnet/test/ProjectTypeSelectorTest.kt | 1 + .../dotnet/test/SolutionDiscoverTest.kt | 2 +- src/test/resources/project.assets.json | 3994 +++++++++++++++++ 22 files changed, 4212 insertions(+), 30 deletions(-) rename src/main/kotlin/org/jetbrains/dotnet/discovery/{FileStreamFactory.kt => FileProjectStreamFactory.kt} (87%) create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt rename src/main/kotlin/org/jetbrains/dotnet/discovery/{StreamFactory.kt => ProjectStreamFactory.kt} (63%) create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt create mode 100644 src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt rename src/test/kotlin/org/jetbrains/dotnet/test/{StreamFactoryStub.kt => ProjectStreamFactoryStub.kt} (59%) create mode 100644 src/test/resources/project.assets.json diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt b/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt index e28fc52..5679f68 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt @@ -4,6 +4,7 @@ import org.apache.commons.io.FilenameUtils import java.nio.file.Path internal fun Path.toUnixString(): String = this.toString().normalizeSystem(true) +internal fun String.toUnixString(): String = this.normalizeSystem(true) internal fun String.normalizeSystem(isUnix: Boolean = !isWindows()) = FilenameUtils.normalize(this, isUnix) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt similarity index 87% rename from src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt rename to src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt index 2dbe60d..d1c0a09 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileStreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt @@ -7,7 +7,7 @@ import java.io.File import java.io.InputStream import java.nio.file.Path -class FileStreamFactory(private val baseDirectory: File) : StreamFactory { +class FileProjectStreamFactory(override val baseDirectory: File) : ProjectStreamFactory { override fun tryCreate(path: Path): InputStream? { val file = File(baseDirectory, path.toUnixString()) if (!file.exists()) { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt index d973381..36feed1 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt @@ -1,17 +1,79 @@ package org.jetbrains.dotnet.discovery import com.google.gson.Gson +import com.google.gson.JsonSyntaxException +import org.jetbrains.dotnet.common.normalizeSystem +import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.nio.file.Path +import java.util.regex.Pattern -class JsonAssetsProjectDeserializer : SolutionDeserializer { +class JsonAssetsProjectDeserializer( + private val readerFactory: ReaderFactory +) : SolutionDeserializer { private val gson: Gson = Gson() - override fun accept(path: Path): Boolean = - path.endsWith("project.assets.json") + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() + override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = + projectStreamFactory.tryCreate(path)?.use { inputStream -> + readerFactory.create(inputStream).use { reader -> + val doc = try { + gson.fromJson(reader, JsonAssetsProjectDto::class.java) + } catch (e : JsonSyntaxException) { + LOG.debug("$path contains invalid json") + return Solution(emptyList()) + } - override fun deserialize(path: Path, streamFactory: StreamFactory): Solution { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + val targets = doc.targets?.keys?.map { Target(it) } ?: emptyList() + val roots : Set = doc.project?.frameworks?.values + ?.flatMap { + it.dependencies?.keys ?: emptySet() + } + ?.toHashSet() ?: emptySet() + + val references = doc.targets?.values + ?.flatMap { it.entries } + ?.map { (id, pkg) -> + val splitedId = id.split("/") + val name = splitedId[0] + val version = splitedId.getOrNull(1) ?: DEFAULT_VERSION + val dependencies = pkg.dependencies?.entries + ?.map { (name, ver) -> Reference(name, ver) } ?: emptyList() + + val isRoot = roots.contains(name) + Reference(name, version, dependencies, isRoot) + } ?: emptyList() + + val frameworks = doc.project?.frameworks?.keys?.map { Framework(it) } ?: emptyList() + + val fullPathToConfig = Path.of(doc.project?.restore?.projectPath?.normalizeSystem()) ?: path + val pathToConfig = fullPathToConfig + .toFile() + .relativeToOrSelf(projectStreamFactory.baseDirectory.absoluteFile) + + val sources = doc.project?.restore?.sources?.keys?.map { Source(it) } ?: emptyList() + + Solution( + listOf( + Project( + pathToConfig.path, + targets = targets, + references = references, + frameworks = frameworks, + sources = sources + ) + ) + ) + } + } ?: Solution(emptyList()) + + + private companion object { + private val LOG: Logger = LoggerFactory.getLogger(JsonAssetsProjectDeserializer::class.java.name) + private val PathPattern: Pattern = Pattern.compile("^(.+[^\\w\\d]|)project\\.assets\\.json$", Pattern.CASE_INSENSITIVE) } } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt new file mode 100644 index 0000000..f74b8a2 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt @@ -0,0 +1,26 @@ +package org.jetbrains.dotnet.discovery + +import com.google.gson.annotations.SerializedName + +class JsonAssetsProjectDto( + @SerializedName("targets") val targets: Map>?, + @SerializedName("project") val project: ProjectDto? +) + +class PackageDto( + @SerializedName("dependencies") val dependencies: Map? +) + +class ProjectDto( + @SerializedName("restore") val restore : RestoreDto?, + @SerializedName("frameworks") val frameworks: Map? +) + +class DependenciesDto ( + @SerializedName("dependencies") val dependencies: Map? +) + +class RestoreDto( + @SerializedName("projectPath") val projectPath : String?, + @SerializedName("sources") val sources : Map? +) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index cb06b6c..54f15c3 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -3,8 +3,11 @@ package org.jetbrains.dotnet.discovery import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonObject +import com.google.gson.JsonSyntaxException import org.jetbrains.dotnet.common.toUnixString import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.nio.file.Path import java.util.regex.Pattern @@ -21,10 +24,15 @@ class JsonProjectDeserializer( override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() - override fun deserialize(path: Path, streamFactory: StreamFactory): Solution = - streamFactory.tryCreate(path)?.use { + override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = + projectStreamFactory.tryCreate(path)?.use { _readerFactory.create(it).use { - val project = _gson.fromJson(it, JsonProjectDto::class.java) + val project = try { + _gson.fromJson(it, JsonProjectDto::class.java) + } catch (e: JsonSyntaxException) { + LOG.debug("$path contains invalid json") + return Solution(emptyList()) + } val configurations = project.configurations?.keys?.map { Configuration(it) } ?: emptyList() @@ -56,6 +64,7 @@ class JsonProjectDeserializer( } ?: Solution(emptyList()) private companion object { + private val LOG: Logger = LoggerFactory.getLogger(JsonProjectDeserializer::class.java.name) private val PathPattern: Pattern = Pattern.compile("^(.+[^\\w\\d]|)project\\.json$", Pattern.CASE_INSENSITIVE) } } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index 39c0341..4580d57 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -19,13 +19,13 @@ class MSBuildProjectDeserializer( ) : SolutionDeserializer { override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() - override fun deserialize(path: Path, streamFactory: StreamFactory): Solution = - streamFactory.tryCreate(path)?.use { + override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = + projectStreamFactory.tryCreate(path)?.use { val doc = _xmlDocumentService.deserialize(it) val packagesConfigPath = Paths.get(path.parent?.toString() ?: "", "packages.config") - val packagesConfig = streamFactory.tryCreate(packagesConfigPath)?.use { + val packagesConfig = projectStreamFactory.tryCreate(packagesConfigPath)?.use { loadPackagesConfig(_xmlDocumentService.deserialize(it)) } ?: emptySequence() @@ -87,6 +87,7 @@ class MSBuildProjectDeserializer( runtimes, references, targets, + emptyList(), generatePackageOnBuild ) ) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index 8a2a554..80f2d11 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -11,8 +11,8 @@ class MSBuildSolutionDeserializer( ) : SolutionDeserializer { override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() - override fun deserialize(path: Path, streamFactory: StreamFactory): Solution = - streamFactory.tryCreate(path)?.use { + override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = + projectStreamFactory.tryCreate(path)?.use { _readerFactory.create(it).use { val projects = it .readLines() @@ -22,7 +22,7 @@ class MSBuildSolutionDeserializer( .flatMap { val projectPath = getProjectPath(path, Path.of(it.group(1))) if (_msBuildProjectDeserializer.accept(projectPath)) { - _msBuildProjectDeserializer.deserialize(projectPath, streamFactory) + _msBuildProjectDeserializer.deserialize(projectPath, projectStreamFactory) .projects.asSequence() } else { emptySequence() diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt index ddababb..c99fb9d 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt @@ -7,5 +7,6 @@ data class Project( var runtimes: List = emptyList(), val references: List = emptyList(), val targets: List = emptyList(), + val sources: List = emptyList(), val generatePackageOnBuild: Boolean = false ) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt similarity index 63% rename from src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt rename to src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt index 48f3620..340f7ed 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/StreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt @@ -1,8 +1,10 @@ package org.jetbrains.dotnet.discovery +import java.io.File import java.io.InputStream import java.nio.file.Path -interface StreamFactory { +interface ProjectStreamFactory { fun tryCreate(path: Path): InputStream? + val baseDirectory: File } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt index 6dac4c1..3fb0e59 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt @@ -1,6 +1,10 @@ package org.jetbrains.dotnet.discovery -data class Reference(val id: String, val version: String) { +data class Reference(val id: String, + val version: String, + val dependencies: List = emptyList(), + val isRoot: Boolean = true) { + constructor(pair: Pair) : this(pair.first, pair.second) companion object { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt index ef030e6..0691807 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt @@ -5,5 +5,5 @@ import java.nio.file.Path interface SolutionDeserializer { fun accept(path: Path): Boolean - fun deserialize(path: Path, streamFactory: StreamFactory): Solution + fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt index 85fbbaf..545dd3d 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt @@ -8,10 +8,10 @@ class SolutionDiscoverImpl( private val _discoverers: List ) : SolutionDiscover { - override fun discover(streamFactory: StreamFactory, paths: Sequence): Sequence = - paths.map { createSolutionSource(streamFactory, it) }.flatMap { it } + override fun discover(projectStreamFactory: ProjectStreamFactory, paths: Sequence): Sequence = + paths.map { createSolutionSource(projectStreamFactory, it) }.flatMap { it } - private fun createSolutionSource(streamFactory: StreamFactory, path: Path): Sequence = sequence { + private fun createSolutionSource(projectStreamFactory: ProjectStreamFactory, path: Path): Sequence = sequence { LOG.debug("Discover \"$path\"") for (discoverer in _discoverers) { if (!discoverer.accept(path)) { @@ -20,7 +20,7 @@ class SolutionDiscoverImpl( LOG.debug("Use discoverer \"$discoverer\" for \"$path\"") try { - val solution = discoverer.deserialize(path, streamFactory) + val solution = discoverer.deserialize(path, projectStreamFactory) LOG.debug("\"$discoverer\" finds \"$solution\"") yield(solution) break diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt index 1ee6d89..c0e183e 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt @@ -3,5 +3,5 @@ package org.jetbrains.dotnet.discovery import java.nio.file.Path interface SolutionDiscover { - fun discover(streamFactory: StreamFactory, paths: Sequence): Sequence + fun discover(projectStreamFactory: ProjectStreamFactory, paths: Sequence): Sequence } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt new file mode 100644 index 0000000..0010463 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt @@ -0,0 +1,3 @@ +package org.jetbrains.dotnet.discovery + +class Source(val id: String) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt new file mode 100644 index 0000000..60c5b09 --- /dev/null +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt @@ -0,0 +1,73 @@ +package org.jetbrains.dotnet.test + +import org.jetbrains.dotnet.discovery.* +import org.jetbrains.dotnet.discovery.Target +import org.testng.Assert.assertEquals +import org.testng.Assert.assertTrue +import org.testng.annotations.DataProvider +import org.testng.annotations.Test +import java.nio.file.Path + +class JsonAssetsProjectDeserializerTest { + + @Test + fun shouldDeserialize() { + // Given + val target = "/project.assets.json" + val path = Path.of("./project.assets.json") + val streamFactory = ProjectStreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) + val deserializer = + JsonAssetsProjectDeserializer(ReaderFactoryImpl()) + + // When + val actualSolution = deserializer.deserialize(path, streamFactory) + + // Then + assertEquals(actualSolution.projects.size, 1) + val project = actualSolution.projects[0] + assertTrue(project.project.endsWith("ConsoleApp1.csproj")) + assertEquals(project.frameworks, listOf(Framework("netcoreapp2.2"))) + assertEquals(project.targets, listOf(Target(".NETCoreApp,Version=v2.2"))) + assertTrue(project.references.toSet().containsAll( listOf( + Reference("AutoMapper", "8.1.1", listOf( + Reference("Microsoft.CSharp", "4.5.0"), + Reference("System.Reflection.Emit", "4.3.0") + ), true), + Reference("NuGet.Versioning", "5.1.0", emptyList(), false) + ))) + } + + @DataProvider + fun testAcceptData(): Array> { + return arrayOf( + arrayOf("project.assets.json", true), + arrayOf("abc\\project.assets.json", true), + arrayOf("abc//project.assets.json", true), + arrayOf("abc/ProJect.asSets.Json", true), + arrayOf("aaaaproject.assets.json", false), + arrayOf("project.assets.jsonaaaa", false), + arrayOf("abc\\project.assets.jsoss", false), + arrayOf("project.assets.json10aaa", false), + arrayOf("10project.assets.json", false), + arrayOf("10rer323project.assets.json", false), + arrayOf(".json", false), + arrayOf("json", false), + arrayOf(" ", false), + arrayOf("", false) + ) + } + + @Test(dataProvider = "testAcceptData") + fun shouldAccept(stringPath: String, expectedAccepted: Boolean) { + // Given + val deserializer = + JsonAssetsProjectDeserializer(ReaderFactoryImpl()) + + // When + val path = Path.of(stringPath) + val actualAccepted = deserializer.accept(path) + + // Then + assertEquals(actualAccepted, expectedAccepted) + } +} \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index 1bdf18c..952eb20 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -42,7 +42,7 @@ class JsonProjectDeserializerTest { fun shouldDeserialize(target: String, expectedSolution: Solution) { // Given val path = Path.of("projectPath") - val streamFactory = StreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) + val streamFactory = ProjectStreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) val deserializer = JsonProjectDeserializer(ReaderFactoryImpl()) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index 971a206..e4a767d 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -47,6 +47,7 @@ class MSBuildProjectDeserializerTest { Reference("NLog", "4.3.10") ), emptyList(), + emptyList(), true ) ) @@ -166,7 +167,7 @@ class MSBuildProjectDeserializerTest { val path = Path.of("projectPath") val packagesConfigPath = Path.of("packages.config") val streamFactory = - StreamFactoryStub() + ProjectStreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) .add(packagesConfigPath, this::class.java.getResourceAsStream("/packages.config")) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index ae150c0..6b41e35 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -15,7 +15,7 @@ class MSBuildSolutionDeserializerTest { // Given val target = "/solution.sln" val path = Path.of("projectPath/aaa.sln") - val streamFactory = StreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) + val streamFactory = ProjectStreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) val ctx = Mockery() val msBuildProjectDeserializer = ctx.mock(SolutionDeserializer::class.java) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt similarity index 59% rename from src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt rename to src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt index 447d377..f73c50b 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/StreamFactoryStub.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt @@ -1,14 +1,18 @@ package org.jetbrains.dotnet.test import org.jetbrains.dotnet.common.toUnixString -import org.jetbrains.dotnet.discovery.StreamFactory +import org.jetbrains.dotnet.discovery.ProjectStreamFactory +import java.io.File import java.io.InputStream import java.nio.file.Path -class StreamFactoryStub : StreamFactory { +class ProjectStreamFactoryStub : ProjectStreamFactory { + override val baseDirectory: File + get() = File(".") + private val _streams: MutableMap = mutableMapOf() - fun add(path: Path, inputStream: InputStream): StreamFactoryStub { + fun add(path: Path, inputStream: InputStream): ProjectStreamFactoryStub { _streams[path.toUnixString()] = inputStream return this } diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt index 47cc5d1..f1c0118 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt @@ -63,6 +63,7 @@ class ProjectTypeSelectorTest { emptyList(), references.map { Reference(it.first, it.second) }, emptyList(), + emptyList(), generatePackageOnBuild ) } \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt index 0c18f76..105dd30 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt @@ -14,7 +14,7 @@ class SolutionDiscoverTest { val path1 = Path.of("projectPath1/aaa.sln") val path2 = Path.of("projectPath2/proj.sln") - val streamFactory = StreamFactoryStub() + val streamFactory = ProjectStreamFactoryStub() val ctx = Mockery() val deserializer1 = ctx.mock(SolutionDeserializer::class.java, "deserializer1") val deserializer2 = ctx.mock(SolutionDeserializer::class.java, "deserializer2") diff --git a/src/test/resources/project.assets.json b/src/test/resources/project.assets.json new file mode 100644 index 0000000..92374d0 --- /dev/null +++ b/src/test/resources/project.assets.json @@ -0,0 +1,3994 @@ +{ + "version": 3, + "targets": { + ".NETCoreApp,Version=v2.2": { + "AutoMapper/8.1.1": { + "type": "package", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "System.Reflection.Emit": "4.3.0" + }, + "compile": { + "lib/netstandard2.0/AutoMapper.dll": {} + }, + "runtime": { + "lib/netstandard2.0/AutoMapper.dll": {} + } + }, + "Microsoft.CSharp/4.5.0": { + "type": "package", + "compile": { + "ref/netcoreapp2.0/_._": {} + }, + "runtime": { + "lib/netcoreapp2.0/_._": {} + } + }, + "Microsoft.NETCore.App/2.2.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetHostPolicy": "2.2.0", + "Microsoft.NETCore.Platforms": "2.2.0", + "Microsoft.NETCore.Targets": "2.0.0", + "NETStandard.Library": "2.0.3" + }, + "compile": { + "ref/netcoreapp2.2/Microsoft.CSharp.dll": {}, + "ref/netcoreapp2.2/Microsoft.VisualBasic.dll": {}, + "ref/netcoreapp2.2/Microsoft.Win32.Primitives.dll": {}, + "ref/netcoreapp2.2/System.AppContext.dll": {}, + "ref/netcoreapp2.2/System.Buffers.dll": {}, + "ref/netcoreapp2.2/System.Collections.Concurrent.dll": {}, + "ref/netcoreapp2.2/System.Collections.Immutable.dll": {}, + "ref/netcoreapp2.2/System.Collections.NonGeneric.dll": {}, + "ref/netcoreapp2.2/System.Collections.Specialized.dll": {}, + "ref/netcoreapp2.2/System.Collections.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.Annotations.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.DataAnnotations.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.Primitives.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.dll": {}, + "ref/netcoreapp2.2/System.Configuration.dll": {}, + "ref/netcoreapp2.2/System.Console.dll": {}, + "ref/netcoreapp2.2/System.Core.dll": {}, + "ref/netcoreapp2.2/System.Data.Common.dll": {}, + "ref/netcoreapp2.2/System.Data.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Contracts.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Debug.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Process.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.StackTrace.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Tools.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.TraceSource.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Tracing.dll": {}, + "ref/netcoreapp2.2/System.Drawing.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Drawing.dll": {}, + "ref/netcoreapp2.2/System.Dynamic.Runtime.dll": {}, + "ref/netcoreapp2.2/System.Globalization.Calendars.dll": {}, + "ref/netcoreapp2.2/System.Globalization.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Globalization.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.Brotli.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.FileSystem.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.ZipFile.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.Primitives.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.dll": {}, + "ref/netcoreapp2.2/System.IO.IsolatedStorage.dll": {}, + "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.dll": {}, + "ref/netcoreapp2.2/System.IO.Pipes.dll": {}, + "ref/netcoreapp2.2/System.IO.UnmanagedMemoryStream.dll": {}, + "ref/netcoreapp2.2/System.IO.dll": {}, + "ref/netcoreapp2.2/System.Linq.Expressions.dll": {}, + "ref/netcoreapp2.2/System.Linq.Parallel.dll": {}, + "ref/netcoreapp2.2/System.Linq.Queryable.dll": {}, + "ref/netcoreapp2.2/System.Linq.dll": {}, + "ref/netcoreapp2.2/System.Memory.dll": {}, + "ref/netcoreapp2.2/System.Net.Http.dll": {}, + "ref/netcoreapp2.2/System.Net.HttpListener.dll": {}, + "ref/netcoreapp2.2/System.Net.Mail.dll": {}, + "ref/netcoreapp2.2/System.Net.NameResolution.dll": {}, + "ref/netcoreapp2.2/System.Net.NetworkInformation.dll": {}, + "ref/netcoreapp2.2/System.Net.Ping.dll": {}, + "ref/netcoreapp2.2/System.Net.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Net.Requests.dll": {}, + "ref/netcoreapp2.2/System.Net.Security.dll": {}, + "ref/netcoreapp2.2/System.Net.ServicePoint.dll": {}, + "ref/netcoreapp2.2/System.Net.Sockets.dll": {}, + "ref/netcoreapp2.2/System.Net.WebClient.dll": {}, + "ref/netcoreapp2.2/System.Net.WebHeaderCollection.dll": {}, + "ref/netcoreapp2.2/System.Net.WebProxy.dll": {}, + "ref/netcoreapp2.2/System.Net.WebSockets.Client.dll": {}, + "ref/netcoreapp2.2/System.Net.WebSockets.dll": {}, + "ref/netcoreapp2.2/System.Net.dll": {}, + "ref/netcoreapp2.2/System.Numerics.Vectors.dll": {}, + "ref/netcoreapp2.2/System.Numerics.dll": {}, + "ref/netcoreapp2.2/System.ObjectModel.dll": {}, + "ref/netcoreapp2.2/System.Reflection.DispatchProxy.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Emit.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Metadata.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Reflection.TypeExtensions.dll": {}, + "ref/netcoreapp2.2/System.Reflection.dll": {}, + "ref/netcoreapp2.2/System.Resources.Reader.dll": {}, + "ref/netcoreapp2.2/System.Resources.ResourceManager.dll": {}, + "ref/netcoreapp2.2/System.Resources.Writer.dll": {}, + "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Handles.dll": {}, + "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.dll": {}, + "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.dll": {}, + "ref/netcoreapp2.2/System.Runtime.InteropServices.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Loader.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Numerics.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Json.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.dll": {}, + "ref/netcoreapp2.2/System.Runtime.dll": {}, + "ref/netcoreapp2.2/System.Security.Claims.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Csp.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.dll": {}, + "ref/netcoreapp2.2/System.Security.Principal.dll": {}, + "ref/netcoreapp2.2/System.Security.SecureString.dll": {}, + "ref/netcoreapp2.2/System.Security.dll": {}, + "ref/netcoreapp2.2/System.ServiceModel.Web.dll": {}, + "ref/netcoreapp2.2/System.ServiceProcess.dll": {}, + "ref/netcoreapp2.2/System.Text.Encoding.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Text.Encoding.dll": {}, + "ref/netcoreapp2.2/System.Text.RegularExpressions.dll": {}, + "ref/netcoreapp2.2/System.Threading.Overlapped.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.dll": {}, + "ref/netcoreapp2.2/System.Threading.Thread.dll": {}, + "ref/netcoreapp2.2/System.Threading.ThreadPool.dll": {}, + "ref/netcoreapp2.2/System.Threading.Timer.dll": {}, + "ref/netcoreapp2.2/System.Threading.dll": {}, + "ref/netcoreapp2.2/System.Transactions.Local.dll": {}, + "ref/netcoreapp2.2/System.Transactions.dll": {}, + "ref/netcoreapp2.2/System.ValueTuple.dll": {}, + "ref/netcoreapp2.2/System.Web.HttpUtility.dll": {}, + "ref/netcoreapp2.2/System.Web.dll": {}, + "ref/netcoreapp2.2/System.Windows.dll": {}, + "ref/netcoreapp2.2/System.Xml.Linq.dll": {}, + "ref/netcoreapp2.2/System.Xml.ReaderWriter.dll": {}, + "ref/netcoreapp2.2/System.Xml.Serialization.dll": {}, + "ref/netcoreapp2.2/System.Xml.XDocument.dll": {}, + "ref/netcoreapp2.2/System.Xml.XPath.XDocument.dll": {}, + "ref/netcoreapp2.2/System.Xml.XPath.dll": {}, + "ref/netcoreapp2.2/System.Xml.XmlDocument.dll": {}, + "ref/netcoreapp2.2/System.Xml.XmlSerializer.dll": {}, + "ref/netcoreapp2.2/System.Xml.dll": {}, + "ref/netcoreapp2.2/System.dll": {}, + "ref/netcoreapp2.2/WindowsBase.dll": {}, + "ref/netcoreapp2.2/mscorlib.dll": {}, + "ref/netcoreapp2.2/netstandard.dll": {} + }, + "build": { + "build/netcoreapp2.2/Microsoft.NETCore.App.props": {}, + "build/netcoreapp2.2/Microsoft.NETCore.App.targets": {} + } + }, + "Microsoft.NETCore.DotNetAppHost/2.2.0": { + "type": "package" + }, + "Microsoft.NETCore.DotNetHostPolicy/2.2.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "2.2.0" + } + }, + "Microsoft.NETCore.DotNetHostResolver/2.2.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetAppHost": "2.2.0" + } + }, + "Microsoft.NETCore.Platforms/2.2.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "Microsoft.NETCore.Targets/2.0.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "Microsoft.Win32.Primitives/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/_._": {} + } + }, + "Microsoft.Win32.Registry/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/_._": {} + }, + "runtimeTargets": { + "runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Registry.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + }, + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + }, + "build": { + "build/netstandard2.0/NETStandard.Library.targets": {} + } + }, + "Newtonsoft.Json/9.0.1": { + "type": "package", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + }, + "compile": { + "lib/netstandard1.0/Newtonsoft.Json.dll": {} + }, + "runtime": { + "lib/netstandard1.0/Newtonsoft.Json.dll": {} + } + }, + "NuGet.Common/5.1.0": { + "type": "package", + "dependencies": { + "NuGet.Frameworks": "5.1.0", + "System.Diagnostics.Process": "4.3.0", + "System.Threading.Thread": "4.3.0" + }, + "compile": { + "lib/netstandard2.0/NuGet.Common.dll": {} + }, + "runtime": { + "lib/netstandard2.0/NuGet.Common.dll": {} + } + }, + "NuGet.Configuration/5.1.0": { + "type": "package", + "dependencies": { + "NuGet.Common": "5.1.0", + "System.Security.Cryptography.ProtectedData": "4.3.0" + }, + "compile": { + "lib/netstandard2.0/NuGet.Configuration.dll": {} + }, + "runtime": { + "lib/netstandard2.0/NuGet.Configuration.dll": {} + } + }, + "NuGet.Frameworks/5.1.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/NuGet.Frameworks.dll": {} + }, + "runtime": { + "lib/netstandard2.0/NuGet.Frameworks.dll": {} + } + }, + "NuGet.Packaging/5.1.0": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "9.0.1", + "NuGet.Configuration": "5.1.0", + "NuGet.Versioning": "5.1.0", + "System.Dynamic.Runtime": "4.3.0" + }, + "compile": { + "lib/netstandard2.0/NuGet.Packaging.dll": {} + }, + "runtime": { + "lib/netstandard2.0/NuGet.Packaging.dll": {} + } + }, + "NuGet.Versioning/5.1.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/NuGet.Versioning.dll": {} + }, + "runtime": { + "lib/netstandard2.0/NuGet.Versioning.dll": {} + } + }, + "runtime.native.System/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + }, + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "System.Collections/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Collections.dll": {} + } + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Diagnostics.Debug.dll": {} + } + }, + "System.Diagnostics.Process/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + }, + "compile": { + "ref/netstandard1.4/System.Diagnostics.Process.dll": {} + }, + "runtimeTargets": { + "runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll": { + "assetType": "runtime", + "rid": "linux" + }, + "runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll": { + "assetType": "runtime", + "rid": "osx" + }, + "runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Diagnostics.Tools/4.0.1": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + }, + "compile": { + "ref/netstandard1.0/_._": {} + } + }, + "System.Dynamic.Runtime/4.3.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Dynamic.Runtime.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Dynamic.Runtime.dll": {} + } + }, + "System.Globalization/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Globalization.dll": {} + } + }, + "System.IO/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "compile": { + "ref/netstandard1.5/System.IO.dll": {} + } + }, + "System.IO.FileSystem/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/_._": {} + } + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "type": "package", + "dependencies": { + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/_._": {} + }, + "runtime": { + "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} + } + }, + "System.Linq/4.3.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + }, + "compile": { + "ref/netstandard1.6/System.Linq.dll": {} + }, + "runtime": { + "lib/netstandard1.6/System.Linq.dll": {} + } + }, + "System.Linq.Expressions/4.3.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "compile": { + "ref/netstandard1.6/System.Linq.Expressions.dll": {} + }, + "runtime": { + "lib/netstandard1.6/System.Linq.Expressions.dll": {} + } + }, + "System.ObjectModel/4.3.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.ObjectModel.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.ObjectModel.dll": {} + } + }, + "System.Reflection/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.5/System.Reflection.dll": {} + } + }, + "System.Reflection.Emit/4.3.0": { + "type": "package", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.1/System.Reflection.Emit.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Reflection.Emit.dll": {} + } + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "type": "package", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {} + } + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "type": "package", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll": {} + } + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.0/System.Reflection.Extensions.dll": {} + } + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.0/System.Reflection.Primitives.dll": {} + } + }, + "System.Reflection.TypeExtensions/4.3.0": { + "type": "package", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.5/_._": {} + }, + "runtime": { + "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} + } + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.0/System.Resources.ResourceManager.dll": {} + } + }, + "System.Runtime/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + }, + "compile": { + "ref/netstandard1.5/System.Runtime.dll": {} + } + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.5/System.Runtime.Extensions.dll": {} + } + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Runtime.Handles.dll": {} + } + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + }, + "compile": { + "ref/netcoreapp1.1/_._": {} + } + }, + "System.Runtime.Serialization.Primitives/4.1.1": { + "type": "package", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + }, + "compile": { + "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} + } + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "type": "package", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/_._": {} + }, + "runtime": { + "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} + } + }, + "System.Security.Cryptography.ProtectedData/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Security.Cryptography.ProtectedData.dll": {} + }, + "runtimeTargets": { + "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.ProtectedData.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.ProtectedData.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Text.Encoding.dll": {} + } + }, + "System.Text.Encoding.Extensions/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": {} + } + }, + "System.Text.RegularExpressions/4.1.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + }, + "compile": { + "ref/netstandard1.6/System.Text.RegularExpressions.dll": {} + }, + "runtime": { + "lib/netstandard1.6/System.Text.RegularExpressions.dll": {} + } + }, + "System.Threading/4.3.0": { + "type": "package", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Threading.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Threading.dll": {} + } + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Threading.Tasks.dll": {} + } + }, + "System.Threading.Tasks.Extensions/4.0.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.0.11", + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + }, + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {} + } + }, + "System.Threading.Thread/4.3.0": { + "type": "package", + "dependencies": { + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/System.Threading.Thread.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Threading.Thread.dll": {} + } + }, + "System.Threading.ThreadPool/4.3.0": { + "type": "package", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/_._": {} + }, + "runtime": { + "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} + } + }, + "System.Xml.ReaderWriter/4.0.11": { + "type": "package", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Extensions": "4.0.0" + }, + "compile": { + "ref/netstandard1.3/System.Xml.ReaderWriter.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Xml.ReaderWriter.dll": {} + } + }, + "System.Xml.XDocument/4.0.11": { + "type": "package", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + }, + "compile": { + "ref/netstandard1.3/System.Xml.XDocument.dll": {} + }, + "runtime": { + "lib/netstandard1.3/System.Xml.XDocument.dll": {} + } + } + } + }, + "libraries": { + "AutoMapper/8.1.1": { + "sha512": "nVzVE1e9EoNFozDVP6RsY26RXbk4cuZJdG/SFB896tumt3b9ljMo3ar2HsgPKE+Pb2ywlVp1y74Bidb+tB9RUA==", + "type": "package", + "path": "automapper/8.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "automapper.8.1.1.nupkg.sha512", + "automapper.nuspec", + "lib/net461/AutoMapper.dll", + "lib/net461/AutoMapper.pdb", + "lib/net461/AutoMapper.xml", + "lib/netstandard2.0/AutoMapper.dll", + "lib/netstandard2.0/AutoMapper.pdb", + "lib/netstandard2.0/AutoMapper.xml" + ] + }, + "Microsoft.CSharp/4.5.0": { + "sha512": "yWWeTbGCzBOlRPWDCIxiTZW1ecZiMbao0ZT97KKEWdBhrLvUqU8RdzkhzuCRQzvoxzxlR7vytO43OOgFdkxv6g==", + "type": "package", + "path": "microsoft.csharp/4.5.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/Microsoft.CSharp.dll", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.3/Microsoft.CSharp.dll", + "lib/netstandard2.0/Microsoft.CSharp.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/uap10.0.16299/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "microsoft.csharp.4.5.0.nupkg.sha512", + "microsoft.csharp.nuspec", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/Microsoft.CSharp.dll", + "ref/netcore50/Microsoft.CSharp.xml", + "ref/netcore50/de/Microsoft.CSharp.xml", + "ref/netcore50/es/Microsoft.CSharp.xml", + "ref/netcore50/fr/Microsoft.CSharp.xml", + "ref/netcore50/it/Microsoft.CSharp.xml", + "ref/netcore50/ja/Microsoft.CSharp.xml", + "ref/netcore50/ko/Microsoft.CSharp.xml", + "ref/netcore50/ru/Microsoft.CSharp.xml", + "ref/netcore50/zh-hans/Microsoft.CSharp.xml", + "ref/netcore50/zh-hant/Microsoft.CSharp.xml", + "ref/netcoreapp2.0/_._", + "ref/netstandard1.0/Microsoft.CSharp.dll", + "ref/netstandard1.0/Microsoft.CSharp.xml", + "ref/netstandard1.0/de/Microsoft.CSharp.xml", + "ref/netstandard1.0/es/Microsoft.CSharp.xml", + "ref/netstandard1.0/fr/Microsoft.CSharp.xml", + "ref/netstandard1.0/it/Microsoft.CSharp.xml", + "ref/netstandard1.0/ja/Microsoft.CSharp.xml", + "ref/netstandard1.0/ko/Microsoft.CSharp.xml", + "ref/netstandard1.0/ru/Microsoft.CSharp.xml", + "ref/netstandard1.0/zh-hans/Microsoft.CSharp.xml", + "ref/netstandard1.0/zh-hant/Microsoft.CSharp.xml", + "ref/netstandard2.0/Microsoft.CSharp.dll", + "ref/netstandard2.0/Microsoft.CSharp.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/uap10.0.16299/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "Microsoft.NETCore.App/2.2.0": { + "sha512": "scu9EtZfMBXAeyTPgiP5l/18xTU6QKDK+UfYWMFM7m5ZuBOPLhqjm+QyX8T6PI5y8exgcNiVd50TflyBl9M/og==", + "type": "package", + "path": "microsoft.netcore.app/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "Microsoft.NETCore.App.versions.txt", + "THIRD-PARTY-NOTICES.TXT", + "build/netcoreapp2.2/Microsoft.NETCore.App.PlatformManifest.txt", + "build/netcoreapp2.2/Microsoft.NETCore.App.props", + "build/netcoreapp2.2/Microsoft.NETCore.App.targets", + "microsoft.netcore.app.2.2.0.nupkg.sha512", + "microsoft.netcore.app.nuspec", + "ref/netcoreapp2.2/Microsoft.CSharp.dll", + "ref/netcoreapp2.2/Microsoft.CSharp.xml", + "ref/netcoreapp2.2/Microsoft.VisualBasic.dll", + "ref/netcoreapp2.2/Microsoft.VisualBasic.xml", + "ref/netcoreapp2.2/Microsoft.Win32.Primitives.dll", + "ref/netcoreapp2.2/Microsoft.Win32.Primitives.xml", + "ref/netcoreapp2.2/System.AppContext.dll", + "ref/netcoreapp2.2/System.Buffers.dll", + "ref/netcoreapp2.2/System.Buffers.xml", + "ref/netcoreapp2.2/System.Collections.Concurrent.dll", + "ref/netcoreapp2.2/System.Collections.Concurrent.xml", + "ref/netcoreapp2.2/System.Collections.Immutable.dll", + "ref/netcoreapp2.2/System.Collections.Immutable.xml", + "ref/netcoreapp2.2/System.Collections.NonGeneric.dll", + "ref/netcoreapp2.2/System.Collections.NonGeneric.xml", + "ref/netcoreapp2.2/System.Collections.Specialized.dll", + "ref/netcoreapp2.2/System.Collections.Specialized.xml", + "ref/netcoreapp2.2/System.Collections.dll", + "ref/netcoreapp2.2/System.Collections.xml", + "ref/netcoreapp2.2/System.ComponentModel.Annotations.dll", + "ref/netcoreapp2.2/System.ComponentModel.Annotations.xml", + "ref/netcoreapp2.2/System.ComponentModel.DataAnnotations.dll", + "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.dll", + "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.xml", + "ref/netcoreapp2.2/System.ComponentModel.Primitives.dll", + "ref/netcoreapp2.2/System.ComponentModel.Primitives.xml", + "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.dll", + "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.xml", + "ref/netcoreapp2.2/System.ComponentModel.dll", + "ref/netcoreapp2.2/System.ComponentModel.xml", + "ref/netcoreapp2.2/System.Configuration.dll", + "ref/netcoreapp2.2/System.Console.dll", + "ref/netcoreapp2.2/System.Console.xml", + "ref/netcoreapp2.2/System.Core.dll", + "ref/netcoreapp2.2/System.Data.Common.dll", + "ref/netcoreapp2.2/System.Data.Common.xml", + "ref/netcoreapp2.2/System.Data.dll", + "ref/netcoreapp2.2/System.Diagnostics.Contracts.dll", + "ref/netcoreapp2.2/System.Diagnostics.Contracts.xml", + "ref/netcoreapp2.2/System.Diagnostics.Debug.dll", + "ref/netcoreapp2.2/System.Diagnostics.Debug.xml", + "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.dll", + "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.xml", + "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.dll", + "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.xml", + "ref/netcoreapp2.2/System.Diagnostics.Process.dll", + "ref/netcoreapp2.2/System.Diagnostics.Process.xml", + "ref/netcoreapp2.2/System.Diagnostics.StackTrace.dll", + "ref/netcoreapp2.2/System.Diagnostics.StackTrace.xml", + "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.dll", + "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.xml", + "ref/netcoreapp2.2/System.Diagnostics.Tools.dll", + "ref/netcoreapp2.2/System.Diagnostics.Tools.xml", + "ref/netcoreapp2.2/System.Diagnostics.TraceSource.dll", + "ref/netcoreapp2.2/System.Diagnostics.TraceSource.xml", + "ref/netcoreapp2.2/System.Diagnostics.Tracing.dll", + "ref/netcoreapp2.2/System.Diagnostics.Tracing.xml", + "ref/netcoreapp2.2/System.Drawing.Primitives.dll", + "ref/netcoreapp2.2/System.Drawing.Primitives.xml", + "ref/netcoreapp2.2/System.Drawing.dll", + "ref/netcoreapp2.2/System.Dynamic.Runtime.dll", + "ref/netcoreapp2.2/System.Globalization.Calendars.dll", + "ref/netcoreapp2.2/System.Globalization.Extensions.dll", + "ref/netcoreapp2.2/System.Globalization.dll", + "ref/netcoreapp2.2/System.IO.Compression.Brotli.dll", + "ref/netcoreapp2.2/System.IO.Compression.FileSystem.dll", + "ref/netcoreapp2.2/System.IO.Compression.ZipFile.dll", + "ref/netcoreapp2.2/System.IO.Compression.ZipFile.xml", + "ref/netcoreapp2.2/System.IO.Compression.dll", + "ref/netcoreapp2.2/System.IO.Compression.xml", + "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.xml", + "ref/netcoreapp2.2/System.IO.FileSystem.Primitives.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.xml", + "ref/netcoreapp2.2/System.IO.FileSystem.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.xml", + "ref/netcoreapp2.2/System.IO.IsolatedStorage.dll", + "ref/netcoreapp2.2/System.IO.IsolatedStorage.xml", + "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.dll", + "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.xml", + "ref/netcoreapp2.2/System.IO.Pipes.dll", + "ref/netcoreapp2.2/System.IO.Pipes.xml", + "ref/netcoreapp2.2/System.IO.UnmanagedMemoryStream.dll", + "ref/netcoreapp2.2/System.IO.dll", + "ref/netcoreapp2.2/System.Linq.Expressions.dll", + "ref/netcoreapp2.2/System.Linq.Expressions.xml", + "ref/netcoreapp2.2/System.Linq.Parallel.dll", + "ref/netcoreapp2.2/System.Linq.Parallel.xml", + "ref/netcoreapp2.2/System.Linq.Queryable.dll", + "ref/netcoreapp2.2/System.Linq.Queryable.xml", + "ref/netcoreapp2.2/System.Linq.dll", + "ref/netcoreapp2.2/System.Linq.xml", + "ref/netcoreapp2.2/System.Memory.dll", + "ref/netcoreapp2.2/System.Memory.xml", + "ref/netcoreapp2.2/System.Net.Http.dll", + "ref/netcoreapp2.2/System.Net.Http.xml", + "ref/netcoreapp2.2/System.Net.HttpListener.dll", + "ref/netcoreapp2.2/System.Net.HttpListener.xml", + "ref/netcoreapp2.2/System.Net.Mail.dll", + "ref/netcoreapp2.2/System.Net.Mail.xml", + "ref/netcoreapp2.2/System.Net.NameResolution.dll", + "ref/netcoreapp2.2/System.Net.NameResolution.xml", + "ref/netcoreapp2.2/System.Net.NetworkInformation.dll", + "ref/netcoreapp2.2/System.Net.NetworkInformation.xml", + "ref/netcoreapp2.2/System.Net.Ping.dll", + "ref/netcoreapp2.2/System.Net.Ping.xml", + "ref/netcoreapp2.2/System.Net.Primitives.dll", + "ref/netcoreapp2.2/System.Net.Primitives.xml", + "ref/netcoreapp2.2/System.Net.Requests.dll", + "ref/netcoreapp2.2/System.Net.Requests.xml", + "ref/netcoreapp2.2/System.Net.Security.dll", + "ref/netcoreapp2.2/System.Net.Security.xml", + "ref/netcoreapp2.2/System.Net.ServicePoint.dll", + "ref/netcoreapp2.2/System.Net.ServicePoint.xml", + "ref/netcoreapp2.2/System.Net.Sockets.dll", + "ref/netcoreapp2.2/System.Net.Sockets.xml", + "ref/netcoreapp2.2/System.Net.WebClient.dll", + "ref/netcoreapp2.2/System.Net.WebClient.xml", + "ref/netcoreapp2.2/System.Net.WebHeaderCollection.dll", + "ref/netcoreapp2.2/System.Net.WebHeaderCollection.xml", + "ref/netcoreapp2.2/System.Net.WebProxy.dll", + "ref/netcoreapp2.2/System.Net.WebProxy.xml", + "ref/netcoreapp2.2/System.Net.WebSockets.Client.dll", + "ref/netcoreapp2.2/System.Net.WebSockets.Client.xml", + "ref/netcoreapp2.2/System.Net.WebSockets.dll", + "ref/netcoreapp2.2/System.Net.WebSockets.xml", + "ref/netcoreapp2.2/System.Net.dll", + "ref/netcoreapp2.2/System.Numerics.Vectors.dll", + "ref/netcoreapp2.2/System.Numerics.Vectors.xml", + "ref/netcoreapp2.2/System.Numerics.dll", + "ref/netcoreapp2.2/System.ObjectModel.dll", + "ref/netcoreapp2.2/System.ObjectModel.xml", + "ref/netcoreapp2.2/System.Reflection.DispatchProxy.dll", + "ref/netcoreapp2.2/System.Reflection.DispatchProxy.xml", + "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.dll", + "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.xml", + "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.dll", + "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.xml", + "ref/netcoreapp2.2/System.Reflection.Emit.dll", + "ref/netcoreapp2.2/System.Reflection.Emit.xml", + "ref/netcoreapp2.2/System.Reflection.Extensions.dll", + "ref/netcoreapp2.2/System.Reflection.Metadata.dll", + "ref/netcoreapp2.2/System.Reflection.Metadata.xml", + "ref/netcoreapp2.2/System.Reflection.Primitives.dll", + "ref/netcoreapp2.2/System.Reflection.Primitives.xml", + "ref/netcoreapp2.2/System.Reflection.TypeExtensions.dll", + "ref/netcoreapp2.2/System.Reflection.TypeExtensions.xml", + "ref/netcoreapp2.2/System.Reflection.dll", + "ref/netcoreapp2.2/System.Resources.Reader.dll", + "ref/netcoreapp2.2/System.Resources.ResourceManager.dll", + "ref/netcoreapp2.2/System.Resources.ResourceManager.xml", + "ref/netcoreapp2.2/System.Resources.Writer.dll", + "ref/netcoreapp2.2/System.Resources.Writer.xml", + "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.dll", + "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.xml", + "ref/netcoreapp2.2/System.Runtime.Extensions.dll", + "ref/netcoreapp2.2/System.Runtime.Extensions.xml", + "ref/netcoreapp2.2/System.Runtime.Handles.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.xml", + "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.xml", + "ref/netcoreapp2.2/System.Runtime.InteropServices.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.xml", + "ref/netcoreapp2.2/System.Runtime.Loader.dll", + "ref/netcoreapp2.2/System.Runtime.Loader.xml", + "ref/netcoreapp2.2/System.Runtime.Numerics.dll", + "ref/netcoreapp2.2/System.Runtime.Numerics.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Json.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Json.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.dll", + "ref/netcoreapp2.2/System.Runtime.dll", + "ref/netcoreapp2.2/System.Runtime.xml", + "ref/netcoreapp2.2/System.Security.Claims.dll", + "ref/netcoreapp2.2/System.Security.Claims.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Csp.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Csp.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.xml", + "ref/netcoreapp2.2/System.Security.Principal.dll", + "ref/netcoreapp2.2/System.Security.Principal.xml", + "ref/netcoreapp2.2/System.Security.SecureString.dll", + "ref/netcoreapp2.2/System.Security.dll", + "ref/netcoreapp2.2/System.ServiceModel.Web.dll", + "ref/netcoreapp2.2/System.ServiceProcess.dll", + "ref/netcoreapp2.2/System.Text.Encoding.Extensions.dll", + "ref/netcoreapp2.2/System.Text.Encoding.Extensions.xml", + "ref/netcoreapp2.2/System.Text.Encoding.dll", + "ref/netcoreapp2.2/System.Text.RegularExpressions.dll", + "ref/netcoreapp2.2/System.Text.RegularExpressions.xml", + "ref/netcoreapp2.2/System.Threading.Overlapped.dll", + "ref/netcoreapp2.2/System.Threading.Overlapped.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.xml", + "ref/netcoreapp2.2/System.Threading.Thread.dll", + "ref/netcoreapp2.2/System.Threading.Thread.xml", + "ref/netcoreapp2.2/System.Threading.ThreadPool.dll", + "ref/netcoreapp2.2/System.Threading.ThreadPool.xml", + "ref/netcoreapp2.2/System.Threading.Timer.dll", + "ref/netcoreapp2.2/System.Threading.Timer.xml", + "ref/netcoreapp2.2/System.Threading.dll", + "ref/netcoreapp2.2/System.Threading.xml", + "ref/netcoreapp2.2/System.Transactions.Local.dll", + "ref/netcoreapp2.2/System.Transactions.Local.xml", + "ref/netcoreapp2.2/System.Transactions.dll", + "ref/netcoreapp2.2/System.ValueTuple.dll", + "ref/netcoreapp2.2/System.Web.HttpUtility.dll", + "ref/netcoreapp2.2/System.Web.HttpUtility.xml", + "ref/netcoreapp2.2/System.Web.dll", + "ref/netcoreapp2.2/System.Windows.dll", + "ref/netcoreapp2.2/System.Xml.Linq.dll", + "ref/netcoreapp2.2/System.Xml.ReaderWriter.dll", + "ref/netcoreapp2.2/System.Xml.ReaderWriter.xml", + "ref/netcoreapp2.2/System.Xml.Serialization.dll", + "ref/netcoreapp2.2/System.Xml.XDocument.dll", + "ref/netcoreapp2.2/System.Xml.XDocument.xml", + "ref/netcoreapp2.2/System.Xml.XPath.XDocument.dll", + "ref/netcoreapp2.2/System.Xml.XPath.XDocument.xml", + "ref/netcoreapp2.2/System.Xml.XPath.dll", + "ref/netcoreapp2.2/System.Xml.XPath.xml", + "ref/netcoreapp2.2/System.Xml.XmlDocument.dll", + "ref/netcoreapp2.2/System.Xml.XmlSerializer.dll", + "ref/netcoreapp2.2/System.Xml.XmlSerializer.xml", + "ref/netcoreapp2.2/System.Xml.dll", + "ref/netcoreapp2.2/System.dll", + "ref/netcoreapp2.2/WindowsBase.dll", + "ref/netcoreapp2.2/mscorlib.dll", + "ref/netcoreapp2.2/netstandard.dll", + "runtime.json" + ] + }, + "Microsoft.NETCore.DotNetAppHost/2.2.0": { + "sha512": "OK/H8p9Ig6mLMITjXJ4VOewrJg/TU+dAPHE4BdMWMv+8COzBehf7XF1+DofKkmqdHpO2cJoS5Sc9PEZ6PKCbsg==", + "type": "package", + "path": "microsoft.netcore.dotnetapphost/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "microsoft.netcore.dotnetapphost.2.2.0.nupkg.sha512", + "microsoft.netcore.dotnetapphost.nuspec", + "runtime.json" + ] + }, + "Microsoft.NETCore.DotNetHostPolicy/2.2.0": { + "sha512": "usINorQD/B8jsNo9V1+MvAkzFj2QE1yNmAuh4vG5Wsd71EjBAVxFTDAb6mmJQI6wO4j11L1VJuOGMV/86JecWg==", + "type": "package", + "path": "microsoft.netcore.dotnethostpolicy/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "microsoft.netcore.dotnethostpolicy.2.2.0.nupkg.sha512", + "microsoft.netcore.dotnethostpolicy.nuspec", + "runtime.json" + ] + }, + "Microsoft.NETCore.DotNetHostResolver/2.2.0": { + "sha512": "oAN5xJhulhZ41AljFUfX9X+BlXQvYekh9IjLbWe10KVFOAnAv0LVbJB+lY1OUsq9TXBi2A2gdEKLqPwJqXdO0g==", + "type": "package", + "path": "microsoft.netcore.dotnethostresolver/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "microsoft.netcore.dotnethostresolver.2.2.0.nupkg.sha512", + "microsoft.netcore.dotnethostresolver.nuspec", + "runtime.json" + ] + }, + "Microsoft.NETCore.Platforms/2.2.0": { + "sha512": "whK/5p0sLtQiDbcTphVRjmN3tmV+YMYf8vuaKU05y1iZw9KWiG/iLY5Pd3ok+vFBJ+FZnmp7NqF7o7WrAYToLg==", + "type": "package", + "path": "microsoft.netcore.platforms/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.0/_._", + "microsoft.netcore.platforms.2.2.0.nupkg.sha512", + "microsoft.netcore.platforms.nuspec", + "runtime.json", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "Microsoft.NETCore.Targets/2.0.0": { + "sha512": "mJnCMoBfWL0lxxlBFJ/8cZKTfPpI82TekZkUqvSCBtunUaaqr2LVeWl1zQYdanAdk4Ddf1HCwb8+DNYaNFBk1w==", + "type": "package", + "path": "microsoft.netcore.targets/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.0/_._", + "microsoft.netcore.targets.2.0.0.nupkg.sha512", + "microsoft.netcore.targets.nuspec", + "runtime.json", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "Microsoft.Win32.Primitives/4.3.0": { + "sha512": "Nm8Hp51y9tYcK3xD6qk43Wjftrg1mdH24CCJsTb6gr7HS21U1uA+CKPGEtUcVZbjU1y8Kynzm5eoJ7Pnx5gm8A==", + "type": "package", + "path": "microsoft.win32.primitives/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/Microsoft.Win32.Primitives.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "microsoft.win32.primitives.4.3.0.nupkg.sha512", + "microsoft.win32.primitives.nuspec", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/Microsoft.Win32.Primitives.dll", + "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", + "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", + "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._" + ] + }, + "Microsoft.Win32.Registry/4.3.0": { + "sha512": "OHAvcu6tVh40PncTYFkpLItsw9O8sUc59C4eqSqEd+U5rY7t0+u7Xoi6Mw2QOfvPJ2HUJlwIEVqxklDIfn757Q==", + "type": "package", + "path": "microsoft.win32.registry/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/net46/Microsoft.Win32.Registry.dll", + "microsoft.win32.registry.4.3.0.nupkg.sha512", + "microsoft.win32.registry.nuspec", + "ref/net46/Microsoft.Win32.Registry.dll", + "ref/netstandard1.3/Microsoft.Win32.Registry.dll", + "ref/netstandard1.3/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/de/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/es/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/it/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml", + "ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml", + "runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Registry.dll", + "runtimes/win/lib/net46/Microsoft.Win32.Registry.dll", + "runtimes/win/lib/netcore50/_._", + "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll" + ] + }, + "NETStandard.Library/2.0.3": { + "sha512": "548M6mnBSJWxsIlkQHfbzoYxpiYFXZZSL00p4GHYv8PkiqFBnnT68mW5mGEsA/ch9fDO9GkPgkFQpWiXZN7mAQ==", + "type": "package", + "path": "netstandard.library/2.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "build/netstandard2.0/NETStandard.Library.targets", + "build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll", + "build/netstandard2.0/ref/System.AppContext.dll", + "build/netstandard2.0/ref/System.Collections.Concurrent.dll", + "build/netstandard2.0/ref/System.Collections.NonGeneric.dll", + "build/netstandard2.0/ref/System.Collections.Specialized.dll", + "build/netstandard2.0/ref/System.Collections.dll", + "build/netstandard2.0/ref/System.ComponentModel.Composition.dll", + "build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll", + "build/netstandard2.0/ref/System.ComponentModel.Primitives.dll", + "build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll", + "build/netstandard2.0/ref/System.ComponentModel.dll", + "build/netstandard2.0/ref/System.Console.dll", + "build/netstandard2.0/ref/System.Core.dll", + "build/netstandard2.0/ref/System.Data.Common.dll", + "build/netstandard2.0/ref/System.Data.dll", + "build/netstandard2.0/ref/System.Diagnostics.Contracts.dll", + "build/netstandard2.0/ref/System.Diagnostics.Debug.dll", + "build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll", + "build/netstandard2.0/ref/System.Diagnostics.Process.dll", + "build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll", + "build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll", + "build/netstandard2.0/ref/System.Diagnostics.Tools.dll", + "build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll", + "build/netstandard2.0/ref/System.Diagnostics.Tracing.dll", + "build/netstandard2.0/ref/System.Drawing.Primitives.dll", + "build/netstandard2.0/ref/System.Drawing.dll", + "build/netstandard2.0/ref/System.Dynamic.Runtime.dll", + "build/netstandard2.0/ref/System.Globalization.Calendars.dll", + "build/netstandard2.0/ref/System.Globalization.Extensions.dll", + "build/netstandard2.0/ref/System.Globalization.dll", + "build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll", + "build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll", + "build/netstandard2.0/ref/System.IO.Compression.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.dll", + "build/netstandard2.0/ref/System.IO.IsolatedStorage.dll", + "build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll", + "build/netstandard2.0/ref/System.IO.Pipes.dll", + "build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll", + "build/netstandard2.0/ref/System.IO.dll", + "build/netstandard2.0/ref/System.Linq.Expressions.dll", + "build/netstandard2.0/ref/System.Linq.Parallel.dll", + "build/netstandard2.0/ref/System.Linq.Queryable.dll", + "build/netstandard2.0/ref/System.Linq.dll", + "build/netstandard2.0/ref/System.Net.Http.dll", + "build/netstandard2.0/ref/System.Net.NameResolution.dll", + "build/netstandard2.0/ref/System.Net.NetworkInformation.dll", + "build/netstandard2.0/ref/System.Net.Ping.dll", + "build/netstandard2.0/ref/System.Net.Primitives.dll", + "build/netstandard2.0/ref/System.Net.Requests.dll", + "build/netstandard2.0/ref/System.Net.Security.dll", + "build/netstandard2.0/ref/System.Net.Sockets.dll", + "build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll", + "build/netstandard2.0/ref/System.Net.WebSockets.Client.dll", + "build/netstandard2.0/ref/System.Net.WebSockets.dll", + "build/netstandard2.0/ref/System.Net.dll", + "build/netstandard2.0/ref/System.Numerics.dll", + "build/netstandard2.0/ref/System.ObjectModel.dll", + "build/netstandard2.0/ref/System.Reflection.Extensions.dll", + "build/netstandard2.0/ref/System.Reflection.Primitives.dll", + "build/netstandard2.0/ref/System.Reflection.dll", + "build/netstandard2.0/ref/System.Resources.Reader.dll", + "build/netstandard2.0/ref/System.Resources.ResourceManager.dll", + "build/netstandard2.0/ref/System.Resources.Writer.dll", + "build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll", + "build/netstandard2.0/ref/System.Runtime.Extensions.dll", + "build/netstandard2.0/ref/System.Runtime.Handles.dll", + "build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll", + "build/netstandard2.0/ref/System.Runtime.InteropServices.dll", + "build/netstandard2.0/ref/System.Runtime.Numerics.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.dll", + "build/netstandard2.0/ref/System.Runtime.dll", + "build/netstandard2.0/ref/System.Security.Claims.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll", + "build/netstandard2.0/ref/System.Security.Principal.dll", + "build/netstandard2.0/ref/System.Security.SecureString.dll", + "build/netstandard2.0/ref/System.ServiceModel.Web.dll", + "build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll", + "build/netstandard2.0/ref/System.Text.Encoding.dll", + "build/netstandard2.0/ref/System.Text.RegularExpressions.dll", + "build/netstandard2.0/ref/System.Threading.Overlapped.dll", + "build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll", + "build/netstandard2.0/ref/System.Threading.Tasks.dll", + "build/netstandard2.0/ref/System.Threading.Thread.dll", + "build/netstandard2.0/ref/System.Threading.ThreadPool.dll", + "build/netstandard2.0/ref/System.Threading.Timer.dll", + "build/netstandard2.0/ref/System.Threading.dll", + "build/netstandard2.0/ref/System.Transactions.dll", + "build/netstandard2.0/ref/System.ValueTuple.dll", + "build/netstandard2.0/ref/System.Web.dll", + "build/netstandard2.0/ref/System.Windows.dll", + "build/netstandard2.0/ref/System.Xml.Linq.dll", + "build/netstandard2.0/ref/System.Xml.ReaderWriter.dll", + "build/netstandard2.0/ref/System.Xml.Serialization.dll", + "build/netstandard2.0/ref/System.Xml.XDocument.dll", + "build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll", + "build/netstandard2.0/ref/System.Xml.XPath.dll", + "build/netstandard2.0/ref/System.Xml.XmlDocument.dll", + "build/netstandard2.0/ref/System.Xml.XmlSerializer.dll", + "build/netstandard2.0/ref/System.Xml.dll", + "build/netstandard2.0/ref/System.dll", + "build/netstandard2.0/ref/mscorlib.dll", + "build/netstandard2.0/ref/netstandard.dll", + "build/netstandard2.0/ref/netstandard.xml", + "lib/netstandard1.0/_._", + "netstandard.library.2.0.3.nupkg.sha512", + "netstandard.library.nuspec" + ] + }, + "Newtonsoft.Json/9.0.1": { + "sha512": "2okXpTRwUcgQb06put5LwwCjtgoFo74zkPksjcvOpnIjx7TagGW5IoBCAA4luZx1+tfiIhoNqoiI7Y7zwWGyKA==", + "type": "package", + "path": "newtonsoft.json/9.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.dll", + "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.xml", + "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll", + "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.xml", + "newtonsoft.json.9.0.1.nupkg.sha512", + "newtonsoft.json.nuspec", + "tools/install.ps1" + ] + }, + "NuGet.Common/5.1.0": { + "sha512": "rmI+Tvtwuohc3jyT3uqbR5YihSt1IoL0H5PZh2CMjTcj3XJgi5G3SXQ3WLN53SJ/GOAK2SWifqdgiNuckn9MoA==", + "type": "package", + "path": "nuget.common/5.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net472/NuGet.Common.dll", + "lib/net472/NuGet.Common.xml", + "lib/netstandard2.0/NuGet.Common.dll", + "lib/netstandard2.0/NuGet.Common.xml", + "nuget.common.5.1.0.nupkg.sha512", + "nuget.common.nuspec" + ] + }, + "NuGet.Configuration/5.1.0": { + "sha512": "Qqr+wjYtuZLkbKEaRqIr3/ECaX/oZZ5StQR9F4jKMI0AtFmir/fwvasoszfZ92hQ6ucDa9F1Q2KQFyZyyZmBYw==", + "type": "package", + "path": "nuget.configuration/5.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net472/NuGet.Configuration.dll", + "lib/net472/NuGet.Configuration.xml", + "lib/netstandard2.0/NuGet.Configuration.dll", + "lib/netstandard2.0/NuGet.Configuration.xml", + "nuget.configuration.5.1.0.nupkg.sha512", + "nuget.configuration.nuspec" + ] + }, + "NuGet.Frameworks/5.1.0": { + "sha512": "Poun+0+l2xonuDXpK5al4/DAG99X4LM4xUyP1gm0L6Jn4YasynzB40QYBnEb7gAlnsiuauEW+uPHsp2ri4UNJg==", + "type": "package", + "path": "nuget.frameworks/5.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net40/NuGet.Frameworks.dll", + "lib/net40/NuGet.Frameworks.xml", + "lib/net472/NuGet.Frameworks.dll", + "lib/net472/NuGet.Frameworks.xml", + "lib/netstandard2.0/NuGet.Frameworks.dll", + "lib/netstandard2.0/NuGet.Frameworks.xml", + "nuget.frameworks.5.1.0.nupkg.sha512", + "nuget.frameworks.nuspec" + ] + }, + "NuGet.Packaging/5.1.0": { + "sha512": "x6jSzuuOB7a89j3xga1Ogdnr/C0+Cmeog+uFo82Unjk2RYejpecqj+H7SReY1+1FflxeZCyxAKgPGCRp8VXwxg==", + "type": "package", + "path": "nuget.packaging/5.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net472/NuGet.Packaging.dll", + "lib/net472/NuGet.Packaging.xml", + "lib/netstandard2.0/NuGet.Packaging.dll", + "lib/netstandard2.0/NuGet.Packaging.xml", + "nuget.packaging.5.1.0.nupkg.sha512", + "nuget.packaging.nuspec" + ] + }, + "NuGet.Versioning/5.1.0": { + "sha512": "2o93k2KlnvEjYODhgOBfVxeGlVvTAnnsRxclsgu6qyCqu6EDHydmqaTvHNQ/kO7TXQVEPc/nj8Aphw9I4cpnXw==", + "type": "package", + "path": "nuget.versioning/5.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net472/NuGet.Versioning.dll", + "lib/net472/NuGet.Versioning.xml", + "lib/netstandard2.0/NuGet.Versioning.dll", + "lib/netstandard2.0/NuGet.Versioning.xml", + "nuget.versioning.5.1.0.nupkg.sha512", + "nuget.versioning.nuspec" + ] + }, + "runtime.native.System/4.3.0": { + "sha512": "KZxalv/9yvGXLj49HHJ4N9GKyeiMt5wJkU8S/x3nKA3/EMkjKkmhwdO6d4Wlz3byjJ3OQU8KKlZ2iN5/1TMdyA==", + "type": "package", + "path": "runtime.native.system/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/netstandard1.0/_._", + "runtime.native.system.4.3.0.nupkg.sha512", + "runtime.native.system.nuspec" + ] + }, + "System.Collections/4.3.0": { + "sha512": "ynuVLTDaFIfKTkOqUigXte4m5+EFNwYoEBEvxnp1EnZsOdQC85S7BCbREIu8+bu2Tpzh9a9zbvIVpRo15V8FGw==", + "type": "package", + "path": "system.collections/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Collections.dll", + "ref/netcore50/System.Collections.xml", + "ref/netcore50/de/System.Collections.xml", + "ref/netcore50/es/System.Collections.xml", + "ref/netcore50/fr/System.Collections.xml", + "ref/netcore50/it/System.Collections.xml", + "ref/netcore50/ja/System.Collections.xml", + "ref/netcore50/ko/System.Collections.xml", + "ref/netcore50/ru/System.Collections.xml", + "ref/netcore50/zh-hans/System.Collections.xml", + "ref/netcore50/zh-hant/System.Collections.xml", + "ref/netstandard1.0/System.Collections.dll", + "ref/netstandard1.0/System.Collections.xml", + "ref/netstandard1.0/de/System.Collections.xml", + "ref/netstandard1.0/es/System.Collections.xml", + "ref/netstandard1.0/fr/System.Collections.xml", + "ref/netstandard1.0/it/System.Collections.xml", + "ref/netstandard1.0/ja/System.Collections.xml", + "ref/netstandard1.0/ko/System.Collections.xml", + "ref/netstandard1.0/ru/System.Collections.xml", + "ref/netstandard1.0/zh-hans/System.Collections.xml", + "ref/netstandard1.0/zh-hant/System.Collections.xml", + "ref/netstandard1.3/System.Collections.dll", + "ref/netstandard1.3/System.Collections.xml", + "ref/netstandard1.3/de/System.Collections.xml", + "ref/netstandard1.3/es/System.Collections.xml", + "ref/netstandard1.3/fr/System.Collections.xml", + "ref/netstandard1.3/it/System.Collections.xml", + "ref/netstandard1.3/ja/System.Collections.xml", + "ref/netstandard1.3/ko/System.Collections.xml", + "ref/netstandard1.3/ru/System.Collections.xml", + "ref/netstandard1.3/zh-hans/System.Collections.xml", + "ref/netstandard1.3/zh-hant/System.Collections.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.collections.4.3.0.nupkg.sha512", + "system.collections.nuspec" + ] + }, + "System.Diagnostics.Debug/4.3.0": { + "sha512": "bFj+HjYY5/h2hMHOp+/H07Gb19+NJTX54ntixS9EHxG2eyEiXWvNYvQJ4CwqFiMcTbGb4zuPq1ubClyGYN2rJA==", + "type": "package", + "path": "system.diagnostics.debug/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Diagnostics.Debug.dll", + "ref/netcore50/System.Diagnostics.Debug.xml", + "ref/netcore50/de/System.Diagnostics.Debug.xml", + "ref/netcore50/es/System.Diagnostics.Debug.xml", + "ref/netcore50/fr/System.Diagnostics.Debug.xml", + "ref/netcore50/it/System.Diagnostics.Debug.xml", + "ref/netcore50/ja/System.Diagnostics.Debug.xml", + "ref/netcore50/ko/System.Diagnostics.Debug.xml", + "ref/netcore50/ru/System.Diagnostics.Debug.xml", + "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", + "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/System.Diagnostics.Debug.dll", + "ref/netstandard1.0/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", + "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/System.Diagnostics.Debug.dll", + "ref/netstandard1.3/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", + "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.diagnostics.debug.4.3.0.nupkg.sha512", + "system.diagnostics.debug.nuspec" + ] + }, + "System.Diagnostics.Process/4.3.0": { + "sha512": "gFvIaiWxt33En3oUVkzSYUzKoOm8abV8IbM53HPOfLZBLD9yRdDxvqRihK/1ySRkFp5NZIXd4cYWsY0ybnvANg==", + "type": "package", + "path": "system.diagnostics.process/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Diagnostics.Process.dll", + "lib/net461/System.Diagnostics.Process.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Diagnostics.Process.dll", + "ref/net461/System.Diagnostics.Process.dll", + "ref/netstandard1.3/System.Diagnostics.Process.dll", + "ref/netstandard1.3/System.Diagnostics.Process.xml", + "ref/netstandard1.3/de/System.Diagnostics.Process.xml", + "ref/netstandard1.3/es/System.Diagnostics.Process.xml", + "ref/netstandard1.3/fr/System.Diagnostics.Process.xml", + "ref/netstandard1.3/it/System.Diagnostics.Process.xml", + "ref/netstandard1.3/ja/System.Diagnostics.Process.xml", + "ref/netstandard1.3/ko/System.Diagnostics.Process.xml", + "ref/netstandard1.3/ru/System.Diagnostics.Process.xml", + "ref/netstandard1.3/zh-hans/System.Diagnostics.Process.xml", + "ref/netstandard1.3/zh-hant/System.Diagnostics.Process.xml", + "ref/netstandard1.4/System.Diagnostics.Process.dll", + "ref/netstandard1.4/System.Diagnostics.Process.xml", + "ref/netstandard1.4/de/System.Diagnostics.Process.xml", + "ref/netstandard1.4/es/System.Diagnostics.Process.xml", + "ref/netstandard1.4/fr/System.Diagnostics.Process.xml", + "ref/netstandard1.4/it/System.Diagnostics.Process.xml", + "ref/netstandard1.4/ja/System.Diagnostics.Process.xml", + "ref/netstandard1.4/ko/System.Diagnostics.Process.xml", + "ref/netstandard1.4/ru/System.Diagnostics.Process.xml", + "ref/netstandard1.4/zh-hans/System.Diagnostics.Process.xml", + "ref/netstandard1.4/zh-hant/System.Diagnostics.Process.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll", + "runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll", + "runtimes/win/lib/net46/System.Diagnostics.Process.dll", + "runtimes/win/lib/net461/System.Diagnostics.Process.dll", + "runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll", + "runtimes/win7/lib/netcore50/_._", + "system.diagnostics.process.4.3.0.nupkg.sha512", + "system.diagnostics.process.nuspec" + ] + }, + "System.Diagnostics.Tools/4.0.1": { + "sha512": "qBLMu90KZutXB1Eh6mMypSaAPviDyp+LBkMdZmitUO/RNiT6h9+vau0DxlL3lcL/ufqdmJWi+vqW7KYUy/hs2w==", + "type": "package", + "path": "system.diagnostics.tools/4.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Diagnostics.Tools.dll", + "ref/netcore50/System.Diagnostics.Tools.xml", + "ref/netcore50/de/System.Diagnostics.Tools.xml", + "ref/netcore50/es/System.Diagnostics.Tools.xml", + "ref/netcore50/fr/System.Diagnostics.Tools.xml", + "ref/netcore50/it/System.Diagnostics.Tools.xml", + "ref/netcore50/ja/System.Diagnostics.Tools.xml", + "ref/netcore50/ko/System.Diagnostics.Tools.xml", + "ref/netcore50/ru/System.Diagnostics.Tools.xml", + "ref/netcore50/zh-hans/System.Diagnostics.Tools.xml", + "ref/netcore50/zh-hant/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/System.Diagnostics.Tools.dll", + "ref/netstandard1.0/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/de/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/es/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/fr/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/it/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/ja/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/ko/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/ru/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/zh-hans/System.Diagnostics.Tools.xml", + "ref/netstandard1.0/zh-hant/System.Diagnostics.Tools.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.diagnostics.tools.4.0.1.nupkg.sha512", + "system.diagnostics.tools.nuspec" + ] + }, + "System.Dynamic.Runtime/4.3.0": { + "sha512": "VERv7pT0MsuP047BDJKah7MHp28VKi6doRupnEHOsPZZE88hiUSZDw4SLU+FiUUJHpgGyEwCha2h/Mk5M30w6g==", + "type": "package", + "path": "system.dynamic.runtime/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Dynamic.Runtime.dll", + "lib/netstandard1.3/System.Dynamic.Runtime.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Dynamic.Runtime.dll", + "ref/netcore50/System.Dynamic.Runtime.xml", + "ref/netcore50/de/System.Dynamic.Runtime.xml", + "ref/netcore50/es/System.Dynamic.Runtime.xml", + "ref/netcore50/fr/System.Dynamic.Runtime.xml", + "ref/netcore50/it/System.Dynamic.Runtime.xml", + "ref/netcore50/ja/System.Dynamic.Runtime.xml", + "ref/netcore50/ko/System.Dynamic.Runtime.xml", + "ref/netcore50/ru/System.Dynamic.Runtime.xml", + "ref/netcore50/zh-hans/System.Dynamic.Runtime.xml", + "ref/netcore50/zh-hant/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/System.Dynamic.Runtime.dll", + "ref/netstandard1.0/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/de/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/es/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/fr/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/it/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/ja/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/ko/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/ru/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/zh-hans/System.Dynamic.Runtime.xml", + "ref/netstandard1.0/zh-hant/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/System.Dynamic.Runtime.dll", + "ref/netstandard1.3/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/de/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/es/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/fr/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/it/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/ja/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/ko/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/ru/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/zh-hans/System.Dynamic.Runtime.xml", + "ref/netstandard1.3/zh-hant/System.Dynamic.Runtime.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/System.Dynamic.Runtime.dll", + "system.dynamic.runtime.4.3.0.nupkg.sha512", + "system.dynamic.runtime.nuspec" + ] + }, + "System.Globalization/4.3.0": { + "sha512": "gj0rowjLBztAoxRuzM0Nn9exYVrD+++xb3PYc+QR/YHDvch98gbT3H4vFMnNU6r8poSjVwwlRxKAqtqN6AXs4g==", + "type": "package", + "path": "system.globalization/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Globalization.dll", + "ref/netcore50/System.Globalization.xml", + "ref/netcore50/de/System.Globalization.xml", + "ref/netcore50/es/System.Globalization.xml", + "ref/netcore50/fr/System.Globalization.xml", + "ref/netcore50/it/System.Globalization.xml", + "ref/netcore50/ja/System.Globalization.xml", + "ref/netcore50/ko/System.Globalization.xml", + "ref/netcore50/ru/System.Globalization.xml", + "ref/netcore50/zh-hans/System.Globalization.xml", + "ref/netcore50/zh-hant/System.Globalization.xml", + "ref/netstandard1.0/System.Globalization.dll", + "ref/netstandard1.0/System.Globalization.xml", + "ref/netstandard1.0/de/System.Globalization.xml", + "ref/netstandard1.0/es/System.Globalization.xml", + "ref/netstandard1.0/fr/System.Globalization.xml", + "ref/netstandard1.0/it/System.Globalization.xml", + "ref/netstandard1.0/ja/System.Globalization.xml", + "ref/netstandard1.0/ko/System.Globalization.xml", + "ref/netstandard1.0/ru/System.Globalization.xml", + "ref/netstandard1.0/zh-hans/System.Globalization.xml", + "ref/netstandard1.0/zh-hant/System.Globalization.xml", + "ref/netstandard1.3/System.Globalization.dll", + "ref/netstandard1.3/System.Globalization.xml", + "ref/netstandard1.3/de/System.Globalization.xml", + "ref/netstandard1.3/es/System.Globalization.xml", + "ref/netstandard1.3/fr/System.Globalization.xml", + "ref/netstandard1.3/it/System.Globalization.xml", + "ref/netstandard1.3/ja/System.Globalization.xml", + "ref/netstandard1.3/ko/System.Globalization.xml", + "ref/netstandard1.3/ru/System.Globalization.xml", + "ref/netstandard1.3/zh-hans/System.Globalization.xml", + "ref/netstandard1.3/zh-hant/System.Globalization.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.globalization.4.3.0.nupkg.sha512", + "system.globalization.nuspec" + ] + }, + "System.IO/4.3.0": { + "sha512": "v8paIePhmGuXZbE9xvvNb4uJ5ME4OFXR1+8la/G/L1GIl2nbU2WFnddgb79kVK3U2us7q1aZT/uY/R0D/ovB5g==", + "type": "package", + "path": "system.io/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.IO.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.IO.dll", + "ref/netcore50/System.IO.dll", + "ref/netcore50/System.IO.xml", + "ref/netcore50/de/System.IO.xml", + "ref/netcore50/es/System.IO.xml", + "ref/netcore50/fr/System.IO.xml", + "ref/netcore50/it/System.IO.xml", + "ref/netcore50/ja/System.IO.xml", + "ref/netcore50/ko/System.IO.xml", + "ref/netcore50/ru/System.IO.xml", + "ref/netcore50/zh-hans/System.IO.xml", + "ref/netcore50/zh-hant/System.IO.xml", + "ref/netstandard1.0/System.IO.dll", + "ref/netstandard1.0/System.IO.xml", + "ref/netstandard1.0/de/System.IO.xml", + "ref/netstandard1.0/es/System.IO.xml", + "ref/netstandard1.0/fr/System.IO.xml", + "ref/netstandard1.0/it/System.IO.xml", + "ref/netstandard1.0/ja/System.IO.xml", + "ref/netstandard1.0/ko/System.IO.xml", + "ref/netstandard1.0/ru/System.IO.xml", + "ref/netstandard1.0/zh-hans/System.IO.xml", + "ref/netstandard1.0/zh-hant/System.IO.xml", + "ref/netstandard1.3/System.IO.dll", + "ref/netstandard1.3/System.IO.xml", + "ref/netstandard1.3/de/System.IO.xml", + "ref/netstandard1.3/es/System.IO.xml", + "ref/netstandard1.3/fr/System.IO.xml", + "ref/netstandard1.3/it/System.IO.xml", + "ref/netstandard1.3/ja/System.IO.xml", + "ref/netstandard1.3/ko/System.IO.xml", + "ref/netstandard1.3/ru/System.IO.xml", + "ref/netstandard1.3/zh-hans/System.IO.xml", + "ref/netstandard1.3/zh-hant/System.IO.xml", + "ref/netstandard1.5/System.IO.dll", + "ref/netstandard1.5/System.IO.xml", + "ref/netstandard1.5/de/System.IO.xml", + "ref/netstandard1.5/es/System.IO.xml", + "ref/netstandard1.5/fr/System.IO.xml", + "ref/netstandard1.5/it/System.IO.xml", + "ref/netstandard1.5/ja/System.IO.xml", + "ref/netstandard1.5/ko/System.IO.xml", + "ref/netstandard1.5/ru/System.IO.xml", + "ref/netstandard1.5/zh-hans/System.IO.xml", + "ref/netstandard1.5/zh-hant/System.IO.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.io.4.3.0.nupkg.sha512", + "system.io.nuspec" + ] + }, + "System.IO.FileSystem/4.3.0": { + "sha512": "T7WB1vhblSmgkaDpdGM3Uqo55Qsr5sip5eyowrwiXOoHBkzOx3ePd9+Zh97r9NzOwFCxqX7awO6RBxQuao7n7g==", + "type": "package", + "path": "system.io.filesystem/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.IO.FileSystem.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.IO.FileSystem.dll", + "ref/netstandard1.3/System.IO.FileSystem.dll", + "ref/netstandard1.3/System.IO.FileSystem.xml", + "ref/netstandard1.3/de/System.IO.FileSystem.xml", + "ref/netstandard1.3/es/System.IO.FileSystem.xml", + "ref/netstandard1.3/fr/System.IO.FileSystem.xml", + "ref/netstandard1.3/it/System.IO.FileSystem.xml", + "ref/netstandard1.3/ja/System.IO.FileSystem.xml", + "ref/netstandard1.3/ko/System.IO.FileSystem.xml", + "ref/netstandard1.3/ru/System.IO.FileSystem.xml", + "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", + "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.io.filesystem.4.3.0.nupkg.sha512", + "system.io.filesystem.nuspec" + ] + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "sha512": "WIWVPQlYLP/Zc9I6IakpBk1y8ryVGK83MtZx//zGKKi2hvHQWKAB7moRQCOz5Is/wNDksiYpocf3FeA3le6e5Q==", + "type": "package", + "path": "system.io.filesystem.primitives/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.IO.FileSystem.Primitives.dll", + "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.IO.FileSystem.Primitives.dll", + "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", + "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", + "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.io.filesystem.primitives.4.3.0.nupkg.sha512", + "system.io.filesystem.primitives.nuspec" + ] + }, + "System.Linq/4.3.0": { + "sha512": "6sx/4exSb0BfW6DmcfYW0OW+nBgo1UOp4vjGXfQJnWsupKn6LNrk80sXDcNxQvYOJn4TfKOfNQKB7XDS3GIEWA==", + "type": "package", + "path": "system.linq/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net463/System.Linq.dll", + "lib/netcore50/System.Linq.dll", + "lib/netstandard1.6/System.Linq.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net463/System.Linq.dll", + "ref/netcore50/System.Linq.dll", + "ref/netcore50/System.Linq.xml", + "ref/netcore50/de/System.Linq.xml", + "ref/netcore50/es/System.Linq.xml", + "ref/netcore50/fr/System.Linq.xml", + "ref/netcore50/it/System.Linq.xml", + "ref/netcore50/ja/System.Linq.xml", + "ref/netcore50/ko/System.Linq.xml", + "ref/netcore50/ru/System.Linq.xml", + "ref/netcore50/zh-hans/System.Linq.xml", + "ref/netcore50/zh-hant/System.Linq.xml", + "ref/netstandard1.0/System.Linq.dll", + "ref/netstandard1.0/System.Linq.xml", + "ref/netstandard1.0/de/System.Linq.xml", + "ref/netstandard1.0/es/System.Linq.xml", + "ref/netstandard1.0/fr/System.Linq.xml", + "ref/netstandard1.0/it/System.Linq.xml", + "ref/netstandard1.0/ja/System.Linq.xml", + "ref/netstandard1.0/ko/System.Linq.xml", + "ref/netstandard1.0/ru/System.Linq.xml", + "ref/netstandard1.0/zh-hans/System.Linq.xml", + "ref/netstandard1.0/zh-hant/System.Linq.xml", + "ref/netstandard1.6/System.Linq.dll", + "ref/netstandard1.6/System.Linq.xml", + "ref/netstandard1.6/de/System.Linq.xml", + "ref/netstandard1.6/es/System.Linq.xml", + "ref/netstandard1.6/fr/System.Linq.xml", + "ref/netstandard1.6/it/System.Linq.xml", + "ref/netstandard1.6/ja/System.Linq.xml", + "ref/netstandard1.6/ko/System.Linq.xml", + "ref/netstandard1.6/ru/System.Linq.xml", + "ref/netstandard1.6/zh-hans/System.Linq.xml", + "ref/netstandard1.6/zh-hant/System.Linq.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.linq.4.3.0.nupkg.sha512", + "system.linq.nuspec" + ] + }, + "System.Linq.Expressions/4.3.0": { + "sha512": "YbkO+a5vd5+8intkg+6PVEnN0FyBsFI19wRH5lanOyqrfDQXhLmZ91MjdHRKcuLDpc0TgA6iNBf6wyzPrlzebQ==", + "type": "package", + "path": "system.linq.expressions/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net463/System.Linq.Expressions.dll", + "lib/netcore50/System.Linq.Expressions.dll", + "lib/netstandard1.6/System.Linq.Expressions.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net463/System.Linq.Expressions.dll", + "ref/netcore50/System.Linq.Expressions.dll", + "ref/netcore50/System.Linq.Expressions.xml", + "ref/netcore50/de/System.Linq.Expressions.xml", + "ref/netcore50/es/System.Linq.Expressions.xml", + "ref/netcore50/fr/System.Linq.Expressions.xml", + "ref/netcore50/it/System.Linq.Expressions.xml", + "ref/netcore50/ja/System.Linq.Expressions.xml", + "ref/netcore50/ko/System.Linq.Expressions.xml", + "ref/netcore50/ru/System.Linq.Expressions.xml", + "ref/netcore50/zh-hans/System.Linq.Expressions.xml", + "ref/netcore50/zh-hant/System.Linq.Expressions.xml", + "ref/netstandard1.0/System.Linq.Expressions.dll", + "ref/netstandard1.0/System.Linq.Expressions.xml", + "ref/netstandard1.0/de/System.Linq.Expressions.xml", + "ref/netstandard1.0/es/System.Linq.Expressions.xml", + "ref/netstandard1.0/fr/System.Linq.Expressions.xml", + "ref/netstandard1.0/it/System.Linq.Expressions.xml", + "ref/netstandard1.0/ja/System.Linq.Expressions.xml", + "ref/netstandard1.0/ko/System.Linq.Expressions.xml", + "ref/netstandard1.0/ru/System.Linq.Expressions.xml", + "ref/netstandard1.0/zh-hans/System.Linq.Expressions.xml", + "ref/netstandard1.0/zh-hant/System.Linq.Expressions.xml", + "ref/netstandard1.3/System.Linq.Expressions.dll", + "ref/netstandard1.3/System.Linq.Expressions.xml", + "ref/netstandard1.3/de/System.Linq.Expressions.xml", + "ref/netstandard1.3/es/System.Linq.Expressions.xml", + "ref/netstandard1.3/fr/System.Linq.Expressions.xml", + "ref/netstandard1.3/it/System.Linq.Expressions.xml", + "ref/netstandard1.3/ja/System.Linq.Expressions.xml", + "ref/netstandard1.3/ko/System.Linq.Expressions.xml", + "ref/netstandard1.3/ru/System.Linq.Expressions.xml", + "ref/netstandard1.3/zh-hans/System.Linq.Expressions.xml", + "ref/netstandard1.3/zh-hant/System.Linq.Expressions.xml", + "ref/netstandard1.6/System.Linq.Expressions.dll", + "ref/netstandard1.6/System.Linq.Expressions.xml", + "ref/netstandard1.6/de/System.Linq.Expressions.xml", + "ref/netstandard1.6/es/System.Linq.Expressions.xml", + "ref/netstandard1.6/fr/System.Linq.Expressions.xml", + "ref/netstandard1.6/it/System.Linq.Expressions.xml", + "ref/netstandard1.6/ja/System.Linq.Expressions.xml", + "ref/netstandard1.6/ko/System.Linq.Expressions.xml", + "ref/netstandard1.6/ru/System.Linq.Expressions.xml", + "ref/netstandard1.6/zh-hans/System.Linq.Expressions.xml", + "ref/netstandard1.6/zh-hant/System.Linq.Expressions.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/System.Linq.Expressions.dll", + "system.linq.expressions.4.3.0.nupkg.sha512", + "system.linq.expressions.nuspec" + ] + }, + "System.ObjectModel/4.3.0": { + "sha512": "QJvKPSE5vR0APHEUALotteV2u1TVk6pUHsNXbnsgKbYBWascWyxOc4kmexuV682MLwZNxuH1Pmk6rLFzfwZhIw==", + "type": "package", + "path": "system.objectmodel/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.ObjectModel.dll", + "lib/netstandard1.3/System.ObjectModel.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.ObjectModel.dll", + "ref/netcore50/System.ObjectModel.xml", + "ref/netcore50/de/System.ObjectModel.xml", + "ref/netcore50/es/System.ObjectModel.xml", + "ref/netcore50/fr/System.ObjectModel.xml", + "ref/netcore50/it/System.ObjectModel.xml", + "ref/netcore50/ja/System.ObjectModel.xml", + "ref/netcore50/ko/System.ObjectModel.xml", + "ref/netcore50/ru/System.ObjectModel.xml", + "ref/netcore50/zh-hans/System.ObjectModel.xml", + "ref/netcore50/zh-hant/System.ObjectModel.xml", + "ref/netstandard1.0/System.ObjectModel.dll", + "ref/netstandard1.0/System.ObjectModel.xml", + "ref/netstandard1.0/de/System.ObjectModel.xml", + "ref/netstandard1.0/es/System.ObjectModel.xml", + "ref/netstandard1.0/fr/System.ObjectModel.xml", + "ref/netstandard1.0/it/System.ObjectModel.xml", + "ref/netstandard1.0/ja/System.ObjectModel.xml", + "ref/netstandard1.0/ko/System.ObjectModel.xml", + "ref/netstandard1.0/ru/System.ObjectModel.xml", + "ref/netstandard1.0/zh-hans/System.ObjectModel.xml", + "ref/netstandard1.0/zh-hant/System.ObjectModel.xml", + "ref/netstandard1.3/System.ObjectModel.dll", + "ref/netstandard1.3/System.ObjectModel.xml", + "ref/netstandard1.3/de/System.ObjectModel.xml", + "ref/netstandard1.3/es/System.ObjectModel.xml", + "ref/netstandard1.3/fr/System.ObjectModel.xml", + "ref/netstandard1.3/it/System.ObjectModel.xml", + "ref/netstandard1.3/ja/System.ObjectModel.xml", + "ref/netstandard1.3/ko/System.ObjectModel.xml", + "ref/netstandard1.3/ru/System.ObjectModel.xml", + "ref/netstandard1.3/zh-hans/System.ObjectModel.xml", + "ref/netstandard1.3/zh-hant/System.ObjectModel.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.objectmodel.4.3.0.nupkg.sha512", + "system.objectmodel.nuspec" + ] + }, + "System.Reflection/4.3.0": { + "sha512": "IyW2ftYNzgMCgHBk8lQiy+G3+ydbU5tE+6PEqM5JJvIdeFKaXDSzHAPYDREPe6zpr5WJ1Fcma+rAFCIAV6+DMw==", + "type": "package", + "path": "system.reflection/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.Reflection.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.Reflection.dll", + "ref/netcore50/System.Reflection.dll", + "ref/netcore50/System.Reflection.xml", + "ref/netcore50/de/System.Reflection.xml", + "ref/netcore50/es/System.Reflection.xml", + "ref/netcore50/fr/System.Reflection.xml", + "ref/netcore50/it/System.Reflection.xml", + "ref/netcore50/ja/System.Reflection.xml", + "ref/netcore50/ko/System.Reflection.xml", + "ref/netcore50/ru/System.Reflection.xml", + "ref/netcore50/zh-hans/System.Reflection.xml", + "ref/netcore50/zh-hant/System.Reflection.xml", + "ref/netstandard1.0/System.Reflection.dll", + "ref/netstandard1.0/System.Reflection.xml", + "ref/netstandard1.0/de/System.Reflection.xml", + "ref/netstandard1.0/es/System.Reflection.xml", + "ref/netstandard1.0/fr/System.Reflection.xml", + "ref/netstandard1.0/it/System.Reflection.xml", + "ref/netstandard1.0/ja/System.Reflection.xml", + "ref/netstandard1.0/ko/System.Reflection.xml", + "ref/netstandard1.0/ru/System.Reflection.xml", + "ref/netstandard1.0/zh-hans/System.Reflection.xml", + "ref/netstandard1.0/zh-hant/System.Reflection.xml", + "ref/netstandard1.3/System.Reflection.dll", + "ref/netstandard1.3/System.Reflection.xml", + "ref/netstandard1.3/de/System.Reflection.xml", + "ref/netstandard1.3/es/System.Reflection.xml", + "ref/netstandard1.3/fr/System.Reflection.xml", + "ref/netstandard1.3/it/System.Reflection.xml", + "ref/netstandard1.3/ja/System.Reflection.xml", + "ref/netstandard1.3/ko/System.Reflection.xml", + "ref/netstandard1.3/ru/System.Reflection.xml", + "ref/netstandard1.3/zh-hans/System.Reflection.xml", + "ref/netstandard1.3/zh-hant/System.Reflection.xml", + "ref/netstandard1.5/System.Reflection.dll", + "ref/netstandard1.5/System.Reflection.xml", + "ref/netstandard1.5/de/System.Reflection.xml", + "ref/netstandard1.5/es/System.Reflection.xml", + "ref/netstandard1.5/fr/System.Reflection.xml", + "ref/netstandard1.5/it/System.Reflection.xml", + "ref/netstandard1.5/ja/System.Reflection.xml", + "ref/netstandard1.5/ko/System.Reflection.xml", + "ref/netstandard1.5/ru/System.Reflection.xml", + "ref/netstandard1.5/zh-hans/System.Reflection.xml", + "ref/netstandard1.5/zh-hant/System.Reflection.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.reflection.4.3.0.nupkg.sha512", + "system.reflection.nuspec" + ] + }, + "System.Reflection.Emit/4.3.0": { + "sha512": "vkUFFGejarllQQ8RKkdfuBUQpVlTR9HMDEawKOBDajOSGN08Bz8EjC0zi2fcE7RXQikLbEb1WYJQP3So8mmIGA==", + "type": "package", + "path": "system.reflection.emit/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/monotouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.dll", + "lib/netstandard1.3/System.Reflection.Emit.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/net45/_._", + "ref/netstandard1.1/System.Reflection.Emit.dll", + "ref/netstandard1.1/System.Reflection.Emit.xml", + "ref/netstandard1.1/de/System.Reflection.Emit.xml", + "ref/netstandard1.1/es/System.Reflection.Emit.xml", + "ref/netstandard1.1/fr/System.Reflection.Emit.xml", + "ref/netstandard1.1/it/System.Reflection.Emit.xml", + "ref/netstandard1.1/ja/System.Reflection.Emit.xml", + "ref/netstandard1.1/ko/System.Reflection.Emit.xml", + "ref/netstandard1.1/ru/System.Reflection.Emit.xml", + "ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml", + "ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml", + "ref/xamarinmac20/_._", + "system.reflection.emit.4.3.0.nupkg.sha512", + "system.reflection.emit.nuspec" + ] + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "sha512": "6b5fYr9ksZR6SYVzNzBqXQmAaGtY1mWYnpQAarBKp+C79NhUPRtX1bs4B5BS8nXzObcwVKc1fk+jVyCKCshdaQ==", + "type": "package", + "path": "system.reflection.emit.ilgeneration/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.ILGeneration.dll", + "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll", + "lib/portable-net45+wp8/_._", + "lib/wp80/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.dll", + "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/de/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/es/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/fr/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/it/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/ja/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/ko/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/ru/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/zh-hans/System.Reflection.Emit.ILGeneration.xml", + "ref/netstandard1.0/zh-hant/System.Reflection.Emit.ILGeneration.xml", + "ref/portable-net45+wp8/_._", + "ref/wp80/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/_._", + "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512", + "system.reflection.emit.ilgeneration.nuspec" + ] + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "sha512": "rVivBylr0ISQegifkgJvo4mLdk651qB8lBS1UKg6xgRW8yo0Enwpu5OpYz+we6n9go97QaMdzl/wGafPGrKUNQ==", + "type": "package", + "path": "system.reflection.emit.lightweight/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.Lightweight.dll", + "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll", + "lib/portable-net45+wp8/_._", + "lib/wp80/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netstandard1.0/System.Reflection.Emit.Lightweight.dll", + "ref/netstandard1.0/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/de/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/es/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/fr/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/it/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/ja/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/ko/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/ru/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/zh-hans/System.Reflection.Emit.Lightweight.xml", + "ref/netstandard1.0/zh-hant/System.Reflection.Emit.Lightweight.xml", + "ref/portable-net45+wp8/_._", + "ref/wp80/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/_._", + "system.reflection.emit.lightweight.4.3.0.nupkg.sha512", + "system.reflection.emit.lightweight.nuspec" + ] + }, + "System.Reflection.Extensions/4.3.0": { + "sha512": "Bs/ZksjX/Zq2QyqwK+mBoBtlWChabiangloGTU78zgjZ5zRPA/oZsDOiRZ1CsLgOjBQAzjm0ehdShpq4glsEdQ==", + "type": "package", + "path": "system.reflection.extensions/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Extensions.dll", + "ref/netcore50/System.Reflection.Extensions.xml", + "ref/netcore50/de/System.Reflection.Extensions.xml", + "ref/netcore50/es/System.Reflection.Extensions.xml", + "ref/netcore50/fr/System.Reflection.Extensions.xml", + "ref/netcore50/it/System.Reflection.Extensions.xml", + "ref/netcore50/ja/System.Reflection.Extensions.xml", + "ref/netcore50/ko/System.Reflection.Extensions.xml", + "ref/netcore50/ru/System.Reflection.Extensions.xml", + "ref/netcore50/zh-hans/System.Reflection.Extensions.xml", + "ref/netcore50/zh-hant/System.Reflection.Extensions.xml", + "ref/netstandard1.0/System.Reflection.Extensions.dll", + "ref/netstandard1.0/System.Reflection.Extensions.xml", + "ref/netstandard1.0/de/System.Reflection.Extensions.xml", + "ref/netstandard1.0/es/System.Reflection.Extensions.xml", + "ref/netstandard1.0/fr/System.Reflection.Extensions.xml", + "ref/netstandard1.0/it/System.Reflection.Extensions.xml", + "ref/netstandard1.0/ja/System.Reflection.Extensions.xml", + "ref/netstandard1.0/ko/System.Reflection.Extensions.xml", + "ref/netstandard1.0/ru/System.Reflection.Extensions.xml", + "ref/netstandard1.0/zh-hans/System.Reflection.Extensions.xml", + "ref/netstandard1.0/zh-hant/System.Reflection.Extensions.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.reflection.extensions.4.3.0.nupkg.sha512", + "system.reflection.extensions.nuspec" + ] + }, + "System.Reflection.Primitives/4.3.0": { + "sha512": "1LnMkF9aXKuQAgYzjoiQaL9mwY7oY6KdaO/zzeLMynNBEqKoUfLi5TiKIewoAF+hkxfGTZsjkjsF1jRL4uSeqg==", + "type": "package", + "path": "system.reflection.primitives/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Primitives.dll", + "ref/netcore50/System.Reflection.Primitives.xml", + "ref/netcore50/de/System.Reflection.Primitives.xml", + "ref/netcore50/es/System.Reflection.Primitives.xml", + "ref/netcore50/fr/System.Reflection.Primitives.xml", + "ref/netcore50/it/System.Reflection.Primitives.xml", + "ref/netcore50/ja/System.Reflection.Primitives.xml", + "ref/netcore50/ko/System.Reflection.Primitives.xml", + "ref/netcore50/ru/System.Reflection.Primitives.xml", + "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", + "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", + "ref/netstandard1.0/System.Reflection.Primitives.dll", + "ref/netstandard1.0/System.Reflection.Primitives.xml", + "ref/netstandard1.0/de/System.Reflection.Primitives.xml", + "ref/netstandard1.0/es/System.Reflection.Primitives.xml", + "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", + "ref/netstandard1.0/it/System.Reflection.Primitives.xml", + "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", + "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", + "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", + "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", + "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.reflection.primitives.4.3.0.nupkg.sha512", + "system.reflection.primitives.nuspec" + ] + }, + "System.Reflection.TypeExtensions/4.3.0": { + "sha512": "aK6BpjW5ryrun8j8j+faA1bvTaTrMvgaift1YTuWcU6PGh9MEr0NM177sDQIzHp0QxSDfxNWTV+yYsonIFVnfw==", + "type": "package", + "path": "system.reflection.typeextensions/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Reflection.TypeExtensions.dll", + "lib/net462/System.Reflection.TypeExtensions.dll", + "lib/netcore50/System.Reflection.TypeExtensions.dll", + "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Reflection.TypeExtensions.dll", + "ref/net462/System.Reflection.TypeExtensions.dll", + "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", + "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", + "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", + "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll", + "system.reflection.typeextensions.4.3.0.nupkg.sha512", + "system.reflection.typeextensions.nuspec" + ] + }, + "System.Resources.ResourceManager/4.3.0": { + "sha512": "kGfbKPHEjQj8Uq1Apgj4jBStkRJkZ0Hdr0Jv3+aL7WGrAZVLF5Rh5h0Yc3FgDB5uXDbHiJk/WhBaZPVwKmuB1A==", + "type": "package", + "path": "system.resources.resourcemanager/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Resources.ResourceManager.dll", + "ref/netcore50/System.Resources.ResourceManager.xml", + "ref/netcore50/de/System.Resources.ResourceManager.xml", + "ref/netcore50/es/System.Resources.ResourceManager.xml", + "ref/netcore50/fr/System.Resources.ResourceManager.xml", + "ref/netcore50/it/System.Resources.ResourceManager.xml", + "ref/netcore50/ja/System.Resources.ResourceManager.xml", + "ref/netcore50/ko/System.Resources.ResourceManager.xml", + "ref/netcore50/ru/System.Resources.ResourceManager.xml", + "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", + "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/System.Resources.ResourceManager.dll", + "ref/netstandard1.0/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", + "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.resources.resourcemanager.4.3.0.nupkg.sha512", + "system.resources.resourcemanager.nuspec" + ] + }, + "System.Runtime/4.3.0": { + "sha512": "kqsiSfCAc8+v3Ez719s21lGthxuNi6lhAGmCGH3jdL9KMK+T8V9zsFrzQ/enDL1ISwTWRlcFh2Nq5yFx6wcU+w==", + "type": "package", + "path": "system.runtime/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.Runtime.dll", + "lib/portable-net45+win8+wp80+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.Runtime.dll", + "ref/netcore50/System.Runtime.dll", + "ref/netcore50/System.Runtime.xml", + "ref/netcore50/de/System.Runtime.xml", + "ref/netcore50/es/System.Runtime.xml", + "ref/netcore50/fr/System.Runtime.xml", + "ref/netcore50/it/System.Runtime.xml", + "ref/netcore50/ja/System.Runtime.xml", + "ref/netcore50/ko/System.Runtime.xml", + "ref/netcore50/ru/System.Runtime.xml", + "ref/netcore50/zh-hans/System.Runtime.xml", + "ref/netcore50/zh-hant/System.Runtime.xml", + "ref/netstandard1.0/System.Runtime.dll", + "ref/netstandard1.0/System.Runtime.xml", + "ref/netstandard1.0/de/System.Runtime.xml", + "ref/netstandard1.0/es/System.Runtime.xml", + "ref/netstandard1.0/fr/System.Runtime.xml", + "ref/netstandard1.0/it/System.Runtime.xml", + "ref/netstandard1.0/ja/System.Runtime.xml", + "ref/netstandard1.0/ko/System.Runtime.xml", + "ref/netstandard1.0/ru/System.Runtime.xml", + "ref/netstandard1.0/zh-hans/System.Runtime.xml", + "ref/netstandard1.0/zh-hant/System.Runtime.xml", + "ref/netstandard1.2/System.Runtime.dll", + "ref/netstandard1.2/System.Runtime.xml", + "ref/netstandard1.2/de/System.Runtime.xml", + "ref/netstandard1.2/es/System.Runtime.xml", + "ref/netstandard1.2/fr/System.Runtime.xml", + "ref/netstandard1.2/it/System.Runtime.xml", + "ref/netstandard1.2/ja/System.Runtime.xml", + "ref/netstandard1.2/ko/System.Runtime.xml", + "ref/netstandard1.2/ru/System.Runtime.xml", + "ref/netstandard1.2/zh-hans/System.Runtime.xml", + "ref/netstandard1.2/zh-hant/System.Runtime.xml", + "ref/netstandard1.3/System.Runtime.dll", + "ref/netstandard1.3/System.Runtime.xml", + "ref/netstandard1.3/de/System.Runtime.xml", + "ref/netstandard1.3/es/System.Runtime.xml", + "ref/netstandard1.3/fr/System.Runtime.xml", + "ref/netstandard1.3/it/System.Runtime.xml", + "ref/netstandard1.3/ja/System.Runtime.xml", + "ref/netstandard1.3/ko/System.Runtime.xml", + "ref/netstandard1.3/ru/System.Runtime.xml", + "ref/netstandard1.3/zh-hans/System.Runtime.xml", + "ref/netstandard1.3/zh-hant/System.Runtime.xml", + "ref/netstandard1.5/System.Runtime.dll", + "ref/netstandard1.5/System.Runtime.xml", + "ref/netstandard1.5/de/System.Runtime.xml", + "ref/netstandard1.5/es/System.Runtime.xml", + "ref/netstandard1.5/fr/System.Runtime.xml", + "ref/netstandard1.5/it/System.Runtime.xml", + "ref/netstandard1.5/ja/System.Runtime.xml", + "ref/netstandard1.5/ko/System.Runtime.xml", + "ref/netstandard1.5/ru/System.Runtime.xml", + "ref/netstandard1.5/zh-hans/System.Runtime.xml", + "ref/netstandard1.5/zh-hant/System.Runtime.xml", + "ref/portable-net45+win8+wp80+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.runtime.4.3.0.nupkg.sha512", + "system.runtime.nuspec" + ] + }, + "System.Runtime.Extensions/4.3.0": { + "sha512": "aAoysZwr1QJvhoeqU4KupPQytPAy+L3imfrLYYxW1XNpre9/fMjmCtgq48EuXdUHckkTY7+ARMd4d4YopmBbvA==", + "type": "package", + "path": "system.runtime.extensions/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.Runtime.Extensions.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.Runtime.Extensions.dll", + "ref/netcore50/System.Runtime.Extensions.dll", + "ref/netcore50/System.Runtime.Extensions.xml", + "ref/netcore50/de/System.Runtime.Extensions.xml", + "ref/netcore50/es/System.Runtime.Extensions.xml", + "ref/netcore50/fr/System.Runtime.Extensions.xml", + "ref/netcore50/it/System.Runtime.Extensions.xml", + "ref/netcore50/ja/System.Runtime.Extensions.xml", + "ref/netcore50/ko/System.Runtime.Extensions.xml", + "ref/netcore50/ru/System.Runtime.Extensions.xml", + "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", + "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", + "ref/netstandard1.0/System.Runtime.Extensions.dll", + "ref/netstandard1.0/System.Runtime.Extensions.xml", + "ref/netstandard1.0/de/System.Runtime.Extensions.xml", + "ref/netstandard1.0/es/System.Runtime.Extensions.xml", + "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", + "ref/netstandard1.0/it/System.Runtime.Extensions.xml", + "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", + "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", + "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", + "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", + "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", + "ref/netstandard1.3/System.Runtime.Extensions.dll", + "ref/netstandard1.3/System.Runtime.Extensions.xml", + "ref/netstandard1.3/de/System.Runtime.Extensions.xml", + "ref/netstandard1.3/es/System.Runtime.Extensions.xml", + "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", + "ref/netstandard1.3/it/System.Runtime.Extensions.xml", + "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", + "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", + "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", + "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", + "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", + "ref/netstandard1.5/System.Runtime.Extensions.dll", + "ref/netstandard1.5/System.Runtime.Extensions.xml", + "ref/netstandard1.5/de/System.Runtime.Extensions.xml", + "ref/netstandard1.5/es/System.Runtime.Extensions.xml", + "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", + "ref/netstandard1.5/it/System.Runtime.Extensions.xml", + "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", + "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", + "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", + "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", + "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.runtime.extensions.4.3.0.nupkg.sha512", + "system.runtime.extensions.nuspec" + ] + }, + "System.Runtime.Handles/4.3.0": { + "sha512": "CluvHdVUv54BvLTOCCyybugreDNk/rR8unMPruzXDtxSjvrQOU3M4R831/lQf4YI8VYp668FGQa/01E+Rq8PEQ==", + "type": "package", + "path": "system.runtime.handles/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/netstandard1.3/System.Runtime.Handles.dll", + "ref/netstandard1.3/System.Runtime.Handles.xml", + "ref/netstandard1.3/de/System.Runtime.Handles.xml", + "ref/netstandard1.3/es/System.Runtime.Handles.xml", + "ref/netstandard1.3/fr/System.Runtime.Handles.xml", + "ref/netstandard1.3/it/System.Runtime.Handles.xml", + "ref/netstandard1.3/ja/System.Runtime.Handles.xml", + "ref/netstandard1.3/ko/System.Runtime.Handles.xml", + "ref/netstandard1.3/ru/System.Runtime.Handles.xml", + "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", + "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.runtime.handles.4.3.0.nupkg.sha512", + "system.runtime.handles.nuspec" + ] + }, + "System.Runtime.InteropServices/4.3.0": { + "sha512": "ZQeZw+ZU77ua1nFXycYM5G8oioFZe+N84qC/XUg1BEBl7z9luZcyjLu7+4H0yJuNfn1hOAiAAZ3u5us/lj9w2Q==", + "type": "package", + "path": "system.runtime.interopservices/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.Runtime.InteropServices.dll", + "lib/net463/System.Runtime.InteropServices.dll", + "lib/portable-net45+win8+wpa81/_._", + "lib/win8/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.Runtime.InteropServices.dll", + "ref/net463/System.Runtime.InteropServices.dll", + "ref/netcore50/System.Runtime.InteropServices.dll", + "ref/netcore50/System.Runtime.InteropServices.xml", + "ref/netcore50/de/System.Runtime.InteropServices.xml", + "ref/netcore50/es/System.Runtime.InteropServices.xml", + "ref/netcore50/fr/System.Runtime.InteropServices.xml", + "ref/netcore50/it/System.Runtime.InteropServices.xml", + "ref/netcore50/ja/System.Runtime.InteropServices.xml", + "ref/netcore50/ko/System.Runtime.InteropServices.xml", + "ref/netcore50/ru/System.Runtime.InteropServices.xml", + "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", + "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", + "ref/netcoreapp1.1/System.Runtime.InteropServices.dll", + "ref/netstandard1.1/System.Runtime.InteropServices.dll", + "ref/netstandard1.1/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", + "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/System.Runtime.InteropServices.dll", + "ref/netstandard1.2/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", + "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/System.Runtime.InteropServices.dll", + "ref/netstandard1.3/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", + "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/System.Runtime.InteropServices.dll", + "ref/netstandard1.5/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", + "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", + "ref/portable-net45+win8+wpa81/_._", + "ref/win8/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.runtime.interopservices.4.3.0.nupkg.sha512", + "system.runtime.interopservices.nuspec" + ] + }, + "System.Runtime.Serialization.Primitives/4.1.1": { + "sha512": "+mqQrrJsDx5yxIq+wLYKHr6pVc08ETOzJFwE3QvWmEwM4CU5RNKGdqu47bk+HGScaT58ZCVFmjwpp0OBUxy1QA==", + "type": "package", + "path": "system.runtime.serialization.primitives/4.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net46/System.Runtime.Serialization.Primitives.dll", + "lib/netcore50/System.Runtime.Serialization.Primitives.dll", + "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net46/System.Runtime.Serialization.Primitives.dll", + "ref/netcore50/System.Runtime.Serialization.Primitives.dll", + "ref/netcore50/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/de/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/es/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/fr/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/it/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/ja/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/ko/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/ru/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/zh-hans/System.Runtime.Serialization.Primitives.xml", + "ref/netcore50/zh-hant/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/System.Runtime.Serialization.Primitives.dll", + "ref/netstandard1.0/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/de/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/es/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/fr/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/it/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/ja/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/ko/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/ru/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/zh-hans/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.0/zh-hant/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll", + "ref/netstandard1.3/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/de/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/es/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/fr/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/it/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/ja/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/ko/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/ru/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/zh-hans/System.Runtime.Serialization.Primitives.xml", + "ref/netstandard1.3/zh-hant/System.Runtime.Serialization.Primitives.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/System.Runtime.Serialization.Primitives.dll", + "system.runtime.serialization.primitives.4.1.1.nupkg.sha512", + "system.runtime.serialization.primitives.nuspec" + ] + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "sha512": "WtgnP5mOu5zKL3vQMUPT9tV7XVYGV7Jtb0540DgBD7MMN5ojonwIcw8VybZvS6VloGmE7CRt/Hms8adBsN1DRw==", + "type": "package", + "path": "system.security.cryptography.primitives/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.Primitives.dll", + "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.Primitives.dll", + "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.security.cryptography.primitives.4.3.0.nupkg.sha512", + "system.security.cryptography.primitives.nuspec" + ] + }, + "System.Security.Cryptography.ProtectedData/4.3.0": { + "sha512": "qBUHUk7IqrPHY96THHTa1akCxw0GsNFpsk3XFHbi0A0tMUDBpQprtY1Tbl6yaS1x4c96ilcXU8PocYtmSmkaQQ==", + "type": "package", + "path": "system.security.cryptography.protecteddata/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.ProtectedData.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.ProtectedData.dll", + "ref/netstandard1.3/System.Security.Cryptography.ProtectedData.dll", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/net46/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.ProtectedData.dll", + "system.security.cryptography.protecteddata.4.3.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec" + ] + }, + "System.Text.Encoding/4.3.0": { + "sha512": "b/f+7HMTpxIfeV7H03bkuHKMFylCGfr9/U6gePnfFFW0aF8LOWLDgQCY6V1oWUqDksC3mdNuyChM1vy9TP4sZw==", + "type": "package", + "path": "system.text.encoding/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Text.Encoding.dll", + "ref/netcore50/System.Text.Encoding.xml", + "ref/netcore50/de/System.Text.Encoding.xml", + "ref/netcore50/es/System.Text.Encoding.xml", + "ref/netcore50/fr/System.Text.Encoding.xml", + "ref/netcore50/it/System.Text.Encoding.xml", + "ref/netcore50/ja/System.Text.Encoding.xml", + "ref/netcore50/ko/System.Text.Encoding.xml", + "ref/netcore50/ru/System.Text.Encoding.xml", + "ref/netcore50/zh-hans/System.Text.Encoding.xml", + "ref/netcore50/zh-hant/System.Text.Encoding.xml", + "ref/netstandard1.0/System.Text.Encoding.dll", + "ref/netstandard1.0/System.Text.Encoding.xml", + "ref/netstandard1.0/de/System.Text.Encoding.xml", + "ref/netstandard1.0/es/System.Text.Encoding.xml", + "ref/netstandard1.0/fr/System.Text.Encoding.xml", + "ref/netstandard1.0/it/System.Text.Encoding.xml", + "ref/netstandard1.0/ja/System.Text.Encoding.xml", + "ref/netstandard1.0/ko/System.Text.Encoding.xml", + "ref/netstandard1.0/ru/System.Text.Encoding.xml", + "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", + "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", + "ref/netstandard1.3/System.Text.Encoding.dll", + "ref/netstandard1.3/System.Text.Encoding.xml", + "ref/netstandard1.3/de/System.Text.Encoding.xml", + "ref/netstandard1.3/es/System.Text.Encoding.xml", + "ref/netstandard1.3/fr/System.Text.Encoding.xml", + "ref/netstandard1.3/it/System.Text.Encoding.xml", + "ref/netstandard1.3/ja/System.Text.Encoding.xml", + "ref/netstandard1.3/ko/System.Text.Encoding.xml", + "ref/netstandard1.3/ru/System.Text.Encoding.xml", + "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", + "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.text.encoding.4.3.0.nupkg.sha512", + "system.text.encoding.nuspec" + ] + }, + "System.Text.Encoding.Extensions/4.3.0": { + "sha512": "5kjF3HgeNc8AxcyOfkLoFbljz4+3iOioF/m1PjGLK0Li96VW6cPGS/L2ov1GFfJqtPDU63E6AVHnHgrz/pw+7Q==", + "type": "package", + "path": "system.text.encoding.extensions/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Text.Encoding.Extensions.dll", + "ref/netcore50/System.Text.Encoding.Extensions.xml", + "ref/netcore50/de/System.Text.Encoding.Extensions.xml", + "ref/netcore50/es/System.Text.Encoding.Extensions.xml", + "ref/netcore50/fr/System.Text.Encoding.Extensions.xml", + "ref/netcore50/it/System.Text.Encoding.Extensions.xml", + "ref/netcore50/ja/System.Text.Encoding.Extensions.xml", + "ref/netcore50/ko/System.Text.Encoding.Extensions.xml", + "ref/netcore50/ru/System.Text.Encoding.Extensions.xml", + "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml", + "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/System.Text.Encoding.Extensions.dll", + "ref/netstandard1.0/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/System.Text.Encoding.Extensions.dll", + "ref/netstandard1.3/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml", + "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.text.encoding.extensions.4.3.0.nupkg.sha512", + "system.text.encoding.extensions.nuspec" + ] + }, + "System.Text.RegularExpressions/4.1.0": { + "sha512": "m2EgJ+Q8M8wlbgFuC0AFR8WSPpOrbtGkDSuXKSyxihGV+nmrorAWamsRhCoP72aF0xuEg3Xa/99tKs8pevQLvg==", + "type": "package", + "path": "system.text.regularexpressions/4.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net463/System.Text.RegularExpressions.dll", + "lib/netcore50/System.Text.RegularExpressions.dll", + "lib/netstandard1.6/System.Text.RegularExpressions.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net463/System.Text.RegularExpressions.dll", + "ref/netcore50/System.Text.RegularExpressions.dll", + "ref/netcore50/System.Text.RegularExpressions.xml", + "ref/netcore50/de/System.Text.RegularExpressions.xml", + "ref/netcore50/es/System.Text.RegularExpressions.xml", + "ref/netcore50/fr/System.Text.RegularExpressions.xml", + "ref/netcore50/it/System.Text.RegularExpressions.xml", + "ref/netcore50/ja/System.Text.RegularExpressions.xml", + "ref/netcore50/ko/System.Text.RegularExpressions.xml", + "ref/netcore50/ru/System.Text.RegularExpressions.xml", + "ref/netcore50/zh-hans/System.Text.RegularExpressions.xml", + "ref/netcore50/zh-hant/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/System.Text.RegularExpressions.dll", + "ref/netstandard1.0/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/de/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/es/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/fr/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/it/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/ja/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/ko/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/ru/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/zh-hans/System.Text.RegularExpressions.xml", + "ref/netstandard1.0/zh-hant/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/System.Text.RegularExpressions.dll", + "ref/netstandard1.3/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/de/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/es/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/fr/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/it/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/ja/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/ko/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/ru/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/zh-hans/System.Text.RegularExpressions.xml", + "ref/netstandard1.3/zh-hant/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/System.Text.RegularExpressions.dll", + "ref/netstandard1.6/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/de/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/es/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/fr/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/it/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/ja/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/ko/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/ru/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/zh-hans/System.Text.RegularExpressions.xml", + "ref/netstandard1.6/zh-hant/System.Text.RegularExpressions.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.text.regularexpressions.4.1.0.nupkg.sha512", + "system.text.regularexpressions.nuspec" + ] + }, + "System.Threading/4.3.0": { + "sha512": "l6J1G9zmn6r5xU+DSp/Vxgx6eG+qUvQgdpgo28m1gEwfNyG6HqlF6h2ESDXZCYEPnngsmkTQ+q7MyyMMTNlaiA==", + "type": "package", + "path": "system.threading/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Threading.dll", + "lib/netstandard1.3/System.Threading.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Threading.dll", + "ref/netcore50/System.Threading.xml", + "ref/netcore50/de/System.Threading.xml", + "ref/netcore50/es/System.Threading.xml", + "ref/netcore50/fr/System.Threading.xml", + "ref/netcore50/it/System.Threading.xml", + "ref/netcore50/ja/System.Threading.xml", + "ref/netcore50/ko/System.Threading.xml", + "ref/netcore50/ru/System.Threading.xml", + "ref/netcore50/zh-hans/System.Threading.xml", + "ref/netcore50/zh-hant/System.Threading.xml", + "ref/netstandard1.0/System.Threading.dll", + "ref/netstandard1.0/System.Threading.xml", + "ref/netstandard1.0/de/System.Threading.xml", + "ref/netstandard1.0/es/System.Threading.xml", + "ref/netstandard1.0/fr/System.Threading.xml", + "ref/netstandard1.0/it/System.Threading.xml", + "ref/netstandard1.0/ja/System.Threading.xml", + "ref/netstandard1.0/ko/System.Threading.xml", + "ref/netstandard1.0/ru/System.Threading.xml", + "ref/netstandard1.0/zh-hans/System.Threading.xml", + "ref/netstandard1.0/zh-hant/System.Threading.xml", + "ref/netstandard1.3/System.Threading.dll", + "ref/netstandard1.3/System.Threading.xml", + "ref/netstandard1.3/de/System.Threading.xml", + "ref/netstandard1.3/es/System.Threading.xml", + "ref/netstandard1.3/fr/System.Threading.xml", + "ref/netstandard1.3/it/System.Threading.xml", + "ref/netstandard1.3/ja/System.Threading.xml", + "ref/netstandard1.3/ko/System.Threading.xml", + "ref/netstandard1.3/ru/System.Threading.xml", + "ref/netstandard1.3/zh-hans/System.Threading.xml", + "ref/netstandard1.3/zh-hant/System.Threading.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/System.Threading.dll", + "system.threading.4.3.0.nupkg.sha512", + "system.threading.nuspec" + ] + }, + "System.Threading.Tasks/4.3.0": { + "sha512": "fUiP+CyyCjs872OA8trl6p97qma/da1xGq3h4zAbJZk8zyaU4zyEfqW5vbkP80xG/Nimun1vlWBboMEk7XxdEw==", + "type": "package", + "path": "system.threading.tasks/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Threading.Tasks.dll", + "ref/netcore50/System.Threading.Tasks.xml", + "ref/netcore50/de/System.Threading.Tasks.xml", + "ref/netcore50/es/System.Threading.Tasks.xml", + "ref/netcore50/fr/System.Threading.Tasks.xml", + "ref/netcore50/it/System.Threading.Tasks.xml", + "ref/netcore50/ja/System.Threading.Tasks.xml", + "ref/netcore50/ko/System.Threading.Tasks.xml", + "ref/netcore50/ru/System.Threading.Tasks.xml", + "ref/netcore50/zh-hans/System.Threading.Tasks.xml", + "ref/netcore50/zh-hant/System.Threading.Tasks.xml", + "ref/netstandard1.0/System.Threading.Tasks.dll", + "ref/netstandard1.0/System.Threading.Tasks.xml", + "ref/netstandard1.0/de/System.Threading.Tasks.xml", + "ref/netstandard1.0/es/System.Threading.Tasks.xml", + "ref/netstandard1.0/fr/System.Threading.Tasks.xml", + "ref/netstandard1.0/it/System.Threading.Tasks.xml", + "ref/netstandard1.0/ja/System.Threading.Tasks.xml", + "ref/netstandard1.0/ko/System.Threading.Tasks.xml", + "ref/netstandard1.0/ru/System.Threading.Tasks.xml", + "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", + "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", + "ref/netstandard1.3/System.Threading.Tasks.dll", + "ref/netstandard1.3/System.Threading.Tasks.xml", + "ref/netstandard1.3/de/System.Threading.Tasks.xml", + "ref/netstandard1.3/es/System.Threading.Tasks.xml", + "ref/netstandard1.3/fr/System.Threading.Tasks.xml", + "ref/netstandard1.3/it/System.Threading.Tasks.xml", + "ref/netstandard1.3/ja/System.Threading.Tasks.xml", + "ref/netstandard1.3/ko/System.Threading.Tasks.xml", + "ref/netstandard1.3/ru/System.Threading.Tasks.xml", + "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", + "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.threading.tasks.4.3.0.nupkg.sha512", + "system.threading.tasks.nuspec" + ] + }, + "System.Threading.Tasks.Extensions/4.0.0": { + "sha512": "8pTxpBefU9WfkfAaNyzHiWv4wyLpgnKZyxqjrisfgJ6YA0g09czUyz+hwwc1CC0kT/9lhNq26IcK1Am1XopJhg==", + "type": "package", + "path": "system.threading.tasks.extensions/4.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", + "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", + "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", + "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", + "system.threading.tasks.extensions.4.0.0.nupkg.sha512", + "system.threading.tasks.extensions.nuspec" + ] + }, + "System.Threading.Thread/4.3.0": { + "sha512": "z+EramDnni9/yneaURFT1bDcrlnqGxFgb2Mn2/izxWXiVR6OytpVjmLdO2hLXJ1nZXUCUEjt+9OYj69/cjWl/g==", + "type": "package", + "path": "system.threading.thread/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Threading.Thread.dll", + "lib/netcore50/_._", + "lib/netstandard1.3/System.Threading.Thread.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Threading.Thread.dll", + "ref/netstandard1.3/System.Threading.Thread.dll", + "ref/netstandard1.3/System.Threading.Thread.xml", + "ref/netstandard1.3/de/System.Threading.Thread.xml", + "ref/netstandard1.3/es/System.Threading.Thread.xml", + "ref/netstandard1.3/fr/System.Threading.Thread.xml", + "ref/netstandard1.3/it/System.Threading.Thread.xml", + "ref/netstandard1.3/ja/System.Threading.Thread.xml", + "ref/netstandard1.3/ko/System.Threading.Thread.xml", + "ref/netstandard1.3/ru/System.Threading.Thread.xml", + "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", + "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.threading.thread.4.3.0.nupkg.sha512", + "system.threading.thread.nuspec" + ] + }, + "System.Threading.ThreadPool/4.3.0": { + "sha512": "RQpA+UpI6Tlpeedk5JStYk2DM/M3i5HqabI/yDbfj1xDu9bIz9kdoquVpHbh/wQjOJaOCbcgRH8iQcAUv8dRWQ==", + "type": "package", + "path": "system.threading.threadpool/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Threading.ThreadPool.dll", + "lib/netcore50/_._", + "lib/netstandard1.3/System.Threading.ThreadPool.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Threading.ThreadPool.dll", + "ref/netstandard1.3/System.Threading.ThreadPool.dll", + "ref/netstandard1.3/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", + "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.threading.threadpool.4.3.0.nupkg.sha512", + "system.threading.threadpool.nuspec" + ] + }, + "System.Xml.ReaderWriter/4.0.11": { + "sha512": "1A1unVXles3wQTK8uK6Kvxq7NINiDN6WnHjGw5Opk2q/dCwdz2Yojm6d/8s5mogO48EVQKwUDLMuILQTZarzXg==", + "type": "package", + "path": "system.xml.readerwriter/4.0.11", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Xml.ReaderWriter.dll", + "lib/netstandard1.3/System.Xml.ReaderWriter.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Xml.ReaderWriter.dll", + "ref/netcore50/System.Xml.ReaderWriter.xml", + "ref/netcore50/de/System.Xml.ReaderWriter.xml", + "ref/netcore50/es/System.Xml.ReaderWriter.xml", + "ref/netcore50/fr/System.Xml.ReaderWriter.xml", + "ref/netcore50/it/System.Xml.ReaderWriter.xml", + "ref/netcore50/ja/System.Xml.ReaderWriter.xml", + "ref/netcore50/ko/System.Xml.ReaderWriter.xml", + "ref/netcore50/ru/System.Xml.ReaderWriter.xml", + "ref/netcore50/zh-hans/System.Xml.ReaderWriter.xml", + "ref/netcore50/zh-hant/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/System.Xml.ReaderWriter.dll", + "ref/netstandard1.0/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/de/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/es/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/fr/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/it/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/ja/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/ko/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/ru/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/zh-hans/System.Xml.ReaderWriter.xml", + "ref/netstandard1.0/zh-hant/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/System.Xml.ReaderWriter.dll", + "ref/netstandard1.3/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/de/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/es/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/fr/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/it/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/ja/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/ko/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/ru/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/zh-hans/System.Xml.ReaderWriter.xml", + "ref/netstandard1.3/zh-hant/System.Xml.ReaderWriter.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.xml.readerwriter.4.0.11.nupkg.sha512", + "system.xml.readerwriter.nuspec" + ] + }, + "System.Xml.XDocument/4.0.11": { + "sha512": "+K6QKQGWPyY285wGUtgtqp3z+z49WmBJPDn2zwHtB8fVfxdaLSiV9Khy1OklJ+UTFSIhjRpn2i/UkeFiJzqFJw==", + "type": "package", + "path": "system.xml.xdocument/4.0.11", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Xml.XDocument.dll", + "lib/netstandard1.3/System.Xml.XDocument.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Xml.XDocument.dll", + "ref/netcore50/System.Xml.XDocument.xml", + "ref/netcore50/de/System.Xml.XDocument.xml", + "ref/netcore50/es/System.Xml.XDocument.xml", + "ref/netcore50/fr/System.Xml.XDocument.xml", + "ref/netcore50/it/System.Xml.XDocument.xml", + "ref/netcore50/ja/System.Xml.XDocument.xml", + "ref/netcore50/ko/System.Xml.XDocument.xml", + "ref/netcore50/ru/System.Xml.XDocument.xml", + "ref/netcore50/zh-hans/System.Xml.XDocument.xml", + "ref/netcore50/zh-hant/System.Xml.XDocument.xml", + "ref/netstandard1.0/System.Xml.XDocument.dll", + "ref/netstandard1.0/System.Xml.XDocument.xml", + "ref/netstandard1.0/de/System.Xml.XDocument.xml", + "ref/netstandard1.0/es/System.Xml.XDocument.xml", + "ref/netstandard1.0/fr/System.Xml.XDocument.xml", + "ref/netstandard1.0/it/System.Xml.XDocument.xml", + "ref/netstandard1.0/ja/System.Xml.XDocument.xml", + "ref/netstandard1.0/ko/System.Xml.XDocument.xml", + "ref/netstandard1.0/ru/System.Xml.XDocument.xml", + "ref/netstandard1.0/zh-hans/System.Xml.XDocument.xml", + "ref/netstandard1.0/zh-hant/System.Xml.XDocument.xml", + "ref/netstandard1.3/System.Xml.XDocument.dll", + "ref/netstandard1.3/System.Xml.XDocument.xml", + "ref/netstandard1.3/de/System.Xml.XDocument.xml", + "ref/netstandard1.3/es/System.Xml.XDocument.xml", + "ref/netstandard1.3/fr/System.Xml.XDocument.xml", + "ref/netstandard1.3/it/System.Xml.XDocument.xml", + "ref/netstandard1.3/ja/System.Xml.XDocument.xml", + "ref/netstandard1.3/ko/System.Xml.XDocument.xml", + "ref/netstandard1.3/ru/System.Xml.XDocument.xml", + "ref/netstandard1.3/zh-hans/System.Xml.XDocument.xml", + "ref/netstandard1.3/zh-hant/System.Xml.XDocument.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.xml.xdocument.4.0.11.nupkg.sha512", + "system.xml.xdocument.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + ".NETCoreApp,Version=v2.2": [ + "AutoMapper >= 8.1.1", + "Microsoft.NETCore.App >= 2.2.0", + "NuGet.Packaging >= 5.1.0" + ] + }, + "packageFolders": { + "/Users/mikhail.nikolyukin/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/mikhail.nikolyukin/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj", + "projectName": "ConsoleApp1", + "projectPath": "/Users/mikhail.nikolyukin/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj", + "packagesPath": "/Users/mikhail.nikolyukin/.nuget/packages/", + "outputPath": "/Users/mikhail.nikolyukin/RiderProjects/ConsoleApp1/ConsoleApp1/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netcoreapp2.2" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netcoreapp2.2": { + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "netcoreapp2.2": { + "dependencies": { + "AutoMapper": { + "target": "Package", + "version": "[8.1.1, )" + }, + "Microsoft.NETCore.App": { + "suppressParent": "All", + "target": "Package", + "version": "[2.2.0, )", + "autoReferenced": true + }, + "NuGet.Packaging": { + "target": "Package", + "version": "[5.1.0, )" + } + }, + "imports": [ + "net461" + ], + "assetTargetFallback": true, + "warn": true + } + } + } +} \ No newline at end of file From 6e8a0889035fa1b710893017660a6575fb5846c4 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Tue, 30 Jul 2019 11:37:34 +0300 Subject: [PATCH 06/25] add NuGetConfigDiscoverer, NuGetConfigDeserializer and tests --- .../dotnet/common/{Utils.kt => FileUtils.kt} | 0 .../jetbrains/dotnet/common/XPathReader.kt | 27 +++++++ .../dotnet/discovery/Configuration.kt | 3 - .../discovery/FileProjectStreamFactory.kt | 2 +- .../jetbrains/dotnet/discovery/Framework.kt | 3 - .../JsonAssetsProjectDeserializer.kt | 28 ++++--- .../dotnet/discovery/JsonAssetsProjectDto.kt | 6 +- .../discovery/JsonProjectDeserializer.kt | 11 ++- .../discovery/MSBuildProjectDeserializer.kt | 42 +++++----- .../discovery/MSBuildSolutionDeserializer.kt | 1 + .../discovery/NuGetConfigDeserializer.kt | 27 +++++++ .../dotnet/discovery/NuGetConfigDiscoverer.kt | 21 +++++ .../dotnet/discovery/ProjectStreamFactory.kt | 3 +- .../dotnet/discovery/ProjectTypeSelector.kt | 2 + .../discovery/ProjectTypeSelectorImpl.kt | 1 + .../org/jetbrains/dotnet/discovery/Runtime.kt | 3 - .../dotnet/discovery/SolutionDeserializer.kt | 1 + .../dotnet/discovery/SolutionDiscoverImpl.kt | 1 + .../dotnet/discovery/SolutionDiscoverer.kt | 1 + .../org/jetbrains/dotnet/discovery/Source.kt | 3 - .../org/jetbrains/dotnet/discovery/Target.kt | 3 - .../dotnet/discovery/data/Configuration.kt | 3 + .../dotnet/discovery/data/Framework.kt | 3 + .../dotnet/discovery/{ => data}/Project.kt | 2 +- .../dotnet/discovery/{ => data}/Reference.kt | 2 +- .../dotnet/discovery/data/Runtime.kt | 3 + .../dotnet/discovery/{ => data}/Solution.kt | 2 +- .../jetbrains/dotnet/discovery/data/Source.kt | 3 + .../jetbrains/dotnet/discovery/data/Target.kt | 3 + .../test/JsonAssetsProjectDeserializerTest.kt | 36 +++++++-- .../test/JsonProjectDeserializerTest.kt | 22 +++++- .../test/MSBuildProjectDeserializerTest.kt | 45 +++++++++-- .../test/MSBuildSolutionDeserializerTest.kt | 10 ++- .../dotnet/test/ProjectStreamFactoryStub.kt | 3 - .../dotnet/test/ProjectTypeSelectorTest.kt | 4 +- .../dotnet/test/SolutionDiscoverTest.kt | 4 +- src/test/resources/nuget.config | 76 +++++++++++++++++++ 37 files changed, 319 insertions(+), 91 deletions(-) rename src/main/kotlin/org/jetbrains/dotnet/common/{Utils.kt => FileUtils.kt} (100%) create mode 100644 src/main/kotlin/org/jetbrains/dotnet/common/XPathReader.kt delete mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/Configuration.kt delete mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/Framework.kt create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt delete mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/Runtime.kt delete mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt delete mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/Target.kt create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/data/Configuration.kt create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/data/Framework.kt rename src/main/kotlin/org/jetbrains/dotnet/discovery/{ => data}/Project.kt (89%) rename src/main/kotlin/org/jetbrains/dotnet/discovery/{ => data}/Reference.kt (88%) create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/data/Runtime.kt rename src/main/kotlin/org/jetbrains/dotnet/discovery/{ => data}/Solution.kt (74%) create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt create mode 100644 src/main/kotlin/org/jetbrains/dotnet/discovery/data/Target.kt create mode 100644 src/test/resources/nuget.config diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt b/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt similarity index 100% rename from src/main/kotlin/org/jetbrains/dotnet/common/Utils.kt rename to src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/XPathReader.kt b/src/main/kotlin/org/jetbrains/dotnet/common/XPathReader.kt new file mode 100644 index 0000000..e976dd6 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/common/XPathReader.kt @@ -0,0 +1,27 @@ +package org.jetbrains.dotnet.common + +import org.w3c.dom.Document +import org.w3c.dom.Element +import org.w3c.dom.NodeList +import javax.xml.xpath.XPathConstants +import javax.xml.xpath.XPathFactory + +open class XPathReader { + + private val xPath = XPathFactory.newInstance().newXPath() + + protected fun getElements(doc: Document, xpath: String): Sequence = sequence { + val nodes = xPath.evaluate(xpath, doc, XPathConstants.NODESET) as NodeList + for (i in 0 until nodes.length) { + val element = nodes.item(i) as Element + yield(element) + } + } + + protected fun getContents(doc: Document, xpath: String): Sequence = + getElements(doc, xpath).map { it.textContent }.filter { !it.isNullOrBlank() } + + protected fun getAttributes(doc: Document, xpath: String, attributeName: String): Sequence = + getElements(doc, xpath).map { it.getAttribute(attributeName) }.filter { !it.isNullOrBlank() } + +} \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Configuration.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Configuration.kt deleted file mode 100644 index 69f0b06..0000000 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Configuration.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.dotnet.discovery - -data class Configuration(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt index d1c0a09..dd9d479 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt @@ -7,7 +7,7 @@ import java.io.File import java.io.InputStream import java.nio.file.Path -class FileProjectStreamFactory(override val baseDirectory: File) : ProjectStreamFactory { +class FileProjectStreamFactory(private val baseDirectory: File) : ProjectStreamFactory { override fun tryCreate(path: Path): InputStream? { val file = File(baseDirectory, path.toUnixString()) if (!file.exists()) { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Framework.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Framework.kt deleted file mode 100644 index c162840..0000000 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Framework.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.dotnet.discovery - -data class Framework(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt index 36feed1..8546d29 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt @@ -4,14 +4,17 @@ import com.google.gson.Gson import com.google.gson.JsonSyntaxException import org.jetbrains.dotnet.common.normalizeSystem import org.jetbrains.dotnet.common.toUnixString -import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION +import org.jetbrains.dotnet.discovery.data.* +import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION +import org.jetbrains.dotnet.discovery.data.Target import org.slf4j.Logger import org.slf4j.LoggerFactory import java.nio.file.Path import java.util.regex.Pattern class JsonAssetsProjectDeserializer( - private val readerFactory: ReaderFactory + private val readerFactory: ReaderFactory, + private val sourceDiscoverer: NuGetConfigDiscoverer? = null ) : SolutionDeserializer { private val gson: Gson = Gson() @@ -38,9 +41,9 @@ class JsonAssetsProjectDeserializer( val references = doc.targets?.values ?.flatMap { it.entries } ?.map { (id, pkg) -> - val splitedId = id.split("/") - val name = splitedId[0] - val version = splitedId.getOrNull(1) ?: DEFAULT_VERSION + val splinteredId = id.split("/") + val name = splinteredId[0] + val version = splinteredId.getOrNull(1) ?: DEFAULT_VERSION val dependencies = pkg.dependencies?.entries ?.map { (name, ver) -> Reference(name, ver) } ?: emptyList() @@ -50,17 +53,20 @@ class JsonAssetsProjectDeserializer( val frameworks = doc.project?.frameworks?.keys?.map { Framework(it) } ?: emptyList() - val fullPathToConfig = Path.of(doc.project?.restore?.projectPath?.normalizeSystem()) ?: path - val pathToConfig = fullPathToConfig - .toFile() - .relativeToOrSelf(projectStreamFactory.baseDirectory.absoluteFile) + val fullPathToConfig = doc.project?.restore?.projectPath ?: path.toUnixString() - val sources = doc.project?.restore?.sources?.keys?.map { Source(it) } ?: emptyList() + val configs = doc.project?.restore?.configs + + + val sources = sourceDiscoverer?.let { discoverer -> + configs?.asSequence()?.flatMap { discoverer.deserializer.deserialize(Path.of(it.normalizeSystem()), projectStreamFactory) }?.toList() + ?: discoverer.discover(path, projectStreamFactory).toList() + } ?: emptyList() Solution( listOf( Project( - pathToConfig.path, + fullPathToConfig, targets = targets, references = references, frameworks = frameworks, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt index f74b8a2..7b3f036 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDto.kt @@ -16,11 +16,11 @@ class ProjectDto( @SerializedName("frameworks") val frameworks: Map? ) -class DependenciesDto ( +class DependenciesDto( @SerializedName("dependencies") val dependencies: Map? ) class RestoreDto( @SerializedName("projectPath") val projectPath : String?, - @SerializedName("sources") val sources : Map? -) + @SerializedName("configFilePaths") val configs : List? +) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index 54f15c3..8040188 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -5,14 +5,16 @@ import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.google.gson.JsonSyntaxException import org.jetbrains.dotnet.common.toUnixString -import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION +import org.jetbrains.dotnet.discovery.data.* +import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION import org.slf4j.Logger import org.slf4j.LoggerFactory import java.nio.file.Path import java.util.regex.Pattern class JsonProjectDeserializer( - private val _readerFactory: ReaderFactory + private val _readerFactory: ReaderFactory, + private val sourceDiscoverer: NuGetConfigDiscoverer? = null ) : SolutionDeserializer { private val _gson: Gson @@ -49,6 +51,8 @@ class JsonProjectDeserializer( Reference(name, version) } ?: emptyList() + val sources = sourceDiscoverer?.discover(path, projectStreamFactory)?.toList() ?: emptyList() + Solution( listOf( Project( @@ -56,7 +60,8 @@ class JsonProjectDeserializer( configurations, frameworks, runtimes, - references + references, + sources = sources ) ) ) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index 4580d57..8bfd865 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -1,22 +1,23 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.common.XPathReader import org.jetbrains.dotnet.common.XmlDocumentService import org.jetbrains.dotnet.common.toUnixString -import org.jetbrains.dotnet.discovery.Reference.Companion.DEFAULT_VERSION +import org.jetbrains.dotnet.discovery.data.* +import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION +import org.jetbrains.dotnet.discovery.data.Target import org.w3c.dom.Document import org.w3c.dom.Element -import org.w3c.dom.NodeList import java.nio.file.Path import java.nio.file.Paths import java.util.regex.Pattern import java.util.regex.Pattern.CASE_INSENSITIVE -import javax.xml.xpath.XPathConstants -import javax.xml.xpath.XPathFactory class MSBuildProjectDeserializer( - private val _xmlDocumentService: XmlDocumentService -) : SolutionDeserializer { + private val _xmlDocumentService: XmlDocumentService, + private val sourceDiscoverer: NuGetConfigDiscoverer? = null +) : XPathReader(), SolutionDeserializer { override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = @@ -78,6 +79,8 @@ class MSBuildProjectDeserializer( .filter { "true".equals(it.trim(), true) } .any() + val sources = sourceDiscoverer?.discover(path, projectStreamFactory)?.toList() ?: emptyList() + Solution( listOf( Project( @@ -87,30 +90,16 @@ class MSBuildProjectDeserializer( runtimes, references, targets, - emptyList(), + sources, generatePackageOnBuild ) ) ) } ?: Solution(emptyList()) - private fun getElements(doc: Document, xpath: String): Sequence = sequence { - val nodes = xPath.evaluate(xpath, doc, XPathConstants.NODESET) as NodeList - for (i in 0 until nodes.length) { - val element = nodes.item(i) as Element - yield(element) - } - } - - private fun getContents(doc: Document, xpath: String): Sequence = - getElements(doc, xpath).map { it.textContent }.filter { !it.isNullOrBlank() } - - private fun getAttributes(doc: Document, xpath: String, attributeName: String): Sequence = - getElements(doc, xpath).map { it.getAttribute(attributeName) }.filter { !it.isNullOrBlank() } - private fun getPackageReferences(doc: Document, xpath: String): Sequence = getElements(doc, xpath) - .map { Reference(it.getAttribute("Include") ?: "", getVersion(it))} + .map { Reference(it.getAttribute("Include") ?: "", getVersion(it)) } .filter { it.id.isNotEmpty() } private fun getVersion(element: Element): String { @@ -127,11 +116,14 @@ class MSBuildProjectDeserializer( private fun loadPackagesConfig(doc: Document): Sequence = getElements(doc, "/packages/package") - .map { Reference(it.getAttribute("id") ?: "", it.getAttribute("version") ?: DEFAULT_VERSION) } + .map { + Reference( + it.getAttribute("id") ?: "", + it.getAttribute("version") ?: DEFAULT_VERSION + ) + } .filter { it.id.isNotBlank() } - private val xPath = XPathFactory.newInstance().newXPath() - companion object { private val ConditionPattern: Regex = Regex("'\\$\\(Configuration\\)([^']*)' == '([^|]*)([^']*)'", RegexOption.IGNORE_CASE) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index 80f2d11..930f5af 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -2,6 +2,7 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.common.normalizeSystem import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.discovery.data.Solution import java.nio.file.Path import java.util.regex.Pattern diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt new file mode 100644 index 0000000..debd072 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt @@ -0,0 +1,27 @@ +package org.jetbrains.dotnet.discovery + +import org.jetbrains.dotnet.common.XPathReader +import org.jetbrains.dotnet.common.XmlDocumentService +import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.discovery.data.Source +import java.nio.file.Path +import java.util.regex.Pattern + +class NuGetConfigDeserializer(private val xmlDocumentService: XmlDocumentService) : XPathReader() { + + fun accept(path: Path) = PathPattern.matcher(path.toUnixString()).find() + + fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Sequence = + projectStreamFactory.tryCreate(path)?.use { inputStream -> + val doc = xmlDocumentService.deserialize(inputStream) + getElements(doc, "/configuration/packageSources/add").map { + val name = it.getAttribute("key") + val url = it.getAttribute("value") + Source(name, url, path.toUnixString()) + } + } ?: emptySequence() + + private companion object { + private val PathPattern: Pattern = Pattern.compile("^(.+[^\\w\\d]|)nuget\\.config$", Pattern.CASE_INSENSITIVE) + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt new file mode 100644 index 0000000..871792f --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt @@ -0,0 +1,21 @@ +package org.jetbrains.dotnet.discovery + +import org.jetbrains.dotnet.discovery.data.Source +import java.nio.file.Path + +class NuGetConfigDiscoverer( + val deserializer: NuGetConfigDeserializer +) { + fun discover(path: Path, projectStreamFactory: ProjectStreamFactory): Sequence { + var result = emptySequence() + + var currPath: Path? = Path.of(".").resolve(path) + while (currPath != null) { + val possiblePath = currPath.resolve("nuget.config") + result += deserializer.deserialize(possiblePath, projectStreamFactory) + currPath = currPath.parent + } + return result + } + +} diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt index 340f7ed..f5886b8 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectStreamFactory.kt @@ -1,10 +1,9 @@ package org.jetbrains.dotnet.discovery -import java.io.File import java.io.InputStream import java.nio.file.Path interface ProjectStreamFactory { fun tryCreate(path: Path): InputStream? - val baseDirectory: File +// val baseDirectory: File } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelector.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelector.kt index f81b258..760585b 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelector.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelector.kt @@ -1,5 +1,7 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.discovery.data.Project + interface ProjectTypeSelector { fun select(project: Project): Set } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelectorImpl.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelectorImpl.kt index 6f91ebf..9c2d8ae 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelectorImpl.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/ProjectTypeSelectorImpl.kt @@ -1,5 +1,6 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.discovery.data.Project import java.util.regex.Pattern class ProjectTypeSelectorImpl : ProjectTypeSelector { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Runtime.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Runtime.kt deleted file mode 100644 index abb283b..0000000 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Runtime.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.dotnet.discovery - -data class Runtime(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt index 0691807..35f761c 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDeserializer.kt @@ -1,5 +1,6 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.discovery.data.Solution import java.nio.file.Path interface SolutionDeserializer { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt index 545dd3d..0428546 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt @@ -1,5 +1,6 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.discovery.data.Solution import org.slf4j.Logger import org.slf4j.LoggerFactory import java.nio.file.Path diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt index c0e183e..08b2591 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverer.kt @@ -1,5 +1,6 @@ package org.jetbrains.dotnet.discovery +import org.jetbrains.dotnet.discovery.data.Solution import java.nio.file.Path interface SolutionDiscover { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt deleted file mode 100644 index 0010463..0000000 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Source.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.dotnet.discovery - -class Source(val id: String) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Target.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/Target.kt deleted file mode 100644 index 629e78c..0000000 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Target.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.dotnet.discovery - -data class Target(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Configuration.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Configuration.kt new file mode 100644 index 0000000..5812f5d --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Configuration.kt @@ -0,0 +1,3 @@ +package org.jetbrains.dotnet.discovery.data + +data class Configuration(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Framework.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Framework.kt new file mode 100644 index 0000000..8327efa --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Framework.kt @@ -0,0 +1,3 @@ +package org.jetbrains.dotnet.discovery.data + +data class Framework(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Project.kt similarity index 89% rename from src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt rename to src/main/kotlin/org/jetbrains/dotnet/discovery/data/Project.kt index c99fb9d..f13e632 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Project.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Project.kt @@ -1,4 +1,4 @@ -package org.jetbrains.dotnet.discovery +package org.jetbrains.dotnet.discovery.data data class Project( val project: String, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt similarity index 88% rename from src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt rename to src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt index 3fb0e59..02a8f55 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Reference.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt @@ -1,4 +1,4 @@ -package org.jetbrains.dotnet.discovery +package org.jetbrains.dotnet.discovery.data data class Reference(val id: String, val version: String, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Runtime.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Runtime.kt new file mode 100644 index 0000000..bcdbef8 --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Runtime.kt @@ -0,0 +1,3 @@ +package org.jetbrains.dotnet.discovery.data + +data class Runtime(val name: String) \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/Solution.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Solution.kt similarity index 74% rename from src/main/kotlin/org/jetbrains/dotnet/discovery/Solution.kt rename to src/main/kotlin/org/jetbrains/dotnet/discovery/data/Solution.kt index d2d19d8..fcfdf03 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/Solution.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Solution.kt @@ -1,4 +1,4 @@ -package org.jetbrains.dotnet.discovery +package org.jetbrains.dotnet.discovery.data data class Solution(val projects: List, val solution: String = "") { val isSimple: Boolean = solution.isBlank() diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt new file mode 100644 index 0000000..7e1978a --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt @@ -0,0 +1,3 @@ +package org.jetbrains.dotnet.discovery.data + +data class Source(val id: String?, val url: String, val pathToFile: String? = null) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Target.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Target.kt new file mode 100644 index 0000000..3804aea --- /dev/null +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Target.kt @@ -0,0 +1,3 @@ +package org.jetbrains.dotnet.discovery.data + +data class Target(val name: String) \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt index 60c5b09..beb0d96 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt @@ -1,7 +1,14 @@ package org.jetbrains.dotnet.test -import org.jetbrains.dotnet.discovery.* -import org.jetbrains.dotnet.discovery.Target +import org.jetbrains.dotnet.common.XmlDocumentServiceImpl +import org.jetbrains.dotnet.discovery.JsonAssetsProjectDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDiscoverer +import org.jetbrains.dotnet.discovery.ReaderFactoryImpl +import org.jetbrains.dotnet.discovery.data.Framework +import org.jetbrains.dotnet.discovery.data.Reference +import org.jetbrains.dotnet.discovery.data.Source +import org.jetbrains.dotnet.discovery.data.Target import org.testng.Assert.assertEquals import org.testng.Assert.assertTrue import org.testng.annotations.DataProvider @@ -14,10 +21,14 @@ class JsonAssetsProjectDeserializerTest { fun shouldDeserialize() { // Given val target = "/project.assets.json" + val config = "/nuget.config" val path = Path.of("./project.assets.json") - val streamFactory = ProjectStreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) + val streamFactory = ProjectStreamFactoryStub() + .add(path, this::class.java.getResourceAsStream(target)) + .add(Path.of("/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config"), this::class.java.getResourceAsStream(config)) + val deserializer = - JsonAssetsProjectDeserializer(ReaderFactoryImpl()) + JsonAssetsProjectDeserializer(ReaderFactoryImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) // When val actualSolution = deserializer.deserialize(path, streamFactory) @@ -29,12 +40,21 @@ class JsonAssetsProjectDeserializerTest { assertEquals(project.frameworks, listOf(Framework("netcoreapp2.2"))) assertEquals(project.targets, listOf(Target(".NETCoreApp,Version=v2.2"))) assertTrue(project.references.toSet().containsAll( listOf( - Reference("AutoMapper", "8.1.1", listOf( - Reference("Microsoft.CSharp", "4.5.0"), - Reference("System.Reflection.Emit", "4.3.0") - ), true), + Reference( + "AutoMapper", "8.1.1", listOf( + Reference("Microsoft.CSharp", "4.5.0"), + Reference("System.Reflection.Emit", "4.3.0") + ), true + ), Reference("NuGet.Versioning", "5.1.0", emptyList(), false) ))) + assertEquals(project.sources, + listOf( + Source("nuget.org", "https://api.nuget.org/v3/index.json", "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config"), + Source("Contoso", "https://contoso.com/packages/", "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config"), + Source("Test Source", "c:\\packages", "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config") + ) + ) } @DataProvider diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index 952eb20..a3629a8 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -1,7 +1,12 @@ package org.jetbrains.dotnet.test -import org.jetbrains.dotnet.discovery.* +import org.jetbrains.dotnet.common.XmlDocumentServiceImpl +import org.jetbrains.dotnet.discovery.JsonProjectDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDiscoverer +import org.jetbrains.dotnet.discovery.ReaderFactoryImpl +import org.jetbrains.dotnet.discovery.data.* import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test @@ -30,7 +35,12 @@ class JsonProjectDeserializerTest { Framework("dnxcore50") ), emptyList(), - referencies + referencies, + sources = listOf( + Source("nuget.org", "https://api.nuget.org/v3/index.json", "nuget.config"), + Source("Contoso", "https://contoso.com/packages/", "nuget.config"), + Source("Test Source", "c:\\packages", "nuget.config") + ) ) ) ) @@ -42,9 +52,13 @@ class JsonProjectDeserializerTest { fun shouldDeserialize(target: String, expectedSolution: Solution) { // Given val path = Path.of("projectPath") - val streamFactory = ProjectStreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) + val config = "/nuget.config" + val streamFactory = ProjectStreamFactoryStub() + .add(path, this::class.java.getResourceAsStream(target)) + .add(Path.of("nuget.config"), this::class.java.getResourceAsStream(config)) + val deserializer = - JsonProjectDeserializer(ReaderFactoryImpl()) + JsonProjectDeserializer(ReaderFactoryImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) // When val actualSolution = deserializer.deserialize(path, streamFactory) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index e4a767d..f6bb10c 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -1,12 +1,16 @@ package org.jetbrains.dotnet.test import org.jetbrains.dotnet.common.XmlDocumentServiceImpl -import org.jetbrains.dotnet.discovery.* -import org.jetbrains.dotnet.discovery.Target +import org.jetbrains.dotnet.discovery.MSBuildProjectDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDiscoverer +import org.jetbrains.dotnet.discovery.data.* +import org.jetbrains.dotnet.discovery.data.Target import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test import java.nio.file.Path +import java.util.* class MSBuildProjectDeserializerTest { @DataProvider @@ -14,6 +18,7 @@ class MSBuildProjectDeserializerTest { return arrayOf( arrayOf( "/project-runtime.csproj", + Optional.empty(), Solution( listOf( Project( @@ -35,6 +40,7 @@ class MSBuildProjectDeserializerTest { ), arrayOf( "/GeneratePackageOnBuild.csproj", + Optional.empty(), Solution( listOf( Project( @@ -55,6 +61,7 @@ class MSBuildProjectDeserializerTest { ), arrayOf( "/project14.csproj", + Optional.of("/nuget.config"), Solution( listOf( Project( @@ -72,6 +79,11 @@ class MSBuildProjectDeserializerTest { Reference("System.Xml", "*"), Reference("jQuery", "3.1.1"), Reference("NLog", "4.3.10") + ), + sources = listOf( + Source("nuget.org", "https://api.nuget.org/v3/index.json", "nuget.config"), + Source("Contoso", "https://contoso.com/packages/", "nuget.config"), + Source("Test Source", "c:\\packages", "nuget.config") ) ) ) @@ -79,6 +91,7 @@ class MSBuildProjectDeserializerTest { ), arrayOf( "/project.csproj", + Optional.empty(), Solution( listOf( Project( @@ -87,8 +100,14 @@ class MSBuildProjectDeserializerTest { listOf(Framework("netcoreapp1.0")), emptyList(), listOf( - Reference("Microsoft.NET.Sdk", "1.0.0-alpha-20161104-2"), - Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02"), + Reference( + "Microsoft.NET.Sdk", + "1.0.0-alpha-20161104-2" + ), + Reference( + "Microsoft.NET.Test.Sdk", + "15.0.0-preview-20161024-02" + ), Reference("jQuery", "3.1.1"), Reference("NLog", "4.3.10") ) @@ -98,6 +117,7 @@ class MSBuildProjectDeserializerTest { ), arrayOf( "/build.proj", + Optional.empty(), Solution( listOf( Project( @@ -120,6 +140,7 @@ class MSBuildProjectDeserializerTest { ), arrayOf( "/project-simplified.csproj", + Optional.empty(), Solution( listOf( Project( @@ -128,8 +149,14 @@ class MSBuildProjectDeserializerTest { listOf(Framework("netcoreapp1.0")), emptyList(), listOf( - Reference("Microsoft.NET.Sdk", "1.0.0-alpha-20161104-2"), - Reference("Microsoft.NET.Test.Sdk", "15.0.0-preview-20161024-02"), + Reference( + "Microsoft.NET.Sdk", + "1.0.0-alpha-20161104-2" + ), + Reference( + "Microsoft.NET.Test.Sdk", + "15.0.0-preview-20161024-02" + ), Reference("jQuery", "3.1.1"), Reference("NLog", "4.3.10") ) @@ -139,6 +166,7 @@ class MSBuildProjectDeserializerTest { ), arrayOf( "/project-frameworks.csproj", + Optional.empty(), Solution( listOf( Project( @@ -162,7 +190,7 @@ class MSBuildProjectDeserializerTest { } @Test(dataProvider = "testDeserializeData") - fun shouldDeserialize(target: String, expectedSolution: Solution) { + fun shouldDeserialize(target: String, config: Optional, expectedSolution: Solution) { // Given val path = Path.of("projectPath") val packagesConfigPath = Path.of("packages.config") @@ -171,9 +199,10 @@ class MSBuildProjectDeserializerTest { .add(path, this::class.java.getResourceAsStream(target)) .add(packagesConfigPath, this::class.java.getResourceAsStream("/packages.config")) + config.ifPresent { streamFactory.add(Path.of("nuget.config"), this::class.java.getResourceAsStream(it)) } val deserializer = - MSBuildProjectDeserializer(XmlDocumentServiceImpl()) + MSBuildProjectDeserializer(XmlDocumentServiceImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) // When val actualSolution = deserializer.deserialize(path, streamFactory) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index 6b41e35..9e5607f 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -1,7 +1,10 @@ package org.jetbrains.dotnet.test import org.jetbrains.dotnet.common.toUnixString -import org.jetbrains.dotnet.discovery.* +import org.jetbrains.dotnet.discovery.MSBuildSolutionDeserializer +import org.jetbrains.dotnet.discovery.ReaderFactoryImpl +import org.jetbrains.dotnet.discovery.SolutionDeserializer +import org.jetbrains.dotnet.discovery.data.* import org.jmock.Expectations import org.jmock.Mockery import org.testng.Assert @@ -58,7 +61,10 @@ class MSBuildSolutionDeserializerTest { ) ) val expectedSolution = - Solution(solution1.projects.plus(solution2.projects), path.toUnixString()) + Solution( + solution1.projects.plus(solution2.projects), + path.toUnixString() + ) ctx.checking(object : Expectations() { init { diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt index f73c50b..42e439d 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt @@ -2,13 +2,10 @@ package org.jetbrains.dotnet.test import org.jetbrains.dotnet.common.toUnixString import org.jetbrains.dotnet.discovery.ProjectStreamFactory -import java.io.File import java.io.InputStream import java.nio.file.Path class ProjectStreamFactoryStub : ProjectStreamFactory { - override val baseDirectory: File - get() = File(".") private val _streams: MutableMap = mutableMapOf() diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt index f1c0118..d79a32a 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt @@ -1,9 +1,9 @@ package org.jetbrains.dotnet.test -import org.jetbrains.dotnet.discovery.Project import org.jetbrains.dotnet.discovery.ProjectType import org.jetbrains.dotnet.discovery.ProjectTypeSelectorImpl -import org.jetbrains.dotnet.discovery.Reference +import org.jetbrains.dotnet.discovery.data.Project +import org.jetbrains.dotnet.discovery.data.Reference import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt index 105dd30..b384f28 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt @@ -1,6 +1,8 @@ package org.jetbrains.dotnet.test -import org.jetbrains.dotnet.discovery.* +import org.jetbrains.dotnet.discovery.SolutionDeserializer +import org.jetbrains.dotnet.discovery.SolutionDiscoverImpl +import org.jetbrains.dotnet.discovery.data.* import org.jmock.Expectations import org.jmock.Mockery import org.testng.Assert diff --git a/src/test/resources/nuget.config b/src/test/resources/nuget.config new file mode 100644 index 0000000..5a34148 --- /dev/null +++ b/src/test/resources/nuget.config @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + microsoft;aspnet;nuget + + + \ No newline at end of file From 6e3631a3e54c55a320bac0042cffc9600472bdc8 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Tue, 30 Jul 2019 12:32:39 +0300 Subject: [PATCH 07/25] add NuGetConfigDiscovererTest --- .../dotnet/test/NuGetConfigDiscovererTest.kt | 54 +++++++++++++ src/test/resources/configs/config1 | 7 ++ src/test/resources/configs/config2 | 7 ++ src/test/resources/configs/config3 | 75 +++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt create mode 100644 src/test/resources/configs/config1 create mode 100644 src/test/resources/configs/config2 create mode 100644 src/test/resources/configs/config3 diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt new file mode 100644 index 0000000..36de03f --- /dev/null +++ b/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt @@ -0,0 +1,54 @@ +package org.jetbrains.dotnet.test + +import org.jetbrains.dotnet.common.XmlDocumentServiceImpl +import org.jetbrains.dotnet.discovery.NuGetConfigDeserializer +import org.jetbrains.dotnet.discovery.NuGetConfigDiscoverer +import org.jetbrains.dotnet.discovery.data.Source +import org.testng.Assert.assertEquals +import org.testng.annotations.DataProvider +import org.testng.annotations.Test +import java.nio.file.Path + +class NuGetConfigDiscovererTest { + + @DataProvider + fun testDeserializeData(): Array> = + arrayOf( + arrayOf( + "/a/b/c/d", + listOf( + "/configs/config1" to "/a/b/c/nuget.config", + "/configs/config2" to "/a/b/nuget.config", + "/configs/config3" to "/nuget.config" + ), + setOf( + Source("nuget.org", "https://api.nuget.org/v3/index.json", "/a/b/c/nuget.config"), + Source("Contoso", "https://contoso.com/packages/", "/a/b/nuget.config"), + Source("MyRepo - ES", "https://MyRepo/ES/nuget", "/nuget.config"), + Source("Test Source", "c:\\packages", "/nuget.config") + ) + ) + ) + + + @Test(dataProvider = "testDeserializeData") + fun testDiscover(path: String, configs: List>, expectedSources: Set) { + val streamFactory = ProjectStreamFactoryStub() + configs.forEach { + streamFactory.add(Path.of(it.second), this::class.java.getResourceAsStream(it.first)) + } + val discoverer = + NuGetConfigDiscoverer( + NuGetConfigDeserializer( + XmlDocumentServiceImpl() + ) + ) + + + // When + val actualSolution = discoverer.discover(Path.of(path), streamFactory).toSet() + + // Then + assertEquals(actualSolution, expectedSources) + } +} \ No newline at end of file diff --git a/src/test/resources/configs/config1 b/src/test/resources/configs/config1 new file mode 100644 index 0000000..3f73321 --- /dev/null +++ b/src/test/resources/configs/config1 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/test/resources/configs/config2 b/src/test/resources/configs/config2 new file mode 100644 index 0000000..800ee49 --- /dev/null +++ b/src/test/resources/configs/config2 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/test/resources/configs/config3 b/src/test/resources/configs/config3 new file mode 100644 index 0000000..2a3cbf9 --- /dev/null +++ b/src/test/resources/configs/config3 @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + microsoft;aspnet;nuget + + + \ No newline at end of file From 99a07c28c52563dd29f9c08a0a2b205e7183e393 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Wed, 31 Jul 2019 10:57:02 +0300 Subject: [PATCH 08/25] remove windows incorrect path from test --- .../jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt | 1 - .../org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt | 1 - .../org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt | 1 - 3 files changed, 3 deletions(-) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt index beb0d96..0a13f42 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt @@ -72,7 +72,6 @@ class JsonAssetsProjectDeserializerTest { arrayOf("10rer323project.assets.json", false), arrayOf(".json", false), arrayOf("json", false), - arrayOf(" ", false), arrayOf("", false) ) } diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index a3629a8..77ba23d 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -82,7 +82,6 @@ class JsonProjectDeserializerTest { arrayOf("10rer323project.json", false), arrayOf(".json", false), arrayOf("json", false), - arrayOf(" ", false), arrayOf("", false) ) } diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index f6bb10c..a3c2b22 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -233,7 +233,6 @@ class MSBuildProjectDeserializerTest { arrayOf("proj", false), arrayOf("csproj", false), arrayOf("VBproj", false), - arrayOf(" ", false), arrayOf("", false) ) } From 29891ea5be6e56b2e66d756d03db220a56514381 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 5 Aug 2019 11:55:12 +0300 Subject: [PATCH 09/25] rewrite build.gradle to kotlin dsl + remove commons.io --- build.gradle | 47 ------------------ build.gradle.kts | 49 +++++++++++++++++++ settings.gradle | 2 - settings.gradle.kts | 2 + .../org/jetbrains/dotnet/common/FileUtils.kt | 26 +++++++--- .../discovery/FileProjectStreamFactory.kt | 3 +- .../JsonAssetsProjectDeserializer.kt | 10 ++-- .../discovery/JsonProjectDeserializer.kt | 6 +-- .../discovery/MSBuildProjectDeserializer.kt | 6 +-- .../discovery/MSBuildSolutionDeserializer.kt | 12 ++--- .../discovery/NuGetConfigDeserializer.kt | 6 +-- .../test/MSBuildSolutionDeserializerTest.kt | 6 +-- .../dotnet/test/ProjectStreamFactoryStub.kt | 6 +-- 13 files changed, 96 insertions(+), 85 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 4543d76..0000000 --- a/build.gradle +++ /dev/null @@ -1,47 +0,0 @@ -plugins { - id 'org.jetbrains.kotlin.jvm' version '1.3.41' - id 'java-library' - id 'maven-publish' -} - - - -group = 'org.jetbrains' -version = '1.0' - -publishing { - publications { - myLibrary(MavenPublication) { - from components.java - } - } -} - - - -repositories { - mavenCentral() -} - -test { - useTestNG() -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib" - compile 'com.google.code.gson:gson:2.5' - compile 'org.slf4j:slf4j-api:1.7.25' - compile 'org.slf4j:slf4j-simple:1.7.25' - compile group: 'commons-io', name: 'commons-io', version: '2.6' - - testCompile 'org.testng:testng:6.14.3' - testCompile 'org.jmock:jmock:2.5.1' - -} - -compileKotlin { - kotlinOptions.jvmTarget = "1.8" -} -compileTestKotlin { - kotlinOptions.jvmTarget = "1.8" -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..13c470f --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,49 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.3.41" + `maven-publish` +} + + + +group = "org.jetbrains" +version = "1.0" + +val sourcesJar by tasks.registering(Jar::class) { + archiveClassifier.set("sources") + from(sourceSets.main.get().allSource) +} + +publishing { + publications { + register("mavenJava") { + from(components["java"]) + artifact(sourcesJar.get()) + } + } +} + + + +repositories { + mavenCentral() +} + +tasks.withType { + useTestNG() +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib") + implementation("com.google.code.gson:gson:2.5") + implementation("org.slf4j:slf4j-api:1.7.25") + implementation("org.slf4j:slf4j-simple:1.7.25") + + testImplementation("org.testng:testng:6.14.3") + testImplementation("org.jmock:jmock:2.5.1") +} + +tasks.withType { + kotlinOptions.jvmTarget = "1.8" +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index fedd5cc..0000000 --- a/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'dotnet-discovery' - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..b2f18f9 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "dotnet-discovery" + diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt b/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt index 5679f68..5a355df 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt @@ -1,18 +1,28 @@ package org.jetbrains.dotnet.common -import org.apache.commons.io.FilenameUtils import java.nio.file.Path -internal fun Path.toUnixString(): String = this.toString().normalizeSystem(true) -internal fun String.toUnixString(): String = this.normalizeSystem(true) +internal fun Path.toNormalizedUnixString(): String = this.normalize().toString().toSystem(true) -internal fun String.normalizeSystem(isUnix: Boolean = !isWindows()) = - FilenameUtils.normalize(this, isUnix) +internal fun String.toSystem(isUnix: Boolean = !isWindows()): String { + val separators = getSeparators(isUnix) + return this.replace(separators.first, separators.second) +} -internal fun Path.normalizeSystem(isUnix: Boolean = !isWindows()) = - Path.of(this.toString().normalizeSystem(isUnix)) +internal fun Path.toSystem(isUnix: Boolean = !isWindows()) = + Path.of(this.toString().toSystem(isUnix)) private fun isWindows(): Boolean { return System.getProperty("os.name").toLowerCase().contains("win") -} \ No newline at end of file +} + +private fun getSeparators(isUnix: Boolean) = + if (isUnix) { + WINDOWS_SEPARATOR to UNIX_SEPARATOR + } else { + UNIX_SEPARATOR to WINDOWS_SEPARATOR + } + +private const val WINDOWS_SEPARATOR = "\\" +private const val UNIX_SEPARATOR = "/" \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt index dd9d479..37ac218 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/FileProjectStreamFactory.kt @@ -1,6 +1,5 @@ package org.jetbrains.dotnet.discovery -import org.jetbrains.dotnet.common.toUnixString import org.slf4j.Logger import org.slf4j.LoggerFactory import java.io.File @@ -9,7 +8,7 @@ import java.nio.file.Path class FileProjectStreamFactory(private val baseDirectory: File) : ProjectStreamFactory { override fun tryCreate(path: Path): InputStream? { - val file = File(baseDirectory, path.toUnixString()) + val file = baseDirectory.toPath().resolve(path).toFile() if (!file.exists()) { LOG.debug("File $path was not found") return null diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt index 8546d29..c085772 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt @@ -2,8 +2,8 @@ package org.jetbrains.dotnet.discovery import com.google.gson.Gson import com.google.gson.JsonSyntaxException -import org.jetbrains.dotnet.common.normalizeSystem -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString +import org.jetbrains.dotnet.common.toSystem import org.jetbrains.dotnet.discovery.data.* import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION import org.jetbrains.dotnet.discovery.data.Target @@ -19,7 +19,7 @@ class JsonAssetsProjectDeserializer( private val gson: Gson = Gson() - override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = projectStreamFactory.tryCreate(path)?.use { inputStream -> @@ -53,13 +53,13 @@ class JsonAssetsProjectDeserializer( val frameworks = doc.project?.frameworks?.keys?.map { Framework(it) } ?: emptyList() - val fullPathToConfig = doc.project?.restore?.projectPath ?: path.toUnixString() + val fullPathToConfig = doc.project?.restore?.projectPath ?: path.toNormalizedUnixString() val configs = doc.project?.restore?.configs val sources = sourceDiscoverer?.let { discoverer -> - configs?.asSequence()?.flatMap { discoverer.deserializer.deserialize(Path.of(it.normalizeSystem()), projectStreamFactory) }?.toList() + configs?.asSequence()?.flatMap { discoverer.deserializer.deserialize(Path.of(it.toSystem()), projectStreamFactory) }?.toList() ?: discoverer.discover(path, projectStreamFactory).toList() } ?: emptyList() diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index 8040188..0ed79fd 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -4,7 +4,7 @@ import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.google.gson.JsonSyntaxException -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString import org.jetbrains.dotnet.discovery.data.* import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION import org.slf4j.Logger @@ -24,7 +24,7 @@ class JsonProjectDeserializer( _gson = builder.create() } - override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = projectStreamFactory.tryCreate(path)?.use { @@ -56,7 +56,7 @@ class JsonProjectDeserializer( Solution( listOf( Project( - path.toUnixString(), + path.toNormalizedUnixString(), configurations, frameworks, runtimes, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index 8bfd865..e50166e 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -3,7 +3,7 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.common.XPathReader import org.jetbrains.dotnet.common.XmlDocumentService -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString import org.jetbrains.dotnet.discovery.data.* import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION import org.jetbrains.dotnet.discovery.data.Target @@ -18,7 +18,7 @@ class MSBuildProjectDeserializer( private val _xmlDocumentService: XmlDocumentService, private val sourceDiscoverer: NuGetConfigDiscoverer? = null ) : XPathReader(), SolutionDeserializer { - override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = projectStreamFactory.tryCreate(path)?.use { @@ -84,7 +84,7 @@ class MSBuildProjectDeserializer( Solution( listOf( Project( - path.toUnixString(), + path.toNormalizedUnixString(), configurations, frameworks, runtimes, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index 930f5af..f398d98 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -1,7 +1,7 @@ package org.jetbrains.dotnet.discovery -import org.jetbrains.dotnet.common.normalizeSystem -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString +import org.jetbrains.dotnet.common.toSystem import org.jetbrains.dotnet.discovery.data.Solution import java.nio.file.Path import java.util.regex.Pattern @@ -10,7 +10,7 @@ class MSBuildSolutionDeserializer( private val _readerFactory: ReaderFactory, private val _msBuildProjectDeserializer: SolutionDeserializer ) : SolutionDeserializer { - override fun accept(path: Path): Boolean = PathPattern.matcher(path.toUnixString()).find() + override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = projectStreamFactory.tryCreate(path)?.use { @@ -32,13 +32,13 @@ class MSBuildSolutionDeserializer( .distinctBy { it.project } .toList() - Solution(projects, path.toUnixString()) + Solution(projects, path.toNormalizedUnixString()) } } ?: Solution(emptyList()) fun getProjectPath(basePath: Path, path: Path): Path { - val baseParent = basePath.normalizeSystem().parent ?: Path.of("") - return baseParent.resolve(path.normalizeSystem()) + val baseParent = basePath.toSystem().parent ?: Path.of("") + return baseParent.resolve(path.toSystem()) } private companion object { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt index debd072..df52934 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDeserializer.kt @@ -2,14 +2,14 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.common.XPathReader import org.jetbrains.dotnet.common.XmlDocumentService -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString import org.jetbrains.dotnet.discovery.data.Source import java.nio.file.Path import java.util.regex.Pattern class NuGetConfigDeserializer(private val xmlDocumentService: XmlDocumentService) : XPathReader() { - fun accept(path: Path) = PathPattern.matcher(path.toUnixString()).find() + fun accept(path: Path) = PathPattern.matcher(path.toNormalizedUnixString()).find() fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Sequence = projectStreamFactory.tryCreate(path)?.use { inputStream -> @@ -17,7 +17,7 @@ class NuGetConfigDeserializer(private val xmlDocumentService: XmlDocumentService getElements(doc, "/configuration/packageSources/add").map { val name = it.getAttribute("key") val url = it.getAttribute("value") - Source(name, url, path.toUnixString()) + Source(name, url, path.toNormalizedUnixString()) } } ?: emptySequence() diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index 9e5607f..07552a3 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -1,6 +1,6 @@ package org.jetbrains.dotnet.test -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString import org.jetbrains.dotnet.discovery.MSBuildSolutionDeserializer import org.jetbrains.dotnet.discovery.ReaderFactoryImpl import org.jetbrains.dotnet.discovery.SolutionDeserializer @@ -63,7 +63,7 @@ class MSBuildSolutionDeserializerTest { val expectedSolution = Solution( solution1.projects.plus(solution2.projects), - path.toUnixString() + path.toNormalizedUnixString() ) ctx.checking(object : Expectations() { @@ -164,6 +164,6 @@ class MSBuildSolutionDeserializerTest { val actualPath = deserializer.getProjectPath(Path.of(basePath), Path.of(path)) // Then - Assert.assertEquals(actualPath.toUnixString(), expectedPath) + Assert.assertEquals(actualPath.toNormalizedUnixString(), expectedPath) } } \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt index 42e439d..ac25811 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectStreamFactoryStub.kt @@ -1,6 +1,6 @@ package org.jetbrains.dotnet.test -import org.jetbrains.dotnet.common.toUnixString +import org.jetbrains.dotnet.common.toNormalizedUnixString import org.jetbrains.dotnet.discovery.ProjectStreamFactory import java.io.InputStream import java.nio.file.Path @@ -10,11 +10,11 @@ class ProjectStreamFactoryStub : ProjectStreamFactory { private val _streams: MutableMap = mutableMapOf() fun add(path: Path, inputStream: InputStream): ProjectStreamFactoryStub { - _streams[path.toUnixString()] = inputStream + _streams[path.normalize().toNormalizedUnixString()] = inputStream return this } override fun tryCreate(path: Path): InputStream? { - return _streams[path.toUnixString()] + return _streams[path.normalize().toNormalizedUnixString()] } } \ No newline at end of file From e7f3f83ad3a7453a105037bb326dd975561aaaab Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 5 Aug 2019 16:20:30 +0300 Subject: [PATCH 10/25] replace all paths to user-neutral --- .../dotnet/test/JsonAssetsProjectDeserializerTest.kt | 8 ++++---- src/test/resources/project.assets.json | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt index 0a13f42..d18751c 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt @@ -25,7 +25,7 @@ class JsonAssetsProjectDeserializerTest { val path = Path.of("./project.assets.json") val streamFactory = ProjectStreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) - .add(Path.of("/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config"), this::class.java.getResourceAsStream(config)) + .add(Path.of("/Users/username/.config/NuGet/NuGet.Config"), this::class.java.getResourceAsStream(config)) val deserializer = JsonAssetsProjectDeserializer(ReaderFactoryImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) @@ -50,9 +50,9 @@ class JsonAssetsProjectDeserializerTest { ))) assertEquals(project.sources, listOf( - Source("nuget.org", "https://api.nuget.org/v3/index.json", "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config"), - Source("Contoso", "https://contoso.com/packages/", "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config"), - Source("Test Source", "c:\\packages", "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config") + Source("nuget.org", "https://api.nuget.org/v3/index.json", "/Users/username/.config/NuGet/NuGet.Config"), + Source("Contoso", "https://contoso.com/packages/", "/Users/username/.config/NuGet/NuGet.Config"), + Source("Test Source", "c:\\packages", "/Users/username/.config/NuGet/NuGet.Config") ) ) } diff --git a/src/test/resources/project.assets.json b/src/test/resources/project.assets.json index 92374d0..2d7fb64 100644 --- a/src/test/resources/project.assets.json +++ b/src/test/resources/project.assets.json @@ -3934,19 +3934,19 @@ ] }, "packageFolders": { - "/Users/mikhail.nikolyukin/.nuget/packages/": {} + "/Users/username/.nuget/packages/": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "/Users/mikhail.nikolyukin/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj", + "projectUniqueName": "/Users/username/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj", "projectName": "ConsoleApp1", - "projectPath": "/Users/mikhail.nikolyukin/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj", - "packagesPath": "/Users/mikhail.nikolyukin/.nuget/packages/", - "outputPath": "/Users/mikhail.nikolyukin/RiderProjects/ConsoleApp1/ConsoleApp1/obj/", + "projectPath": "/Users/username/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj", + "packagesPath": "/Users/username/.nuget/packages/", + "outputPath": "/Users/username/RiderProjects/ConsoleApp1/ConsoleApp1/obj/", "projectStyle": "PackageReference", "configFilePaths": [ - "/Users/mikhail.nikolyukin/.config/NuGet/NuGet.Config" + "/Users/username/.config/NuGet/NuGet.Config" ], "originalTargetFrameworks": [ "netcoreapp2.2" From 7f5b9b694c94862321df2055a8b30bcd733020f6 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Tue, 6 Aug 2019 11:24:33 +0300 Subject: [PATCH 11/25] change all Path.of to Paths.get --- .../org/jetbrains/dotnet/common/FileUtils.kt | 3 ++- .../discovery/JsonAssetsProjectDeserializer.kt | 3 ++- .../discovery/MSBuildSolutionDeserializer.kt | 5 +++-- .../dotnet/discovery/NuGetConfigDiscoverer.kt | 3 ++- .../test/JsonAssetsProjectDeserializerTest.kt | 8 ++++---- .../dotnet/test/JsonProjectDeserializerTest.kt | 8 ++++---- .../test/MSBuildProjectDeserializerTest.kt | 10 +++++----- .../test/MSBuildSolutionDeserializerTest.kt | 18 +++++++++--------- .../dotnet/test/NuGetConfigDiscovererTest.kt | 6 +++--- .../dotnet/test/SolutionDiscoverTest.kt | 6 +++--- 10 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt b/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt index 5a355df..63c9416 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/common/FileUtils.kt @@ -1,6 +1,7 @@ package org.jetbrains.dotnet.common import java.nio.file.Path +import java.nio.file.Paths internal fun Path.toNormalizedUnixString(): String = this.normalize().toString().toSystem(true) @@ -10,7 +11,7 @@ internal fun String.toSystem(isUnix: Boolean = !isWindows()): String { } internal fun Path.toSystem(isUnix: Boolean = !isWindows()) = - Path.of(this.toString().toSystem(isUnix)) + Paths.get(this.toString().toSystem(isUnix)) private fun isWindows(): Boolean { diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt index c085772..fde45f2 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt @@ -10,6 +10,7 @@ import org.jetbrains.dotnet.discovery.data.Target import org.slf4j.Logger import org.slf4j.LoggerFactory import java.nio.file.Path +import java.nio.file.Paths import java.util.regex.Pattern class JsonAssetsProjectDeserializer( @@ -59,7 +60,7 @@ class JsonAssetsProjectDeserializer( val sources = sourceDiscoverer?.let { discoverer -> - configs?.asSequence()?.flatMap { discoverer.deserializer.deserialize(Path.of(it.toSystem()), projectStreamFactory) }?.toList() + configs?.asSequence()?.flatMap { discoverer.deserializer.deserialize(Paths.get(it.toSystem()), projectStreamFactory) }?.toList() ?: discoverer.discover(path, projectStreamFactory).toList() } ?: emptyList() diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index f398d98..cff53ac 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -4,6 +4,7 @@ import org.jetbrains.dotnet.common.toNormalizedUnixString import org.jetbrains.dotnet.common.toSystem import org.jetbrains.dotnet.discovery.data.Solution import java.nio.file.Path +import java.nio.file.Paths import java.util.regex.Pattern class MSBuildSolutionDeserializer( @@ -21,7 +22,7 @@ class MSBuildSolutionDeserializer( .mapNotNull { ProjectPathPattern.matcher(it) } .filter { it.find() } .flatMap { - val projectPath = getProjectPath(path, Path.of(it.group(1))) + val projectPath = getProjectPath(path, Paths.get(it.group(1))) if (_msBuildProjectDeserializer.accept(projectPath)) { _msBuildProjectDeserializer.deserialize(projectPath, projectStreamFactory) .projects.asSequence() @@ -37,7 +38,7 @@ class MSBuildSolutionDeserializer( } ?: Solution(emptyList()) fun getProjectPath(basePath: Path, path: Path): Path { - val baseParent = basePath.toSystem().parent ?: Path.of("") + val baseParent = basePath.toSystem().parent ?: Paths.get("") return baseParent.resolve(path.toSystem()) } diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt index 871792f..f5fe21f 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt @@ -2,6 +2,7 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.discovery.data.Source import java.nio.file.Path +import java.nio.file.Paths class NuGetConfigDiscoverer( val deserializer: NuGetConfigDeserializer @@ -9,7 +10,7 @@ class NuGetConfigDiscoverer( fun discover(path: Path, projectStreamFactory: ProjectStreamFactory): Sequence { var result = emptySequence() - var currPath: Path? = Path.of(".").resolve(path) + var currPath: Path? = Paths.get(".").resolve(path) while (currPath != null) { val possiblePath = currPath.resolve("nuget.config") result += deserializer.deserialize(possiblePath, projectStreamFactory) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt index d18751c..358ba29 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt @@ -13,7 +13,7 @@ import org.testng.Assert.assertEquals import org.testng.Assert.assertTrue import org.testng.annotations.DataProvider import org.testng.annotations.Test -import java.nio.file.Path +import java.nio.file.Paths class JsonAssetsProjectDeserializerTest { @@ -22,10 +22,10 @@ class JsonAssetsProjectDeserializerTest { // Given val target = "/project.assets.json" val config = "/nuget.config" - val path = Path.of("./project.assets.json") + val path = Paths.get("./project.assets.json") val streamFactory = ProjectStreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) - .add(Path.of("/Users/username/.config/NuGet/NuGet.Config"), this::class.java.getResourceAsStream(config)) + .add(Paths.get("/Users/username/.config/NuGet/NuGet.Config"), this::class.java.getResourceAsStream(config)) val deserializer = JsonAssetsProjectDeserializer(ReaderFactoryImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) @@ -83,7 +83,7 @@ class JsonAssetsProjectDeserializerTest { JsonAssetsProjectDeserializer(ReaderFactoryImpl()) // When - val path = Path.of(stringPath) + val path = Paths.get(stringPath) val actualAccepted = deserializer.accept(path) // Then diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index 77ba23d..4541ccf 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -10,7 +10,7 @@ import org.jetbrains.dotnet.discovery.data.* import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test -import java.nio.file.Path +import java.nio.file.Paths class JsonProjectDeserializerTest { @DataProvider @@ -51,11 +51,11 @@ class JsonProjectDeserializerTest { @Test(dataProvider = "testDeserializeData") fun shouldDeserialize(target: String, expectedSolution: Solution) { // Given - val path = Path.of("projectPath") + val path = Paths.get("projectPath") val config = "/nuget.config" val streamFactory = ProjectStreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) - .add(Path.of("nuget.config"), this::class.java.getResourceAsStream(config)) + .add(Paths.get("nuget.config"), this::class.java.getResourceAsStream(config)) val deserializer = JsonProjectDeserializer(ReaderFactoryImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) @@ -93,7 +93,7 @@ class JsonProjectDeserializerTest { JsonProjectDeserializer(ReaderFactoryImpl()) // When - val path = Path.of(stringPath) + val path = Paths.get(stringPath) val actualAccepted = deserializer.accept(path) // Then diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index a3c2b22..9ed530f 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -9,7 +9,7 @@ import org.jetbrains.dotnet.discovery.data.Target import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test -import java.nio.file.Path +import java.nio.file.Paths import java.util.* class MSBuildProjectDeserializerTest { @@ -192,14 +192,14 @@ class MSBuildProjectDeserializerTest { @Test(dataProvider = "testDeserializeData") fun shouldDeserialize(target: String, config: Optional, expectedSolution: Solution) { // Given - val path = Path.of("projectPath") - val packagesConfigPath = Path.of("packages.config") + val path = Paths.get("projectPath") + val packagesConfigPath = Paths.get("packages.config") val streamFactory = ProjectStreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) .add(packagesConfigPath, this::class.java.getResourceAsStream("/packages.config")) - config.ifPresent { streamFactory.add(Path.of("nuget.config"), this::class.java.getResourceAsStream(it)) } + config.ifPresent { streamFactory.add(Paths.get("nuget.config"), this::class.java.getResourceAsStream(it)) } val deserializer = MSBuildProjectDeserializer(XmlDocumentServiceImpl(), NuGetConfigDiscoverer(NuGetConfigDeserializer(XmlDocumentServiceImpl()))) @@ -244,7 +244,7 @@ class MSBuildProjectDeserializerTest { MSBuildProjectDeserializer(XmlDocumentServiceImpl()) // When - val path = Path.of(stringPath) + val path = Paths.get(stringPath) val actualAccepted = deserializer.accept(path) // Then diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index 07552a3..5c1f983 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -10,14 +10,14 @@ import org.jmock.Mockery import org.testng.Assert import org.testng.annotations.DataProvider import org.testng.annotations.Test -import java.nio.file.Path +import java.nio.file.Paths class MSBuildSolutionDeserializerTest { @Test fun shouldDeserialize() { // Given val target = "/solution.sln" - val path = Path.of("projectPath/aaa.sln") + val path = Paths.get("projectPath/aaa.sln") val streamFactory = ProjectStreamFactoryStub().add(path, this::class.java.getResourceAsStream(target)) val ctx = Mockery() val msBuildProjectDeserializer = ctx.mock(SolutionDeserializer::class.java) @@ -68,25 +68,25 @@ class MSBuildSolutionDeserializerTest { ctx.checking(object : Expectations() { init { - oneOf(msBuildProjectDeserializer).accept(Path.of("projectPath/proj1.csproj")) + oneOf(msBuildProjectDeserializer).accept(Paths.get("projectPath/proj1.csproj")) will(returnValue(true)) oneOf(msBuildProjectDeserializer).deserialize( - Path.of("projectPath/proj1.csproj"), + Paths.get("projectPath/proj1.csproj"), streamFactory ) will(returnValue(solution1)) - oneOf(msBuildProjectDeserializer).accept(Path.of("projectPath/dir2/proj2.csproj")) + oneOf(msBuildProjectDeserializer).accept(Paths.get("projectPath/dir2/proj2.csproj")) will(returnValue(true)) oneOf(msBuildProjectDeserializer).deserialize( - Path.of("projectPath/dir2/proj2.csproj"), + Paths.get("projectPath/dir2/proj2.csproj"), streamFactory ) will(returnValue(solution2)) - oneOf(msBuildProjectDeserializer).accept(Path.of("projectPath/Solution Items")) + oneOf(msBuildProjectDeserializer).accept(Paths.get("projectPath/Solution Items")) will(returnValue(false)) } }) @@ -132,7 +132,7 @@ class MSBuildSolutionDeserializerTest { ) // When - val actualAccepted = deserializer.accept(Path.of(path)) + val actualAccepted = deserializer.accept(Paths.get(path)) // Then Assert.assertEquals(actualAccepted, expectedAccepted) @@ -161,7 +161,7 @@ class MSBuildSolutionDeserializerTest { ) // When - val actualPath = deserializer.getProjectPath(Path.of(basePath), Path.of(path)) + val actualPath = deserializer.getProjectPath(Paths.get(basePath), Paths.get(path)) // Then Assert.assertEquals(actualPath.toNormalizedUnixString(), expectedPath) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt index 36de03f..61b566f 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/NuGetConfigDiscovererTest.kt @@ -7,7 +7,7 @@ import org.jetbrains.dotnet.discovery.data.Source import org.testng.Assert.assertEquals import org.testng.annotations.DataProvider import org.testng.annotations.Test -import java.nio.file.Path +import java.nio.file.Paths class NuGetConfigDiscovererTest { @@ -35,7 +35,7 @@ class NuGetConfigDiscovererTest { fun testDiscover(path: String, configs: List>, expectedSources: Set) { val streamFactory = ProjectStreamFactoryStub() configs.forEach { - streamFactory.add(Path.of(it.second), this::class.java.getResourceAsStream(it.first)) + streamFactory.add(Paths.get(it.second), this::class.java.getResourceAsStream(it.first)) } val discoverer = NuGetConfigDiscoverer( @@ -46,7 +46,7 @@ class NuGetConfigDiscovererTest { // When - val actualSolution = discoverer.discover(Path.of(path), streamFactory).toSet() + val actualSolution = discoverer.discover(Paths.get(path), streamFactory).toSet() // Then assertEquals(actualSolution, expectedSources) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt index b384f28..88c2396 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt @@ -7,14 +7,14 @@ import org.jmock.Expectations import org.jmock.Mockery import org.testng.Assert import org.testng.annotations.Test -import java.nio.file.Path +import java.nio.file.Paths class SolutionDiscoverTest { @Test fun shouldDiscover() { // Given - val path1 = Path.of("projectPath1/aaa.sln") - val path2 = Path.of("projectPath2/proj.sln") + val path1 = Paths.get("projectPath1/aaa.sln") + val path2 = Paths.get("projectPath2/proj.sln") val streamFactory = ProjectStreamFactoryStub() val ctx = Mockery() From 92cd4ad70bd21e37a446fcaabfb96ef6cc311ebe Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Wed, 7 Aug 2019 11:14:50 +0300 Subject: [PATCH 12/25] add pathToFile for Reference --- .../JsonAssetsProjectDeserializer.kt | 11 ++-- .../discovery/JsonProjectDeserializer.kt | 12 ++-- .../discovery/MSBuildProjectDeserializer.kt | 24 ++++---- .../dotnet/discovery/data/Reference.kt | 12 ++-- .../jetbrains/dotnet/discovery/data/Source.kt | 2 +- .../test/JsonAssetsProjectDeserializerTest.kt | 17 +++--- .../test/JsonProjectDeserializerTest.kt | 9 +-- .../test/MSBuildProjectDeserializerTest.kt | 60 +++++++++++-------- .../test/MSBuildSolutionDeserializerTest.kt | 6 +- .../dotnet/test/ProjectTypeSelectorTest.kt | 2 +- .../dotnet/test/SolutionDiscoverTest.kt | 6 +- 11 files changed, 90 insertions(+), 71 deletions(-) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt index fde45f2..840af29 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonAssetsProjectDeserializer.kt @@ -32,7 +32,10 @@ class JsonAssetsProjectDeserializer( return Solution(emptyList()) } + val fullPathToConfig = doc.project?.restore?.projectPath?.let { Paths.get(it) } ?: path + val targets = doc.targets?.keys?.map { Target(it) } ?: emptyList() + val roots : Set = doc.project?.frameworks?.values ?.flatMap { it.dependencies?.keys ?: emptySet() @@ -46,16 +49,14 @@ class JsonAssetsProjectDeserializer( val name = splinteredId[0] val version = splinteredId.getOrNull(1) ?: DEFAULT_VERSION val dependencies = pkg.dependencies?.entries - ?.map { (name, ver) -> Reference(name, ver) } ?: emptyList() + ?.map { (name, ver) -> Reference(name, ver, fullPathToConfig.toNormalizedUnixString()) } ?: emptyList() val isRoot = roots.contains(name) - Reference(name, version, dependencies, isRoot) + Reference(name, version, fullPathToConfig.toNormalizedUnixString(), dependencies, isRoot) } ?: emptyList() val frameworks = doc.project?.frameworks?.keys?.map { Framework(it) } ?: emptyList() - val fullPathToConfig = doc.project?.restore?.projectPath ?: path.toNormalizedUnixString() - val configs = doc.project?.restore?.configs @@ -67,7 +68,7 @@ class JsonAssetsProjectDeserializer( Solution( listOf( Project( - fullPathToConfig, + fullPathToConfig.toNormalizedUnixString(), targets = targets, references = references, frameworks = frameworks, diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt index 0ed79fd..22f673b 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/JsonProjectDeserializer.kt @@ -27,19 +27,23 @@ class JsonProjectDeserializer( override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = - projectStreamFactory.tryCreate(path)?.use { - _readerFactory.create(it).use { + projectStreamFactory.tryCreate(path)?.use { stream -> + _readerFactory.create(stream).use { reader -> val project = try { - _gson.fromJson(it, JsonProjectDto::class.java) + _gson.fromJson(reader, JsonProjectDto::class.java) } catch (e: JsonSyntaxException) { LOG.debug("$path contains invalid json") return Solution(emptyList()) } + val configurations = project.configurations?.keys?.map { Configuration(it) } ?: emptyList() + val frameworks = project.frameworks?.keys?.map { Framework(it) } ?: emptyList() + val runtimes = project.runtimes?.keys?.map { Runtime(it) } ?: emptyList() + val references = project.dependencies?.mapNotNull { (name, info) -> val version = when(info) { is String -> info @@ -48,7 +52,7 @@ class JsonProjectDeserializer( } else -> null } ?: DEFAULT_VERSION - Reference(name, version) + Reference(name, version, path.toNormalizedUnixString()) } ?: emptyList() val sources = sourceDiscoverer?.discover(path, projectStreamFactory)?.toList() ?: emptyList() diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index e50166e..ca35f0f 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -21,13 +21,14 @@ class MSBuildProjectDeserializer( override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = - projectStreamFactory.tryCreate(path)?.use { - val doc = _xmlDocumentService.deserialize(it) + projectStreamFactory.tryCreate(path)?.use { stream -> + val doc = _xmlDocumentService.deserialize(stream) val packagesConfigPath = Paths.get(path.parent?.toString() ?: "", "packages.config") - val packagesConfig = projectStreamFactory.tryCreate(packagesConfigPath)?.use { - loadPackagesConfig(_xmlDocumentService.deserialize(it)) + val packagesConfig = projectStreamFactory.tryCreate(packagesConfigPath)?.use { packageConfigDoc -> + loadPackagesConfig(_xmlDocumentService.deserialize(packageConfigDoc)) + .map { Reference(it.first, it.second, packagesConfigPath.toNormalizedUnixString()) } } ?: emptySequence() val configurations = getAttributes(doc, "/Project/*[@Condition]", "Condition") @@ -53,6 +54,7 @@ class MSBuildProjectDeserializer( .toList() val references = getPackageReferences(doc, "/Project/ItemGroup/PackageReference[@Include]") + .map { Reference(it.first, it.second, path.toNormalizedUnixString()) } .plus( getAttributes(doc, "/Project/ItemGroup/Reference[@Include]", "Include") .map { @@ -62,7 +64,7 @@ class MSBuildProjectDeserializer( .mapNotNull { versionPattern.find(it)?.groupValues?.get(1) } .firstOrNull() ?: DEFAULT_VERSION - Reference(id, version) + Reference(id, version, path.toNormalizedUnixString()) } ) .plus(packagesConfig) @@ -97,10 +99,10 @@ class MSBuildProjectDeserializer( ) } ?: Solution(emptyList()) - private fun getPackageReferences(doc: Document, xpath: String): Sequence = + private fun getPackageReferences(doc: Document, xpath: String): Sequence> = getElements(doc, xpath) - .map { Reference(it.getAttribute("Include") ?: "", getVersion(it)) } - .filter { it.id.isNotEmpty() } + .map { Pair(it.getAttribute("Include") ?: "", getVersion(it)) } + .filter { it.first.isNotEmpty() } private fun getVersion(element: Element): String { val rawVersion = when { @@ -114,15 +116,15 @@ class MSBuildProjectDeserializer( } } - private fun loadPackagesConfig(doc: Document): Sequence = + private fun loadPackagesConfig(doc: Document): Sequence> = getElements(doc, "/packages/package") .map { - Reference( + Pair( it.getAttribute("id") ?: "", it.getAttribute("version") ?: DEFAULT_VERSION ) } - .filter { it.id.isNotBlank() } + .filter { it.first.isNotBlank() } companion object { private val ConditionPattern: Regex = diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt index 02a8f55..5c4cd1a 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Reference.kt @@ -1,11 +1,11 @@ package org.jetbrains.dotnet.discovery.data -data class Reference(val id: String, - val version: String, - val dependencies: List = emptyList(), - val isRoot: Boolean = true) { - - constructor(pair: Pair) : this(pair.first, pair.second) +data class Reference( + val id: String, + val version: String, + val pathToFile: String, + val dependencies: List = emptyList(), + val isRoot: Boolean = true) { companion object { const val DEFAULT_VERSION = "*" diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt index 7e1978a..0401b76 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/data/Source.kt @@ -1,3 +1,3 @@ package org.jetbrains.dotnet.discovery.data -data class Source(val id: String?, val url: String, val pathToFile: String? = null) +data class Source(val id: String?, val url: String, val pathToFile: String) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt index 358ba29..c10a4be 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonAssetsProjectDeserializerTest.kt @@ -23,6 +23,7 @@ class JsonAssetsProjectDeserializerTest { val target = "/project.assets.json" val config = "/nuget.config" val path = Paths.get("./project.assets.json") + val projectPath = "/Users/username/RiderProjects/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj" val streamFactory = ProjectStreamFactoryStub() .add(path, this::class.java.getResourceAsStream(target)) .add(Paths.get("/Users/username/.config/NuGet/NuGet.Config"), this::class.java.getResourceAsStream(config)) @@ -41,18 +42,20 @@ class JsonAssetsProjectDeserializerTest { assertEquals(project.targets, listOf(Target(".NETCoreApp,Version=v2.2"))) assertTrue(project.references.toSet().containsAll( listOf( Reference( - "AutoMapper", "8.1.1", listOf( - Reference("Microsoft.CSharp", "4.5.0"), - Reference("System.Reflection.Emit", "4.3.0") + "AutoMapper", "8.1.1", projectPath, listOf( + Reference("Microsoft.CSharp", "4.5.0", projectPath), + Reference("System.Reflection.Emit", "4.3.0", projectPath) ), true ), - Reference("NuGet.Versioning", "5.1.0", emptyList(), false) + Reference("NuGet.Versioning", "5.1.0", projectPath, emptyList(), false) ))) + + val configPath = "/Users/username/.config/NuGet/NuGet.Config" assertEquals(project.sources, listOf( - Source("nuget.org", "https://api.nuget.org/v3/index.json", "/Users/username/.config/NuGet/NuGet.Config"), - Source("Contoso", "https://contoso.com/packages/", "/Users/username/.config/NuGet/NuGet.Config"), - Source("Test Source", "c:\\packages", "/Users/username/.config/NuGet/NuGet.Config") + Source("nuget.org", "https://api.nuget.org/v3/index.json", configPath), + Source("Contoso", "https://contoso.com/packages/", configPath), + Source("Test Source", "c:\\packages",configPath) ) ) } diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt index 4541ccf..5cdbeb9 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/JsonProjectDeserializerTest.kt @@ -20,7 +20,8 @@ class JsonProjectDeserializerTest { "Microsoft.AspNet.DependencyInjection" to "0.1-alpha-*", "Microsoft.AspNet.Logging" to "0.1-alpha-*", "System.Data.Common" to "0.1-alpha-*" - ).map { Reference(it) } + ).map { Reference(it.first, it.second, "projectPath") } + val configPath = "nuget.config" return arrayOf( arrayOf( @@ -37,9 +38,9 @@ class JsonProjectDeserializerTest { emptyList(), referencies, sources = listOf( - Source("nuget.org", "https://api.nuget.org/v3/index.json", "nuget.config"), - Source("Contoso", "https://contoso.com/packages/", "nuget.config"), - Source("Test Source", "c:\\packages", "nuget.config") + Source("nuget.org", "https://api.nuget.org/v3/index.json", configPath), + Source("Contoso", "https://contoso.com/packages/", configPath), + Source("Test Source", "c:\\packages", configPath) ) ) ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index 9ed530f..1968179 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -15,6 +15,10 @@ import java.util.* class MSBuildProjectDeserializerTest { @DataProvider fun testDeserializeData(): Array> { + val path = "projectPath" + val packagesConfigPath = "packages.config" + val configPath = "nuget.config" + return arrayOf( arrayOf( "/project-runtime.csproj", @@ -31,8 +35,8 @@ class MSBuildProjectDeserializerTest { Runtime("ubuntu.16.10-x64") ), listOf( - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10", packagesConfigPath) ) ) ) @@ -49,8 +53,8 @@ class MSBuildProjectDeserializerTest { listOf(Framework("netstandard2.0")), emptyList(), listOf( - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10", packagesConfigPath) ), emptyList(), emptyList(), @@ -73,17 +77,17 @@ class MSBuildProjectDeserializerTest { emptyList(), emptyList(), listOf( - Reference("nunit.engine.api", "3.0.0.0"), - Reference("System", "*"), - Reference("System.Data", "*"), - Reference("System.Xml", "*"), - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("nunit.engine.api", "3.0.0.0", path), + Reference("System", "*", path), + Reference("System.Data", "*", path), + Reference("System.Xml", "*", path), + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10", packagesConfigPath) ), sources = listOf( - Source("nuget.org", "https://api.nuget.org/v3/index.json", "nuget.config"), - Source("Contoso", "https://contoso.com/packages/", "nuget.config"), - Source("Test Source", "c:\\packages", "nuget.config") + Source("nuget.org", "https://api.nuget.org/v3/index.json", configPath), + Source("Contoso", "https://contoso.com/packages/", configPath), + Source("Test Source", "c:\\packages", configPath) ) ) ) @@ -102,14 +106,16 @@ class MSBuildProjectDeserializerTest { listOf( Reference( "Microsoft.NET.Sdk", - "1.0.0-alpha-20161104-2" + "1.0.0-alpha-20161104-2", + path ), Reference( "Microsoft.NET.Test.Sdk", - "15.0.0-preview-20161024-02" + "15.0.0-preview-20161024-02", + path ), - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10", packagesConfigPath) ) ) ) @@ -126,8 +132,8 @@ class MSBuildProjectDeserializerTest { emptyList(), emptyList(), listOf( - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10", packagesConfigPath) ), listOf( Target("GetNuGet"), @@ -151,14 +157,16 @@ class MSBuildProjectDeserializerTest { listOf( Reference( "Microsoft.NET.Sdk", - "1.0.0-alpha-20161104-2" + "1.0.0-alpha-20161104-2", + path ), Reference( "Microsoft.NET.Test.Sdk", - "15.0.0-preview-20161024-02" + "15.0.0-preview-20161024-02", + path ), - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10",packagesConfigPath) ) ) ) @@ -178,9 +186,9 @@ class MSBuildProjectDeserializerTest { ), emptyList(), listOf( - Reference("Newtonsoft.Json", "10.0.3"), - Reference("jQuery", "3.1.1"), - Reference("NLog", "4.3.10") + Reference("Newtonsoft.Json", "10.0.3", path), + Reference("jQuery", "3.1.1", packagesConfigPath), + Reference("NLog", "4.3.10", packagesConfigPath) ) ) ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index 5c1f983..94e051c 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -39,7 +39,7 @@ class MSBuildSolutionDeserializerTest { Runtime("win-7x86"), Runtime("ubuntu.16.10-x64") ), - listOf(Reference("Microsoft.NET.Sdk", "*")) + listOf(Reference("Microsoft.NET.Sdk", "*", "projectPath1")) ) ) ) @@ -54,8 +54,8 @@ class MSBuildSolutionDeserializerTest { Runtime("win-7x86") ), listOf( - Reference("Microsoft.NET.sdk", "*"), - Reference("Microsoft.NET.test.sdk", "*") + Reference("Microsoft.NET.sdk", "*", "projectPath2"), + Reference("Microsoft.NET.test.sdk", "*", "projectPath2") ) ) ) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt index d79a32a..9015214 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/ProjectTypeSelectorTest.kt @@ -61,7 +61,7 @@ class ProjectTypeSelectorTest { emptyList(), emptyList(), emptyList(), - references.map { Reference(it.first, it.second) }, + references.map { Reference(it.first, it.second, "") }, emptyList(), emptyList(), generatePackageOnBuild diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt index 88c2396..1fd3678 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/SolutionDiscoverTest.kt @@ -37,7 +37,7 @@ class SolutionDiscoverTest { Runtime("win-7x86"), Runtime("ubuntu.16.10-x64") ), - listOf(Reference("Microsoft.NET.Sdk", "")) + listOf(Reference("Microsoft.NET.Sdk", "", "projectPath1")) ) ) ) @@ -52,8 +52,8 @@ class SolutionDiscoverTest { Runtime("win-7x86") ), listOf( - Reference("Microsoft.NET.sdk", ""), - Reference("Microsoft.NET.test.sdk", "") + Reference("Microsoft.NET.sdk", "", "projectPath2"), + Reference("Microsoft.NET.test.sdk", "", "projectPath2") ) ) ) From cb852b6338fd3fb864d655590054fa0f95b6e3ef Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Fri, 9 Aug 2019 16:54:08 +0300 Subject: [PATCH 13/25] remove windows incorrect path --- .../org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index 94e051c..93c54ff 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -116,7 +116,6 @@ class MSBuildSolutionDeserializerTest { arrayOf("abc.proj", false), arrayOf(".sln", false), arrayOf("sln", false), - arrayOf(" ", false), arrayOf("", false) ) } From 6ae96919bd65e08064df8f32ac05092d753a6e60 Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Fri, 9 Aug 2019 16:03:01 +0200 Subject: [PATCH 14/25] Create README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..8af7b2b --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# .NET project model parser + +Provides project model deserializer for .NET projects: csproj files, project.json, packages.config + +## Example + +```kt +val solutionDiscover = SolutionDiscoverImpl(...) +val projectStreamFactory = FileProjectStreamFactory(Path.of("./project")) +val solutions = solution.discover(projectStreamFactory, paths) +``` + From c9a2e05a80e81835b5e1771c9af7f9cbc85471fb Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Fri, 9 Aug 2019 16:03:38 +0200 Subject: [PATCH 15/25] Create LICENSE --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From fe68f9297b74f0234d2287b40a056962f57b8af1 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Fri, 9 Aug 2019 18:10:00 +0300 Subject: [PATCH 16/25] add bintray block --- build.gradle.kts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 13c470f..a925007 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.3.41" `maven-publish` + id("com.jfrog.bintray") version "1.8.0" } @@ -15,15 +16,33 @@ val sourcesJar by tasks.registering(Jar::class) { from(sourceSets.main.get().allSource) } +val publicationName = "Lib" + publishing { publications { - register("mavenJava") { + create(publicationName) { from(components["java"]) artifact(sourcesJar.get()) } } } +bintray { + user = if (project.hasProperty("bintrayUser")) project.property("bintrayUser") as String? else System.getenv("BINTRAY_USER") + key = if (project.hasProperty("bintrayApiKey")) project.property("bintrayApiKey") as String? else System.getenv("BINTRAY_API_KEY") + publish = true + setPublications(publicationName) + setConfigurations("archives") + pkg.apply { + repo = "libraries" + name = "dotnet-project-model" + userOrg = user + setLicenses("Apache-2.0") + setLabels("kotlin") + vcsUrl = "https://github.com/JetBrains/dotnet-project-model.git" + } +} + repositories { From 0fd616689fa79a37a2007d73bf27de56570849f2 Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Mon, 12 Aug 2019 14:01:01 +0200 Subject: [PATCH 17/25] Add ability to override version number --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a925007..26d5537 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { group = "org.jetbrains" -version = "1.0" +version = findProperty "projectVersion" ?: "1.0-SNAPSHOT" val sourcesJar by tasks.registering(Jar::class) { archiveClassifier.set("sources") @@ -65,4 +65,4 @@ dependencies { tasks.withType { kotlinOptions.jvmTarget = "1.8" -} \ No newline at end of file +} From 705b33763bdfa0e7c84aff4e01943a1f1271ce7b Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Mon, 12 Aug 2019 14:12:41 +0200 Subject: [PATCH 18/25] Fix version resolution --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 26d5537..e4e67f3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { group = "org.jetbrains" -version = findProperty "projectVersion" ?: "1.0-SNAPSHOT" +version = findProperty("projectVersion") ?: "1.0-SNAPSHOT" val sourcesJar by tasks.registering(Jar::class) { archiveClassifier.set("sources") From 19d248164e96d070b9f5c9c7c6208f048f150231 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 12 Aug 2019 15:29:10 +0300 Subject: [PATCH 19/25] change project name + add bintray version --- build.gradle.kts | 3 +++ settings.gradle.kts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index a925007..bfb30c0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,6 +40,9 @@ bintray { setLicenses("Apache-2.0") setLabels("kotlin") vcsUrl = "https://github.com/JetBrains/dotnet-project-model.git" + version.apply { + name = version.name + } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index b2f18f9..23d1474 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,2 +1,2 @@ -rootProject.name = "dotnet-discovery" +rootProject.name = "dotnet-project-model" From 53dd3206944bb1e8f2290ac22d877264011b39a0 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 12 Aug 2019 15:53:33 +0300 Subject: [PATCH 20/25] fix bintray version --- build.gradle.kts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 883ae0a..22cc754 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,9 +7,11 @@ plugins { } +val myGroup = "org.jetbrains" +val currentVersion = findProperty("projectVersion") as? String ?: "1.0-SNAPSHOT" -group = "org.jetbrains" -version = findProperty("projectVersion") ?: "1.0-SNAPSHOT" +group = myGroup +version = currentVersion val sourcesJar by tasks.registering(Jar::class) { archiveClassifier.set("sources") @@ -41,7 +43,7 @@ bintray { setLabels("kotlin") vcsUrl = "https://github.com/JetBrains/dotnet-project-model.git" version.apply { - name = version.name + name = currentVersion } } } From c779f819244d042b1d244e26e082ae676c96ed41 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 12 Aug 2019 16:02:16 +0300 Subject: [PATCH 21/25] add groupId, artifactId and version to maven publication --- build.gradle.kts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 22cc754..d3cf607 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,6 +8,7 @@ plugins { val myGroup = "org.jetbrains" +val myArtifactID = "dotnet-project-model" val currentVersion = findProperty("projectVersion") as? String ?: "1.0-SNAPSHOT" group = myGroup @@ -25,6 +26,9 @@ publishing { create(publicationName) { from(components["java"]) artifact(sourcesJar.get()) + groupId = myGroup + artifactId = myArtifactID + version = currentVersion } } } @@ -37,7 +41,7 @@ bintray { setConfigurations("archives") pkg.apply { repo = "libraries" - name = "dotnet-project-model" + name = myArtifactID userOrg = user setLicenses("Apache-2.0") setLabels("kotlin") From b4942642ae0e5058bedc305b879d3c1c33bc0a86 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 12 Aug 2019 16:19:58 +0300 Subject: [PATCH 22/25] add pom --- build.gradle.kts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d3cf607..4874d76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,9 +8,10 @@ plugins { val myGroup = "org.jetbrains" -val myArtifactID = "dotnet-project-model" +val myArtifactID = rootProject.name val currentVersion = findProperty("projectVersion") as? String ?: "1.0-SNAPSHOT" - +val description = "Provides project model deserializer for .NET projects" +val repUrl = "https://github.com/JetBrains/dotnet-project-model" group = myGroup version = currentVersion @@ -29,6 +30,22 @@ publishing { groupId = myGroup artifactId = myArtifactID version = currentVersion + + pom.withXml { + asNode().apply { + appendNode("description", description) + appendNode("name", rootProject.name) + appendNode("url", repUrl) + appendNode("licenses").appendNode("license").apply { + appendNode("name", "The Apache Software License, Version 2.0") + appendNode("url", "http://www.apache.org/licenses/LICENSE-2.0.txt") + appendNode("distribution", "repo") + } + appendNode("scm").apply { + appendNode("url", repUrl) + } + } + } } } } From 025386283c356020f267d013c673849598d2e182 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Mon, 12 Aug 2019 16:47:17 +0300 Subject: [PATCH 23/25] update com.jfrog.bintray plugin 1.8.0 -> 1.8.4 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4874d76..dfb9ca0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.3.41" `maven-publish` - id("com.jfrog.bintray") version "1.8.0" + id("com.jfrog.bintray") version "1.8.4" } From 5fc260fe67d35f4a7e845559d8c8f9a62168286d Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Thu, 15 Aug 2019 15:50:08 +0300 Subject: [PATCH 24/25] add explisit supported extensions to MSBuildProjectDeserializer and MSBuildSolutionDeserializer --- .../discovery/MSBuildProjectDeserializer.kt | 22 +++++++++++++++---- .../discovery/MSBuildSolutionDeserializer.kt | 5 +++-- .../test/MSBuildProjectDeserializerTest.kt | 2 +- .../test/MSBuildSolutionDeserializerTest.kt | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt index ca35f0f..f69b560 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildProjectDeserializer.kt @@ -4,6 +4,7 @@ package org.jetbrains.dotnet.discovery import org.jetbrains.dotnet.common.XPathReader import org.jetbrains.dotnet.common.XmlDocumentService import org.jetbrains.dotnet.common.toNormalizedUnixString +import org.jetbrains.dotnet.common.toSystem import org.jetbrains.dotnet.discovery.data.* import org.jetbrains.dotnet.discovery.data.Reference.Companion.DEFAULT_VERSION import org.jetbrains.dotnet.discovery.data.Target @@ -11,14 +12,13 @@ import org.w3c.dom.Document import org.w3c.dom.Element import java.nio.file.Path import java.nio.file.Paths -import java.util.regex.Pattern -import java.util.regex.Pattern.CASE_INSENSITIVE class MSBuildProjectDeserializer( private val _xmlDocumentService: XmlDocumentService, private val sourceDiscoverer: NuGetConfigDiscoverer? = null ) : XPathReader(), SolutionDeserializer { - override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() + override fun accept(path: Path): Boolean = + supportedConfigs.contains(path.toSystem().toFile().extension.toLowerCase()) override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = projectStreamFactory.tryCreate(path)?.use { stream -> @@ -129,7 +129,21 @@ class MSBuildProjectDeserializer( companion object { private val ConditionPattern: Regex = Regex("'\\$\\(Configuration\\)([^']*)' == '([^|]*)([^']*)'", RegexOption.IGNORE_CASE) - private val PathPattern: Pattern = Pattern.compile("^.+\\.(proj|csproj|vbproj)$", CASE_INSENSITIVE) private val versionPattern: Regex = Regex("""^\s*Version\s*=\s*(.*)$""") + val supportedConfigs = listOf( + "csproj", + "vbproj", + "vcxproj", + "dbproj", + "fsproj", + "pyproj", + "rbproj", + "wixproj", + "vdproj", + "isproj", + "pssproj", + "modelproj", + "proj" + ) } } \ No newline at end of file diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt index cff53ac..fc0bc7c 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/MSBuildSolutionDeserializer.kt @@ -11,7 +11,8 @@ class MSBuildSolutionDeserializer( private val _readerFactory: ReaderFactory, private val _msBuildProjectDeserializer: SolutionDeserializer ) : SolutionDeserializer { - override fun accept(path: Path): Boolean = PathPattern.matcher(path.toNormalizedUnixString()).find() + override fun accept(path: Path): Boolean = + supportedConfigs.contains(path.toSystem().toFile().extension.toLowerCase()) override fun deserialize(path: Path, projectStreamFactory: ProjectStreamFactory): Solution = projectStreamFactory.tryCreate(path)?.use { @@ -47,6 +48,6 @@ class MSBuildSolutionDeserializer( "^Project\\(.+\\)\\s*=\\s*\".+\"\\s*,\\s*\"(.+)\"\\s*,\\s*\".+\"\\s*\$", Pattern.CASE_INSENSITIVE ) - private val PathPattern: Pattern = Pattern.compile("^.+\\.sln$", Pattern.CASE_INSENSITIVE) + val supportedConfigs = listOf("sln") } } \ No newline at end of file diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt index 1968179..57aa35d 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildProjectDeserializerTest.kt @@ -237,7 +237,7 @@ class MSBuildProjectDeserializerTest { arrayOf("abc.", false), arrayOf("abc", false), arrayOf("abc.projddd", false), - arrayOf(".proj", false), + arrayOf(".proj", true), arrayOf("proj", false), arrayOf("csproj", false), arrayOf("VBproj", false), diff --git a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt index 93c54ff..2c058db 100644 --- a/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt +++ b/src/test/kotlin/org/jetbrains/dotnet/test/MSBuildSolutionDeserializerTest.kt @@ -114,7 +114,7 @@ class MSBuildSolutionDeserializerTest { arrayOf("abc.", false), arrayOf("abc", false), arrayOf("abc.proj", false), - arrayOf(".sln", false), + arrayOf(".sln", true), arrayOf("sln", false), arrayOf("", false) ) From 037667cbfa2938abd7dd98fe7764214cdf2be084 Mon Sep 17 00:00:00 2001 From: Mikhail Nikolyukin Date: Fri, 30 Aug 2019 14:37:56 +0300 Subject: [PATCH 25/25] improve README, add distinct() for NuGetConfigDiscoverer.discover and remove solution print to log because it makes a lot of noise --- README.md | 42 +++++++++++++++++-- .../dotnet/discovery/NuGetConfigDiscoverer.kt | 2 +- .../dotnet/discovery/SolutionDiscoverImpl.kt | 1 - 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8af7b2b..91ecc59 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,46 @@ # .NET project model parser -Provides project model deserializer for .NET projects: csproj files, project.json, packages.config +Provides project model deserializer for .NET projects: + * csproj files + * project.json + * packages.config + * nuget.config + * project.asset.json ## Example ```kt -val solutionDiscover = SolutionDiscoverImpl(...) -val projectStreamFactory = FileProjectStreamFactory(Path.of("./project")) -val solutions = solution.discover(projectStreamFactory, paths) +// initialize utilitis services +val readerFactory = ReaderFactoryImpl() +val xmlDocumentService = XmlDocumentServiceImpl1() + +// initialize nuget.config deserializer and Discoverer +val nuGetConfigDeserializer = NuGetConfigDeserializer(xmlDocumentService) +val nuGetConfigDiscoverer = NuGetConfigDiscoverer(nuGetConfigDeserializer) + +// initialize project deserializers and Discoverer +val jsonProjectDeserializer = JsonProjectDeserializer(readerFactory, nuGetConfigDiscoverer) +val msBuildProjectDeserializer = MSBuildProjectDeserializer(xmlDocumentService, nuGetConfigDiscoverer) +val msBuildSolutionDeserializer = MSBuildSolutionDeserializer(readerFactory, msBuildProjectDeserializer) +val jsonAssetsProjectDeserializer = JsonAssetsProjectDeserializer(readerFactory, nuGetConfigDiscoverer) + +val deserializers = listOf( + jsonProjectDeserializer, + msBuildProjectDeserializer, + msBuildSolutionDeserializer, + jsonAssetsProjectDeserializer +) + +val discoverer = SolutionDiscoverImpl(deserializers) + +//initialize stream factory +val projectRoot = File("/path/to/project") +val streamFactory = FileProjectStreamFactory(projectRoot) + +// deserialize project +val projectFiles = projectRoot.list()?.asSequence()?.map { Paths.get(it) } ?: emptySequence() +val solutions = discoverer.discover(streamFactory, projectFiles).toList() + +solutions.flatMap { it.projects }.forEach { println(it) } ``` diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt index f5fe21f..84503b1 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/NuGetConfigDiscoverer.kt @@ -16,7 +16,7 @@ class NuGetConfigDiscoverer( result += deserializer.deserialize(possiblePath, projectStreamFactory) currPath = currPath.parent } - return result + return result.distinct() } } diff --git a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt index 0428546..c1d7c56 100644 --- a/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt +++ b/src/main/kotlin/org/jetbrains/dotnet/discovery/SolutionDiscoverImpl.kt @@ -22,7 +22,6 @@ class SolutionDiscoverImpl( LOG.debug("Use discoverer \"$discoverer\" for \"$path\"") try { val solution = discoverer.deserialize(path, projectStreamFactory) - LOG.debug("\"$discoverer\" finds \"$solution\"") yield(solution) break } catch (ex: Exception) {