diff --git a/.azure-pipelines/ci-build.yml b/.azure-pipelines/ci-build.yml index 7627447dbf..caf9a68ffc 100644 --- a/.azure-pipelines/ci-build.yml +++ b/.azure-pipelines/ci-build.yml @@ -10,7 +10,6 @@ trigger: 'authentication/**', 'serialization/**', 'http/**', - 'cli/**', '**.md', '.vscode/**', '**.svg' diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5bb6d627bf..5135582f94 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -33,10 +33,3 @@ updates: open-pull-requests-limit: 10 labels: - Ruby -- package-ecosystem: nuget - directory: "/cli/commons" - schedule: - interval: daily - open-pull-requests-limit: 10 - labels: - - CLI diff --git a/.github/workflows/cli-commons.yml b/.github/workflows/cli-commons.yml deleted file mode 100644 index 34a2c30b12..0000000000 --- a/.github/workflows/cli-commons.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: CLI commons - -on: - workflow_dispatch: - push: - branches: [ main ] - paths: ['cli/commons/**', '.github/workflows/**'] - pull_request: - paths: ['cli/commons/**', '.github/workflows/**'] - -jobs: - build: - runs-on: ubuntu-latest - env: - relativePath: ./cli/commons - solutionName: Microsoft.Kiota.Cli.Commons.sln - steps: - - uses: actions/checkout@v3 - - name: Setup .NET - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7.0.x - - name: Restore dependencies - run: dotnet restore ${{ env.solutionName }} - working-directory: ${{ env.relativePath }} - - name: Build - run: dotnet build ${{ env.solutionName }} --no-restore -c Release - working-directory: ${{ env.relativePath }} - - name: Test - run: dotnet test ${{ env.solutionName }} --no-build --verbosity normal -c Release /p:CollectCoverage=true /p:CoverletOutput=TestResults/ /p:CoverletOutputFormat=opencover - working-directory: ${{ env.relativePath }} - - name: Publish - run: dotnet publish ${{ env.solutionName }} --no-restore --no-build --verbosity normal -c Release - working-directory: ${{ env.relativePath }} - - name: Pack - run: dotnet pack ${{ env.solutionName }} --no-restore --no-build --verbosity normal -c Release - working-directory: ${{ env.relativePath }} - - name: Upload Coverage Results - uses: actions/upload-artifact@v3 - with: - name: codeCoverage - path: | - ${{ env.relativePath }}src/Microsoft.Kiota.Cli.Commons.Tests/TestResults - - name: Upload Nuget Package - uses: actions/upload-artifact@v3 - with: - name: drop - path: | - ${{ env.relativePath }}/src/Microsoft.Kiota.Cli.Commons/bin/Release/*.nupkg - deploy: - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} - environment: - name: staging_feeds - runs-on: ubuntu-latest - needs: [build] - steps: - - name: Setup .NET - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7.0.x - - uses: actions/download-artifact@v3 - with: - name: drop - - run: dotnet nuget push "*.nupkg" --skip-duplicate -s https://nuget.pkg.github.com/microsoft/index.json -k ${{ secrets.PUBLISH_GH_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6d9f9f9a1e..dfa15dbe83 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -15,10 +15,10 @@ on: workflow_dispatch: push: branches: [ main ] - paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] + paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] pull_request: # The branches below must be a subset of the branches above - paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] + paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] schedule: - cron: '20 9 * * 5' diff --git a/.github/workflows/codeql-required-workaround.yml b/.github/workflows/codeql-required-workaround.yml index b5c7b6c4bd..e103e98df1 100644 --- a/.github/workflows/codeql-required-workaround.yml +++ b/.github/workflows/codeql-required-workaround.yml @@ -4,9 +4,9 @@ on: workflow_dispatch: push: branches: [ main ] - paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] # must be the exact opposite of the original workflow + paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] # must be the exact opposite of the original workflow pull_request: - paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] + paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] # https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks diff --git a/.github/workflows/dotnet-required-workaround.yml b/.github/workflows/dotnet-required-workaround.yml index 14ab771c8b..79b590b9ae 100644 --- a/.github/workflows/dotnet-required-workaround.yml +++ b/.github/workflows/dotnet-required-workaround.yml @@ -4,9 +4,9 @@ on: workflow_dispatch: push: branches: [ main ] - paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] # must be the exact opposite of the original workflow + paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] # must be the exact opposite of the original workflow pull_request: - paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] + paths: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] # https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 6877671d8b..30674d9fb2 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -4,10 +4,10 @@ on: push: branches: - main - paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] + paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] pull_request: types: [opened, synchronize, reopened] - paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', 'cli/**', '**.md', '.vscode/**', '**.svg'] + paths-ignore: ['abstractions/**', 'authentication/**', 'serialization/**', 'http/**', '**.md', '.vscode/**', '**.svg'] env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -22,8 +22,7 @@ jobs: - name: Check whether unity activation requests should be done id: checksecret_job run: | - echo "is_SONAR_TOKEN_set: ${{ env.SONAR_TOKEN != '' }}" - echo "::set-output name=is_SONAR_TOKEN_set::${{ env.SONAR_TOKEN != '' }}" + echo "is_SONAR_TOKEN_set=${{ env.SONAR_TOKEN != '' }}" >> $GITHUB_OUTPUT build: needs: [checksecret] if: needs.checksecret.outputs.is_SONAR_TOKEN_set == 'true' diff --git a/.vscode/launch.json b/.vscode/launch.json index f823f40d71..7bdcdce0ab 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -156,6 +156,23 @@ "console": "internalConsole", "stopAtEntry": false }, + { + "name": "Launch CLI (CSharp)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/src/kiota/bin/Debug/net7.0/kiota.dll", + "args": ["generate", + "--openapi", + "https://raw.githubusercontent.com/microsoftgraph/msgraph-sdk-powershell/dev/openApiDocs/v1.0/Users.yml", + "--language", + "shell", + "-o", + "${workspaceFolder}/samples/msgraph-mail/dotnet-cli", "--clean-output"], + "cwd": "${workspaceFolder}/src/kiota", + "console": "internalConsole", + "stopAtEntry": false + }, { "name": "Launch Search", "type": "coreclr", diff --git a/CHANGELOG.md b/CHANGELOG.md index 63df52fc58..7353ed2008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for scalar request bodies in PHP [#1937](https://github.com/microsoft/kiota/pull/1937) - Added accept header for all schematized requests Python. [#1617](https://github.com/microsoft/kiota/issues/1617) - Added optional backing store support for PHP. [#1976](https://github.com/microsoft/kiota/pull/1976) +- Fixed a bug where OdataErrors had wrong inherited class name in Python. +- Fixed a bug where empty path parameters dictionary would throw an error in request builders in Python. ### Changed @@ -26,6 +28,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed a bug where path parameters would be missing if no operation was present at the segment the parameter is defined. [#1940](https://github.com/microsoft/kiota/issues/1940) - Fixed a bug where nested classes with long names caused compilation errors for java generated libraries. [#1949](https://github.com/microsoft/kiota/issues/1949) - Removed use of anonymous classes in java generated libraries to reduce the number of java classes created at compilation time. [#1980](https://github.com/microsoft/kiota/pull/1980) +- Fixed a bug where generation would result in wrong indentation in some classes for Python [#1996]((https://github.com/microsoft/kiota/issues/1996). +- Fixed a bug where error class modules were hardcoded for Python [#1999]((https://github.com/microsoft/kiota/issues/1999) +- Fixed a bug where generation would sometimes result in wrong original names for query parameters in Python [#2000]((https://github.com/microsoft/kiota/issues/2000). ## [0.7.1] - 2022-11-01 diff --git a/README.md b/README.md index e5a35f4d5f..1ce40d46ad 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The following table provides an overview of the languages supported by Kiota and | Python | [✔](https://github.com/microsoft/kiota/projects/3) | [✔](https://github.com/microsoft/kiota-abstractions-python) | [JSON](https://github.com/microsoft/kiota-serialization-json-python), [TEXT](https://github.com/microsoft/kiota-serialization-text-python) | [Anonymous](https://github.com/microsoft/kiota-abstractions-python/blob/main/kiota_abstractions/authentication/anonymous_authentication_provider.py), [Azure](https://github.com/microsoft/kiota-authentication-azure-python) | [✔](https://github.com/microsoft/kiota-http-python) | [link](https://microsoft.github.io/kiota/get-started/python) | | Ruby | [✔](https://github.com/microsoft/kiota/projects/6) | [✔](./abstractions/ruby) | [JSON](./serialization/ruby/json/microsoft_kiota_serialization), [❌ TEXT](https://github.com/microsoft/kiota/issues/1049) | [Anonymous](./abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/authentication/anonymous_authentication_provider.rb), [❌ Azure](https://github.com/microsoft/kiota/issues/421) | [✔](./http/ruby/nethttp/microsoft_kiota_nethttplibrary)| [link](https://microsoft.github.io/kiota/get-started/ruby) | | TypeScript/JavaScript | [✔](https://github.com/microsoft/kiota/projects/2) | [✔](https://github.com/microsoft/kiota-typescript/tree/main/packages/abstractions) | [JSON](https://github.com/microsoft/kiota-typescript/tree/main/packages/serialization/json), [TEXT](https://github.com/microsoft/kiota-typescript/tree/main/packages/serialization/text) | [Anonymous](https://github.com/microsoft/kiota-typescript/blob/main/packages/abstractions/src/authentication/anonymousAuthenticationProvider.ts), [API Key](https://github.com/microsoft/kiota-typescript/blob/main/packages/abstractions/src/authentication/apiKeyAuthenticationProvider.ts), [Azure](https://github.com/microsoft/kiota-typescript/tree/main/packages/authentication/azure) | [✔](https://github.com/microsoft/kiota-typescript/tree/main/packages/http/fetch) | [link](https://microsoft.github.io/kiota/get-started/typescript) | -| Shell | [✔](https://github.com/microsoft/kiota/projects/10) | [✔](./abstractions/dotnet), [✔](./cli/commonc) | [JSON](./serialization/dotnet/json), [TEXT](./serialization/dotnet/text) | [Anonymous](./abstractions/dotnet/src/authentication/AnonymousAuthenticationProvider.cs), [Azure](./authentication/dotnet/azure) | [✔](./http/dotnet/httpclient) | [link](https://microsoft.github.io/kiota/get-started/dotnet) | +| Shell | [✔](https://github.com/microsoft/kiota/projects/10) | [✔](./abstractions/dotnet), [✔](https://github.com/microsoft/kiota-cli-commons) | [JSON](./serialization/dotnet/json), [TEXT](./serialization/dotnet/text) | [Anonymous](./abstractions/dotnet/src/authentication/AnonymousAuthenticationProvider.cs), [Azure](./authentication/dotnet/azure) | [✔](./http/dotnet/httpclient) | [link](https://microsoft.github.io/kiota/get-started/dotnet) | | Swift | [▶](https://github.com/microsoft/kiota/issues/1449) | [✔](./abstractions/swift) | [❌ JSON](https://github.com/microsoft/kiota/issues/1451), [❌ TEXT](https://github.com/microsoft/kiota/issues/1452) | [Anonymous](./abstractions/swift/Source/MicrosoftKiotaAbstractions/Authentication/AnonymousAuthenticationProvider.swift), [❌ Azure](https://github.com/microsoft/kiota/issues/1453) | [❌](https://github.com/microsoft/kiota/issues/1454)| | > Legend: ✔ -> in preview, ❌ -> not started, ▶ -> in progress. diff --git a/cli/commons/Microsoft.Kiota.Cli.Commons.sln b/cli/commons/Microsoft.Kiota.Cli.Commons.sln deleted file mode 100644 index 1608855473..0000000000 --- a/cli/commons/Microsoft.Kiota.Cli.Commons.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30114.105 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8DEB9AF3-BEA6-4E73-BB5E-EBC1DFE6AF22}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Kiota.Cli.Commons", "src\Microsoft.Kiota.Cli.Commons\Microsoft.Kiota.Cli.Commons.csproj", "{23DD14C5-3060-4498-B2F9-85B68770AE0B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Kiota.Cli.Commons.Tests", "src\Microsoft.Kiota.Cli.Commons.Tests\Microsoft.Kiota.Cli.Commons.Tests.csproj", "{D1228DD9-C98F-46C1-911A-65AE2D34DBE5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {23DD14C5-3060-4498-B2F9-85B68770AE0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23DD14C5-3060-4498-B2F9-85B68770AE0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23DD14C5-3060-4498-B2F9-85B68770AE0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23DD14C5-3060-4498-B2F9-85B68770AE0B}.Release|Any CPU.Build.0 = Release|Any CPU - {D1228DD9-C98F-46C1-911A-65AE2D34DBE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1228DD9-C98F-46C1-911A-65AE2D34DBE5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1228DD9-C98F-46C1-911A-65AE2D34DBE5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1228DD9-C98F-46C1-911A-65AE2D34DBE5}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {23DD14C5-3060-4498-B2F9-85B68770AE0B} = {8DEB9AF3-BEA6-4E73-BB5E-EBC1DFE6AF22} - {D1228DD9-C98F-46C1-911A-65AE2D34DBE5} = {8DEB9AF3-BEA6-4E73-BB5E-EBC1DFE6AF22} - EndGlobalSection -EndGlobal diff --git a/cli/commons/README.md b/cli/commons/README.md deleted file mode 100644 index a2ee63c92a..0000000000 --- a/cli/commons/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Kiota CLI Commons Package - -Contains CLI specific types that are referenced in code generated by the shell language. \ No newline at end of file diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/BasePagingServiceTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/BasePagingServiceTest.cs deleted file mode 100644 index 8ceac45020..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/BasePagingServiceTest.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Kiota.Abstractions; -using Microsoft.Kiota.Cli.Commons.IO; -using Moq; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class BasePagingServiceTest -{ - public class GetPagedDataAsyncFunction_Should - { - private readonly Mock responseHandlerMock; - - private readonly Mock pagingServiceMock; - - private readonly Stream stream1; - - private readonly Stream streamMerged; - - public GetPagedDataAsyncFunction_Should() - { - pagingServiceMock = new(MockBehavior.Strict); - responseHandlerMock = new(); - stream1 = new MemoryStream(Encoding.UTF8.GetBytes("hello")); - streamMerged = new MemoryStream(Encoding.UTF8.GetBytes("hellohello")); - responseHandlerMock.Setup(h => h.GetResponseStreamAsync(default)).ReturnsAsync(stream1); - responseHandlerMock.Setup(h => h.GetStatusCode()).Returns(200); - - pagingServiceMock.Setup(ps => ps.CreateResponseHandler()).Returns(responseHandlerMock.Object); - pagingServiceMock.Setup(ps => ps.GetPagedDataAsync(It.IsAny>(), It.IsAny(), It.IsAny(), default)).CallBase(); - pagingServiceMock.Setup(ps => ps.OnBeforeGetPagedData(It.IsAny(), It.IsAny())).CallBase(); - pagingServiceMock.Setup(ps => ps.MergePageAsync(It.IsAny(), It.IsAny(), default)).ReturnsAsync(streamMerged); - pagingServiceMock.Setup(ps => ps.GetNextPageLinkAsync(It.IsAny(), default)).Returns(Task.FromResult(null)); - } - - [Fact] - public async Task Call_OnBeforeGetPagedData() - { - var requestInfo = new RequestInformation(); - var pagingData = new PageLinkData(requestInfo, null); - pagingServiceMock.Setup(ps => ps.OnBeforeGetPagedData(pagingData, false)).Returns(false); - - var pagingService = pagingServiceMock.Object; - - var response = await pagingService.GetPagedDataAsync((info, handler, token) => Task.CompletedTask, pagingData); - - pagingServiceMock.Verify(ps => ps.OnBeforeGetPagedData(pagingData, false), Times.Once); - } - - [Fact] - public async Task Handle_Unpaged_Requests() - { - var requestInfo = new RequestInformation(); - var pagingData = new PageLinkData(requestInfo, null); - var pagingService = pagingServiceMock.Object; - - var response = await pagingService.GetPagedDataAsync((info, handler, token) => Task.CompletedTask, pagingData); - - Assert.Equal(200, response?.StatusCode); - Assert.Equal(streamMerged, response?.Response); - pagingServiceMock.Verify(ps => ps.GetNextPageLinkAsync(It.IsAny(), default), Times.Never); - } - - [Fact] - public async Task Handle_Paged_Requests() - { - var requestInfo = new RequestInformation(); - var pagingData = new PageLinkData(requestInfo, null); - var pagingService = pagingServiceMock.Object; - var count = 0; - pagingServiceMock.Setup(ps => ps.GetNextPageLinkAsync(It.IsAny(), default)).ReturnsAsync(() => - { - if (count > 0) - { - return null; - } - - count++; - return new Uri("https://testlink"); - }); - - var response = await pagingService.GetPagedDataAsync((info, handler, token) => Task.CompletedTask, pagingData, true); - - Assert.Equal(200, response?.StatusCode); - Assert.Equal(streamMerged, response?.Response); - pagingServiceMock.Verify(ps => ps.GetNextPageLinkAsync(It.IsAny(), default), Times.Exactly(2)); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/JmesPathOutputFilterTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/JmesPathOutputFilterTest.cs deleted file mode 100644 index c3e2db17fd..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/JmesPathOutputFilterTest.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.CommandLine; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using DevLab.JmesPath; -using Microsoft.Kiota.Cli.Commons.IO; -using Moq; -using Spectre.Console; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class JmesPathOutputFilterTest -{ - public class FilterOutputAsyncFunction_Should - { - [Fact] - public async Task Call_JmesPath_Transform_Function() - { - var jmesPath = new JmesPath(); - var filter = new JmesPathOutputFilter(jmesPath); - var buffer = Encoding.ASCII.GetBytes("{\"a\": 1, \"b\": true}"); - using var ms = new MemoryStream(buffer); - - using var result = await filter.FilterOutputAsync(ms, "a"); - - using var reader = new StreamReader(result); - var str = await reader.ReadToEndAsync(); - - Assert.Equal("1", str); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/JsonOutputFormatterTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/JsonOutputFormatterTest.cs deleted file mode 100644 index 602da6b4cd..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/JsonOutputFormatterTest.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Kiota.Cli.Commons.IO; -using Spectre.Console.Testing; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class JsonOutputFormatterTest -{ - public class WriteOutputAsyncFunction_Should - { - private readonly TestConsole _console; - - private const string _newLine = "\n"; - - public WriteOutputAsyncFunction_Should() - { - _console = new TestConsole(); - } - - [Fact] - public async Task Write_A_Line_With_Stream_Content() - { - var formatter = new JsonOutputFormatter(_console); - var content = "Test content"; - var stream = new MemoryStream(Encoding.ASCII.GetBytes(content)); - - await formatter.WriteOutputAsync(stream, new JsonOutputFormatterOptions(true)); - - Assert.Equal($"{content}{_newLine}", _console.Output); - } - - [Fact] - public async Task Write_Indented_Output_Given_A_Minified_Json_Stream() - { - var formatter = new JsonOutputFormatter(_console); - var content = "{\"a\": 1, \"b\": \"test\"}"; - var stream = new MemoryStream(Encoding.ASCII.GetBytes(content)); - var n = _newLine; - - await formatter.WriteOutputAsync(stream, new JsonOutputFormatterOptions(true)); - var expected = $"{{{n} \"a\": 1,{n} \"b\": \"test\"{n}}}"; - - Assert.Equal($"{expected}{n}", _console.Output); - } - - [Fact] - public async Task Write_Minified_Output_Given_A_Minified_Json_Stream_If_Indentation_Disabled() - { - var formatter = new JsonOutputFormatter(_console); - var content = "{\"a\": 1, \"b\": \"test\"}"; - var stream = new MemoryStream(Encoding.ASCII.GetBytes(content)); - - await formatter.WriteOutputAsync(stream, new JsonOutputFormatterOptions(false)); - var expected = $"{content}{_newLine}"; - - Assert.Equal(expected, _console.Output); - } - - [Fact] - public async Task Write_Nothing_Given_A_Null_Stream() - { - var formatter = new JsonOutputFormatter(_console); - Stream? stream = null; - - await formatter.WriteOutputAsync(stream, new JsonOutputFormatterOptions(false)); - var expected = ""; - - Assert.Equal(expected, _console.Output); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/NoneOutputFormatterTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/NoneOutputFormatterTest.cs deleted file mode 100644 index eaa8422129..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/NoneOutputFormatterTest.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.CommandLine; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Kiota.Cli.Commons.IO; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class NoneOutputFormatterTest -{ - public class WriteOutputAsyncFunction_Should - { - [Fact] - public async Task Write_No_Content_With_Short_Stream_Content() - { - var formatter = new NoneOutputFormatter(); - var content = "Test content"; - using var stream = new MemoryStream(Encoding.ASCII.GetBytes(content)); - var sb = new StringBuilder(); - using var outWriter = new StringWriter(sb); - using var errorWriter = new StringWriter(sb); - Console.SetOut(outWriter); - Console.SetError(errorWriter); - - await formatter.WriteOutputAsync(stream, new OutputFormatterOptions()); - - Assert.Equal(0, sb.Length); - } - - [Fact] - public async Task Write_Nothing_Given_A_Null_Stream() - { - var formatter = new NoneOutputFormatter(); - Stream? stream = null; - - var sb = new StringBuilder(); - using var outWriter = new StringWriter(sb); - using var errorWriter = new StringWriter(sb); - Console.SetOut(outWriter); - Console.SetError(errorWriter); - - await formatter.WriteOutputAsync(stream, new OutputFormatterOptions()); - - Assert.Equal(0, sb.Length); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/ODataPagingServiceTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/ODataPagingServiceTest.cs deleted file mode 100644 index 492fed11e9..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/ODataPagingServiceTest.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Kiota.Abstractions; -using Microsoft.Kiota.Cli.Commons.IO; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class ODataPagingServiceTest -{ - public class GetNextPageLinkAsyncFunction_Should - { - [Fact] - public async Task Return_Null_on_No_Next_Link() - { - var pagingService = new ODataPagingService(); - var requestInfo = new RequestInformation(); - var pagingData = new PageLinkData(requestInfo, null); - - var nextLink = await pagingService.GetNextPageLinkAsync(pagingData); - - Assert.Null(nextLink); - } - - [Fact] - public async Task Return_Next_Link_From_Response() - { - var pagingService = new ODataPagingService(); - var bytes = Encoding.UTF8.GetBytes("{\"nextLink\": \"https://testlink\"}"); - using var ms = new MemoryStream(bytes); - var requestInfo = new RequestInformation(); - requestInfo.Headers.Add("Accept", "application/json"); - var pagingData = new PageLinkData(requestInfo, ms); - pagingData.ResponseContentHeaders.Add("Content-Type", new string[] { "application/json" }); - - var nextLink = await pagingService.GetNextPageLinkAsync(pagingData); - - Assert.Equal(new Uri("https://testlink"), nextLink); - } - - [Fact] - public async Task Return_Null_On_Next_Link_Missing() - { - var pagingService = new ODataPagingService(); - var bytes = Encoding.UTF8.GetBytes("{}"); - using var ms = new MemoryStream(bytes); - var requestInfo = new RequestInformation(); - var pagingData = new PageLinkData(requestInfo, ms); - - var nextLink = await pagingService.GetNextPageLinkAsync(pagingData); - - Assert.Null(nextLink); - } - } - - public class MergeJsonStreamsFunction_Should - { - [Fact] - public async Task Return_Null_on_Null_Streams() - { - var pagingService = new ODataPagingService(); - - var response = await pagingService.MergeJsonStreamsAsync(null, null); - - Assert.Null(response); - } - - [Fact] - public async Task Return_Left_on_Null_Right_Stream() - { - var pagingService = new ODataPagingService(); - - using var ms = new MemoryStream(Encoding.UTF8.GetBytes("{\"value\": [20]}")); - var response = await pagingService.MergeJsonStreamsAsync(ms, null); - - Assert.Equal(ms, response); - } - - [Fact] - public async Task Return_Right_on_Null_Left_Stream() - { - var pagingService = new ODataPagingService(); - - using var ms = new MemoryStream(Encoding.UTF8.GetBytes("{\"value\": [20]}")); - var response = await pagingService.MergeJsonStreamsAsync(null, ms); - - Assert.Equal(ms, response); - } - - [Fact] - public async Task Return_Left_On_Null_Data_In_Right_Stream() - { - var pagingService = new ODataPagingService(); - - using var leftMs = new MemoryStream(Encoding.UTF8.GetBytes("{\"value\": [20]}")); - using var rightMs = new MemoryStream(Encoding.UTF8.GetBytes("{\"value\": null}")); - var response = await pagingService.MergeJsonStreamsAsync(leftMs, rightMs); - using var reader = new StreamReader(response ?? Stream.Null); - var result = await reader.ReadToEndAsync(); - - Assert.Equal("{\"value\": [20]}", result); - } - - [Fact] - public async Task Return_Right_On_Null_Data_In_Left_Stream() - { - var pagingService = new ODataPagingService(); - - using var leftMs = new MemoryStream(Encoding.UTF8.GetBytes("{\"value\": null}")); - using var rightMs = new MemoryStream(Encoding.UTF8.GetBytes("{\"value\": [20]}")); - var response = await pagingService.MergeJsonStreamsAsync(leftMs, rightMs); - using var reader = new StreamReader(response ?? Stream.Null); - var result = await reader.ReadToEndAsync(); - - Assert.Equal("{\"value\": [20]}", result); - } - - [Theory] - [InlineData(null, "[20,21,24]", "[30]", "[20,21,24,30]")] - [InlineData("", "[20,21,24]", "[30]", "[20,21,24,30]")] - [InlineData("value", "{\"value\": [20]}", "{\"value\": [30]}", "{\"value\":[20,30]}")] - [InlineData("value", "{\"value\": [{\"a\": 1}, {\"a\": 2}]}", "{\"value\": [{\"b\": 4}]}", "{\"value\":[{\"a\":1},{\"a\":2},{\"b\":4}]}")] - public async Task Return_Merged_Stream(string itemName, string left, string right, string expected) - { - var pagingService = new ODataPagingService(); - - using var leftMs = new MemoryStream(Encoding.UTF8.GetBytes(left)); - using var rightMs = new MemoryStream(Encoding.UTF8.GetBytes(right)); - var response = await pagingService.MergeJsonStreamsAsync(leftMs, rightMs, itemName); - using var reader = new StreamReader(response ?? Stream.Null); - var result = await reader.ReadToEndAsync(); - - Assert.Equal(expected, result); - } - - [Theory] - [InlineData("{\"value\":[20],\"nextLink\":\"test1\"}", "{\"value\":[30],\"nextLink\":\"test2\"}", "{\"value\":[20,30],\"nextLink\":\"test2\"}")] - [InlineData("{\"value\":[{\"a\": 1}],\"nextLink\":\"test2\"}", "{\"value\":[{\"b\":4}],\"nextLink\":\"test2\"}", "{\"value\":[{\"a\":1},{\"b\":4}],\"nextLink\":\"test2\"}")] - public async Task Return_With_Next_Link_From_Right_Stream(string left, string right, string expected) - { - var pagingService = new ODataPagingService(); - - using var leftMs = new MemoryStream(Encoding.UTF8.GetBytes(left)); - using var rightMs = new MemoryStream(Encoding.UTF8.GetBytes(right)); - var response = await pagingService.MergeJsonStreamsAsync(leftMs, rightMs); - using var reader = new StreamReader(response ?? Stream.Null); - var result = await reader.ReadToEndAsync(); - - Assert.Equal(expected, result); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/OutputFormatterFactoryTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/OutputFormatterFactoryTest.cs deleted file mode 100644 index a128042dc3..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/OutputFormatterFactoryTest.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Microsoft.Kiota.Cli.Commons.IO; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class OutputFormatterFactoryTest -{ - public class GetFormatterFunction_Should - { - [Theory] - [InlineData(FormatterType.NONE)] - public void ThrowException_On_Invalid_FormatterType(FormatterType formatterType) - { - var factory = new OutputFormatterFactory(); - - Assert.Throws(() => factory.GetFormatter(formatterType)); - } - - [Theory] - [InlineData(FormatterType.JSON, typeof(JsonOutputFormatter))] - [InlineData(FormatterType.TABLE, typeof(TableOutputFormatter))] - [InlineData(FormatterType.TEXT, typeof(TextOutputFormatter))] - public void Return_OutputFormatter_On_FormatterType(FormatterType formatterType, Type expectedType) - { - var factory = new OutputFormatterFactory(); - - var formatter = factory.GetFormatter(formatterType); - - Assert.NotNull(formatter); - Assert.IsType(expectedType, formatter); - } - - [Theory] - [InlineData("json", typeof(JsonOutputFormatter))] - [InlineData("JSON", typeof(JsonOutputFormatter))] - [InlineData("table", typeof(TableOutputFormatter))] - [InlineData("TABLE", typeof(TableOutputFormatter))] - [InlineData("text", typeof(TextOutputFormatter))] - [InlineData("TEXT", typeof(TextOutputFormatter))] - public void Return_OutputFormatter_On_FormatterType_String(string formatterType, Type expectedType) - { - var factory = new OutputFormatterFactory(); - - var formatter = factory.GetFormatter(formatterType); - - Assert.NotNull(formatter); - Assert.Equal(expectedType, formatter.GetType()); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/TableOutputFormatterTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/TableOutputFormatterTest.cs deleted file mode 100644 index dffdb64995..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/TableOutputFormatterTest.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; -using Microsoft.Kiota.Cli.Commons.IO; -using Spectre.Console; -using Spectre.Console.Testing; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class TableOutputFormatterTest -{ - public class ConstructTableFunction_Should - { - [Fact] - public void Create_A_Table_With_Single_Column_And_Row_When_Object_With_Value() - { - var console = new TestConsole(); - var formatter = new TableOutputFormatter(); - var content = "{\"x\": \"\", \"value\": 10}"; - var doc = JsonDocument.Parse(content); - - var table = formatter.ConstructTable(doc); - - Assert.Single(table.Columns); - Assert.Single(table.Rows); - var headerText = table.Columns[0].Header.GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("Value", headerText); - var rowCellText = table.Rows.First()[0].GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("10", rowCellText); - } - - [Fact] - public void Create_A_Table_Given_A_JSON_Array() - { - var console = new TestConsole(); - var formatter = new TableOutputFormatter(); - var content = "[{\"a\": \"value a\", \"b\": null, \"c\": \"value c\"}, {\"a\": \"value a\", \"b\": \"value b\", \"c\": null}]"; - var doc = JsonDocument.Parse(content); - - var table = formatter.ConstructTable(doc); - - Assert.Equal(3, table.Columns.Count); - Assert.Equal(2, table.Rows.Count); - var headerText = table.Columns[0].Header.GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("a", headerText); - var row0col1Text = table.Rows.First()[1].GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("-", row0col1Text); - } - - [Fact] - public void Create_A_Table_Given_A_JSON_Object_With_Value_Array() - { - var console = new TestConsole(); - var formatter = new TableOutputFormatter(); - var content = "{\"value\": [{\"a\": \"value a\", \"b\": null, \"c\": \"value c\"}, {\"a\": \"value a\", \"b\": \"value b\", \"c\": null}]}"; - var doc = JsonDocument.Parse(content); - - var table = formatter.ConstructTable(doc); - - Assert.Equal(3, table.Columns.Count); - Assert.Equal(2, table.Rows.Count); - var headerText = table.Columns[0].Header.GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("a", headerText); - var row0col1Text = table.Rows.First()[1].GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("-", row0col1Text); - } - - [Fact] - public void Create_A_Table_Given_An_Array_Of_Non_Object_Values() - { - var console = new TestConsole(); - var formatter = new TableOutputFormatter(); - var content = "[1, 2, 3, 4, 5, [10, 11]]"; - var doc = JsonDocument.Parse(content); - - var table = formatter.ConstructTable(doc); - - Assert.Single(table.Columns); - Assert.Equal(6, table.Rows.Count); - var headerText = table.Columns[0].Header.GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("Value", headerText); - var row0col0Text = table.Rows.First().First().GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("1", row0col0Text); - var row5col0Text = table.Rows.Skip(5).First().First().GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("-", row5col0Text); - } - - [Fact] - public void Create_A_Table_Given_A_Scalar_Values() - { - var console = new TestConsole(); - var formatter = new TableOutputFormatter(); - var content = "1"; - var doc = JsonDocument.Parse(content); - - var table = formatter.ConstructTable(doc); - - Assert.Single(table.Columns); - Assert.Single(table.Rows); - var headerText = table.Columns[0].Header.GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("Value", headerText); - var row0col0Text = table.Rows.First().First().GetSegments(console).Select(s => s.Text).FirstOrDefault(); - Assert.Equal("1", row0col0Text); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/TextOutputFormatterTest.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/TextOutputFormatterTest.cs deleted file mode 100644 index 81d65de56a..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/IO/TextOutputFormatterTest.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Kiota.Cli.Commons.IO; -using Spectre.Console.Testing; -using Xunit; - -namespace Microsoft.Kiota.Cli.Commons.Tests.IO; - -public class TextOutputFormatterTest -{ - public class WriteOutputAsyncFunction_Should - { - private readonly TestConsole _console; - - private const string NewLine = "\n"; - - public WriteOutputAsyncFunction_Should() - { - _console = new TestConsole(); - } - - [Fact] - public async Task Write_A_Line_With_Short_Stream_Content() - { - var formatter = new TextOutputFormatter(_console); - var content = "Test content"; - using var stream = new MemoryStream(Encoding.ASCII.GetBytes(content)); - - await formatter.WriteOutputAsync(stream, new OutputFormatterOptions()); - - Assert.Equal($"{content}{NewLine}", _console.Output); - } - - [Fact] - public async Task Write_A_Line_With_Long_Stream_Content() - { - var formatter = new TextOutputFormatter(_console); - using var fs = File.OpenRead("data/long_text_file.txt"); - - await formatter.WriteOutputAsync(fs, new OutputFormatterOptions()); - - Assert.StartsWith($"Lorem ipsum", _console.Output); - Assert.EndsWith($"sed nisi lacus sed.{NewLine}", _console.Output); - } - - [Fact] - public async Task Write_A_Line_With_Empty_Stream_Content() - { - var formatter = new TextOutputFormatter(_console); - using var stream = Stream.Null; - - await formatter.WriteOutputAsync(stream, new OutputFormatterOptions()); - - Assert.EndsWith($"{NewLine}", _console.Output); - } - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/Microsoft.Kiota.Cli.Commons.Tests.csproj b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/Microsoft.Kiota.Cli.Commons.Tests.csproj deleted file mode 100644 index c30e109049..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/Microsoft.Kiota.Cli.Commons.Tests.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - net7.0 - enable - - false - - - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/data/long_text_file.txt b/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/data/long_text_file.txt deleted file mode 100644 index 85ea4e8956..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons.Tests/data/long_text_file.txt +++ /dev/null @@ -1,39 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lacus viverra vitae congue eu consequat ac felis. Lorem ipsum dolor sit amet. Habitasse platea dictumst vestibulum rhoncus. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Hendrerit gravida rutrum quisque non. Volutpat est velit egestas dui id ornare arcu. Pharetra diam sit amet nisl suscipit adipiscing bibendum est. Odio tempor orci dapibus ultrices in iaculis nunc. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien et. Ultrices sagittis orci a scelerisque purus semper. Dignissim diam quis enim lobortis. Cras sed felis eget velit aliquet sagittis id consectetur. - -Malesuada fames ac turpis egestas maecenas pharetra convallis posuere morbi. Neque viverra justo nec ultrices dui sapien eget mi. Curabitur gravida arcu ac tortor. Tortor pretium viverra suspendisse potenti nullam. Ultrices tincidunt arcu non sodales neque sodales ut etiam. Varius vel pharetra vel turpis nunc eget lorem dolor. Mattis molestie a iaculis at erat pellentesque. Mauris pellentesque pulvinar pellentesque habitant morbi tristique. A scelerisque purus semper eget duis at. Amet consectetur adipiscing elit ut aliquam purus sit. Accumsan lacus vel facilisis volutpat est velit egestas dui id. - -Duis ultricies lacus sed turpis tincidunt id aliquet risus feugiat. Lectus urna duis convallis convallis tellus id interdum. Feugiat nisl pretium fusce id velit ut tortor pretium viverra. Tincidunt lobortis feugiat vivamus at augue eget arcu. Nibh ipsum consequat nisl vel pretium lectus. Semper feugiat nibh sed pulvinar proin gravida hendrerit lectus a. Tortor posuere ac ut consequat semper viverra. Sit amet tellus cras adipiscing enim. Est placerat in egestas erat imperdiet sed euismod nisi porta. Dui ut ornare lectus sit amet est placerat. Interdum velit laoreet id donec ultrices tincidunt arcu non sodales. Diam volutpat commodo sed egestas egestas fringilla phasellus faucibus. Luctus accumsan tortor posuere ac. Fermentum iaculis eu non diam. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. - -Commodo ullamcorper a lacus vestibulum. Sodales ut eu sem integer vitae justo eget magna fermentum. Amet consectetur adipiscing elit pellentesque habitant morbi. Interdum velit euismod in pellentesque massa placerat duis. Feugiat in fermentum posuere urna nec tincidunt praesent semper. Penatibus et magnis dis parturient montes. Sagittis aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vulputate eu scelerisque felis imperdiet proin. Eu facilisis sed odio morbi quis commodo odio aenean sed. Etiam erat velit scelerisque in dictum non consectetur. Scelerisque purus semper eget duis at tellus at. - -Amet nulla facilisi morbi tempus iaculis urna id. Sit amet consectetur adipiscing elit ut. Enim praesent elementum facilisis leo vel. Faucibus purus in massa tempor nec. Velit egestas dui id ornare. Ut eu sem integer vitae justo eget magna fermentum. Tellus molestie nunc non blandit massa enim nec dui nunc. In vitae turpis massa sed. Et malesuada fames ac turpis egestas. A iaculis at erat pellentesque adipiscing commodo elit at. Ornare quam viverra orci sagittis eu volutpat. Ultricies mi quis hendrerit dolor magna eget est lorem. Egestas egestas fringilla phasellus faucibus scelerisque eleifend. - -Tempor commodo ullamcorper a lacus vestibulum sed. Mi quis hendrerit dolor magna eget est lorem ipsum dolor. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras. Diam sollicitudin tempor id eu. Orci dapibus ultrices in iaculis nunc sed augue. In nibh mauris cursus mattis molestie a. Tristique magna sit amet purus gravida quis. Placerat orci nulla pellentesque dignissim. Semper feugiat nibh sed pulvinar proin gravida. At volutpat diam ut venenatis tellus. Suspendisse in est ante in nibh mauris. Id ornare arcu odio ut sem nulla pharetra diam. Ipsum a arcu cursus vitae congue mauris rhoncus aenean vel. Quisque id diam vel quam elementum pulvinar etiam non. Pretium aenean pharetra magna ac. Magna fermentum iaculis eu non diam phasellus vestibulum. Nec feugiat in fermentum posuere urna nec tincidunt praesent. Egestas egestas fringilla phasellus faucibus scelerisque. - -Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Eu facilisis sed odio morbi quis commodo odio aenean sed. Faucibus pulvinar elementum integer enim neque. Sagittis orci a scelerisque purus semper eget duis. Lobortis feugiat vivamus at augue eget arcu. Viverra justo nec ultrices dui sapien eget mi proin. Placerat orci nulla pellentesque dignissim enim sit amet venenatis urna. Ac odio tempor orci dapibus ultrices in iaculis nunc sed. Vel turpis nunc eget lorem. Ultrices eros in cursus turpis massa tincidunt dui ut. At auctor urna nunc id cursus metus aliquam eleifend mi. Vulputate ut pharetra sit amet. Ac felis donec et odio. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Nec tincidunt praesent semper feugiat. Ultrices sagittis orci a scelerisque purus semper eget duis at. Neque egestas congue quisque egestas diam. - -Pulvinar neque laoreet suspendisse interdum consectetur libero. Magnis dis parturient montes nascetur. Pulvinar mattis nunc sed blandit libero volutpat sed cras. Malesuada fames ac turpis egestas sed tempus. Cras pulvinar mattis nunc sed blandit libero volutpat sed. Amet dictum sit amet justo donec. Dictum varius duis at consectetur lorem donec massa sapien. Maecenas ultricies mi eget mauris pharetra et ultrices neque. Nulla aliquet enim tortor at auctor urna nunc id. Tincidunt nunc pulvinar sapien et ligula. At imperdiet dui accumsan sit amet nulla. Eu mi bibendum neque egestas. Ac turpis egestas integer eget aliquet nibh praesent tristique. Curabitur vitae nunc sed velit dignissim sodales ut eu sem. - -Egestas sed sed risus pretium quam vulputate dignissim. In dictum non consectetur a erat nam at. Turpis egestas maecenas pharetra convallis posuere morbi leo. Eu augue ut lectus arcu bibendum at varius. Faucibus nisl tincidunt eget nullam non nisi est sit amet. Nisi vitae suscipit tellus mauris. Quam id leo in vitae turpis. Orci sagittis eu volutpat odio facilisis. Tempor nec feugiat nisl pretium fusce id. Enim nec dui nunc mattis enim. Ornare suspendisse sed nisi lacus sed viverra. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et netus. Nulla facilisi morbi tempus iaculis. Diam in arcu cursus euismod quis. At elementum eu facilisis sed odio morbi quis. Molestie ac feugiat sed lectus vestibulum. Accumsan lacus vel facilisis volutpat est. Curabitur vitae nunc sed velit dignissim sodales ut eu. Ut diam quam nulla porttitor massa. Urna condimentum mattis pellentesque id nibh tortor. - -A pellentesque sit amet porttitor eget. In cursus turpis massa tincidunt dui ut. Aliquet enim tortor at auctor urna nunc id. Dictum fusce ut placerat orci nulla pellentesque dignissim enim sit. Ullamcorper a lacus vestibulum sed arcu non. Consequat semper viverra nam libero justo. Sem nulla pharetra diam sit amet nisl. Enim ut tellus elementum sagittis vitae et. Non arcu risus quis varius quam quisque. Sed faucibus turpis in eu mi. At urna condimentum mattis pellentesque id nibh. Magna fringilla urna porttitor rhoncus dolor. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Lobortis scelerisque fermentum dui faucibus in. Pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Egestas egestas fringilla phasellus faucibus scelerisque eleifend. Morbi tempus iaculis urna id volutpat lacus. - -Sed id semper risus in hendrerit gravida rutrum. Odio facilisis mauris sit amet massa vitae tortor condimentum. Ipsum dolor sit amet consectetur adipiscing elit duis. Ut ornare lectus sit amet est placerat in egestas erat. Ultrices neque ornare aenean euismod. Imperdiet sed euismod nisi porta lorem. Feugiat in ante metus dictum at tempor commodo ullamcorper. Adipiscing diam donec adipiscing tristique risus nec feugiat. At in tellus integer feugiat scelerisque. Posuere lorem ipsum dolor sit amet. Iaculis at erat pellentesque adipiscing commodo elit. Proin libero nunc consequat interdum. Neque viverra justo nec ultrices dui sapien eget mi. Scelerisque felis imperdiet proin fermentum leo vel orci. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae. Scelerisque varius morbi enim nunc faucibus a pellentesque sit. Cras fermentum odio eu feugiat pretium nibh. - -Tellus molestie nunc non blandit massa enim nec dui nunc. Risus at ultrices mi tempus imperdiet nulla. Ut tortor pretium viverra suspendisse potenti nullam. Aliquam nulla facilisi cras fermentum. Vestibulum morbi blandit cursus risus at ultrices mi tempus. Leo urna molestie at elementum eu facilisis sed odio. Donec massa sapien faucibus et. Sem viverra aliquet eget sit. Est velit egestas dui id. Pharetra massa massa ultricies mi quis hendrerit. Magna sit amet purus gravida quis blandit. Nec feugiat in fermentum posuere urna nec. Non arcu risus quis varius quam quisque id. Dolor magna eget est lorem ipsum. Aliquam sem fringilla ut morbi tincidunt augue interdum. - -Facilisis magna etiam tempor orci. Interdum posuere lorem ipsum dolor sit amet. Elementum eu facilisis sed odio morbi quis commodo odio. Enim sit amet venenatis urna cursus. Amet facilisis magna etiam tempor orci. Consequat ac felis donec et odio pellentesque diam. Sit amet justo donec enim. A erat nam at lectus urna duis convallis convallis tellus. Diam quis enim lobortis scelerisque fermentum dui. Habitasse platea dictumst quisque sagittis purus sit amet volutpat. Aliquam ut porttitor leo a diam. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate sapien. Viverra suspendisse potenti nullam ac tortor vitae purus. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Nisi vitae suscipit tellus mauris a diam. Interdum consectetur libero id faucibus nisl. - -Eget gravida cum sociis natoque. Etiam erat velit scelerisque in dictum non consectetur a. Sit amet risus nullam eget. Cursus sit amet dictum sit amet. Tincidunt praesent semper feugiat nibh sed pulvinar proin gravida hendrerit. Vel pretium lectus quam id leo in. Eget gravida cum sociis natoque penatibus et magnis dis. Convallis aenean et tortor at risus viverra adipiscing at. Consectetur a erat nam at lectus urna duis convallis. Nibh tellus molestie nunc non blandit massa enim nec dui. Pharetra magna ac placerat vestibulum lectus. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl. Nunc eget lorem dolor sed viverra ipsum nunc. In est ante in nibh mauris cursus mattis molestie a. Arcu non sodales neque sodales ut etiam. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula. Dui accumsan sit amet nulla facilisi. Risus sed vulputate odio ut. Habitant morbi tristique senectus et netus et malesuada fames. - -Est ullamcorper eget nulla facilisi etiam. Nunc pulvinar sapien et ligula. Sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula ipsum. Sit amet facilisis magna etiam tempor orci eu. Viverra nam libero justo laoreet sit amet. Urna molestie at elementum eu. Urna duis convallis convallis tellus id interdum velit laoreet. Tellus rutrum tellus pellentesque eu tincidunt tortor aliquam. Pellentesque adipiscing commodo elit at imperdiet dui accumsan sit. Elit sed vulputate mi sit amet mauris commodo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet. Purus viverra accumsan in nisl. Dolor morbi non arcu risus quis varius quam quisque. Volutpat diam ut venenatis tellus in metus vulputate eu scelerisque. Senectus et netus et malesuada fames ac. Pulvinar proin gravida hendrerit lectus. Amet massa vitae tortor condimentum lacinia quis vel eros. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Nibh sed pulvinar proin gravida hendrerit lectus. - -Hendrerit dolor magna eget est lorem ipsum dolor sit. Neque egestas congue quisque egestas diam in arcu cursus euismod. Dictum fusce ut placerat orci. Enim praesent elementum facilisis leo. Ante metus dictum at tempor commodo ullamcorper a lacus vestibulum. Lorem dolor sed viverra ipsum nunc. Volutpat consequat mauris nunc congue nisi. Sapien et ligula ullamcorper malesuada proin. Vehicula ipsum a arcu cursus vitae. Amet luctus venenatis lectus magna fringilla urna porttitor rhoncus. Egestas dui id ornare arcu odio ut sem nulla. Tincidunt arcu non sodales neque sodales ut etiam. Donec pretium vulputate sapien nec sagittis aliquam malesuada. Vel eros donec ac odio tempor orci dapibus ultrices. Massa tincidunt dui ut ornare. - -Lectus arcu bibendum at varius vel pharetra vel. Et malesuada fames ac turpis egestas sed tempus urna et. Sit amet commodo nulla facilisi nullam vehicula ipsum a. Sed odio morbi quis commodo odio. Eu consequat ac felis donec et odio. Posuere urna nec tincidunt praesent semper feugiat nibh. Amet est placerat in egestas erat imperdiet sed euismod. Bibendum at varius vel pharetra vel. Mauris vitae ultricies leo integer malesuada nunc. Viverra adipiscing at in tellus integer feugiat. - -Nunc sed id semper risus in. Quis viverra nibh cras pulvinar mattis nunc sed blandit libero. Placerat in egestas erat imperdiet sed euismod nisi porta lorem. Felis eget nunc lobortis mattis aliquam faucibus. Arcu dui vivamus arcu felis bibendum ut tristique et egestas. Proin nibh nisl condimentum id venenatis a condimentum. Laoreet non curabitur gravida arcu ac tortor. Elementum pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Sit amet facilisis magna etiam. Justo eget magna fermentum iaculis eu non diam phasellus vestibulum. Pretium lectus quam id leo. Elementum eu facilisis sed odio morbi. Sit amet aliquam id diam maecenas ultricies mi. Velit egestas dui id ornare arcu odio. - -Ac feugiat sed lectus vestibulum. Blandit cursus risus at ultrices. Consequat interdum varius sit amet. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Blandit massa enim nec dui. Bibendum arcu vitae elementum curabitur vitae nunc sed velit. Purus gravida quis blandit turpis cursus in hac habitasse platea. At lectus urna duis convallis convallis tellus id interdum velit. Augue eget arcu dictum varius. Lacus luctus accumsan tortor posuere ac ut consequat. - -Leo vel orci porta non pulvinar neque laoreet suspendisse. Quis varius quam quisque id. Sagittis purus sit amet volutpat. Senectus et netus et malesuada. Nunc faucibus a pellentesque sit amet porttitor eget. Scelerisque varius morbi enim nunc faucibus a. Sodales neque sodales ut etiam sit amet. Donec et odio pellentesque diam volutpat commodo sed egestas. Pharetra diam sit amet nisl suscipit adipiscing bibendum est ultricies. Auctor neque vitae tempus quam pellentesque nec nam. Euismod elementum nisi quis eleifend quam adipiscing vitae proin sagittis. Nulla aliquet porttitor lacus luctus accumsan. Elementum curabitur vitae nunc sed velit. Sit amet nulla facilisi morbi tempus iaculis urna id volutpat. Odio tempor orci dapibus ultrices in iaculis. Ut aliquam purus sit amet luctus venenatis lectus magna. Ornare suspendisse sed nisi lacus sed. \ No newline at end of file diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/BasePagingService.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/BasePagingService.cs deleted file mode 100644 index 84a427322d..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/BasePagingService.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Runtime.CompilerServices; -using Microsoft.Kiota.Abstractions; - -[assembly: InternalsVisibleTo("Microsoft.Kiota.Cli.Commons.Tests")] -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Paging service that supports the x-ms-pageable extension -/// -public abstract class BasePagingService : IPagingService -{ - /// - public abstract IPagingResponseHandler CreateResponseHandler(); - - /// - public abstract Task GetNextPageLinkAsync(PageLinkData pageLinkData, CancellationToken cancellationToken = default); - - /// - public virtual async Task GetPagedDataAsync(Func requestExecutorAsync, PageLinkData pageLinkData, bool fetchAllPages = false, CancellationToken cancellationToken = default) - { - if (!OnBeforeGetPagedData(pageLinkData, fetchAllPages)) - { - return null; - } - - var requestInfo = pageLinkData.RequestInformation; - Uri? nextLink; - Stream? response = null; - int? statusCode; - do - { - var responseHandler = CreateResponseHandler(); - await requestExecutorAsync(requestInfo, responseHandler, cancellationToken); - var pageData = await responseHandler.GetResponseStreamAsync(cancellationToken); - statusCode = responseHandler.GetStatusCode(); - var headers = responseHandler.GetResponseHeaders(); - var contentHeaders = responseHandler.GetResponseContentHeaders(); - pageLinkData = new PageLinkData(requestInfo, pageData, headers, contentHeaders, pageLinkData.ItemName, pageLinkData.NextLinkName); - if (fetchAllPages) - { - nextLink = await GetNextPageLinkAsync(pageLinkData, cancellationToken); - if (nextLink != null) pageLinkData.RequestInformation.URI = nextLink; - } - else - { - nextLink = null; - } - - response = await MergePageAsync(response, pageLinkData, cancellationToken); - } while (nextLink != null); - - return new PageResponse(statusCode ?? 0, response); - } - - /// - public abstract Task MergePageAsync(Stream? currentResult, PageLinkData newPageData, CancellationToken cancellationToken = default); - - /// - public virtual bool OnBeforeGetPagedData(PageLinkData pageLinkData, bool fetchAllPages = false) - { - return true; - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterOptionsModel.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterOptionsModel.cs deleted file mode 100644 index aecbd33daa..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterOptionsModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Options model for output formatters. -/// -public readonly struct FormatterOptionsModel { - /// - /// Create a new instance of the model - /// - /// Indicates whether to indent JSON output - public FormatterOptionsModel(bool jsonOutputIndented = true) - { - this.JsonOutputIndented = jsonOutputIndented; - } - - /// - /// Property that indicates whether to indent JSON output - /// - public bool JsonOutputIndented { get; init; } - - /// - public override string ToString() => $"({nameof(JsonOutputIndented)} => {JsonOutputIndented})"; -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterType.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterType.cs deleted file mode 100644 index 7103fedb4b..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterType.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The formatter type -/// -public enum FormatterType -{ - /// - /// JSON format - /// - JSON, - /// - /// Table format - /// - TABLE, - /// - /// Text formatting - /// - TEXT, - /// - /// No formatting - /// - NONE -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterTypeExtensions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterTypeExtensions.cs deleted file mode 100644 index e8f6a2f351..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/FormatterTypeExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Extension methods for the formatter type -/// -public static class FormatterTypeExtensions -{ - /// - /// Returns output options for a given formatter type - /// - /// The formatter type to get options for - /// Options to apply - public static IOutputFormatterOptions? GetOutputFormatterOptions(this FormatterType formatterType, FormatterOptionsModel? options = null) - { - IOutputFormatterOptions? formatterOptions = null; - if (formatterType == FormatterType.JSON) - { - var outputIndented = options?.JsonOutputIndented ?? true; - formatterOptions = new JsonOutputFormatterOptions(outputIndented); - } - else if (formatterType == FormatterType.TABLE) - { - formatterOptions = new TableOutputFormatterOptions(); - } - - return formatterOptions; - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IJsonOutputFormatterOptions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IJsonOutputFormatterOptions.cs deleted file mode 100644 index 14c962d224..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IJsonOutputFormatterOptions.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The JSON output formatter options -/// -public interface IJsonOutputFormatterOptions : IOutputFormatterOptions -{ - /// - /// Gets or initializes a value that defines whether JSON should use pretty printing. By - /// default, JSON is serialized without any extra white space. - /// - public bool OutputIndented { get; init; } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFilter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFilter.cs deleted file mode 100644 index 96888be05f..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFilter.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Output filter contract. Implement this to provide output filtering capabilities to the CLI. -/// -public interface IOutputFilter -{ - /// - /// Run a filter on stream content based on a query. The query format is determined by the implementation - /// - /// Stream content to filter - /// Query to run against the content - /// The cancellation token - /// A filtered stream - Task FilterOutputAsync(Stream content, string query, CancellationToken cancellationToken = default); -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatter.cs deleted file mode 100644 index 22e78227df..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatter.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Output formatter contract. -/// -public interface IOutputFormatter -{ - /// - /// Format and write stream content - /// - /// The stream content to format and write out - /// The options to use when formatting output - /// The cancellation token - Task WriteOutputAsync(Stream? content, IOutputFormatterOptions? options = null, CancellationToken cancellationToken = default); -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatterFactory.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatterFactory.cs deleted file mode 100644 index 00b8160f81..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatterFactory.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Factory that provides an output formatter based on a -/// -public interface IOutputFormatterFactory -{ - /// - /// Returns a formatter that writes content in the provided - /// - /// The desired formatter type - /// - IOutputFormatter GetFormatter(FormatterType formatterType); -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatterOptions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatterOptions.cs deleted file mode 100644 index 771950c25b..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IOutputFormatterOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The output formatter options interface -/// -public interface IOutputFormatterOptions -{ -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IPagingResponseHandler.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IPagingResponseHandler.cs deleted file mode 100644 index 82b1c98ad9..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IPagingResponseHandler.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Microsoft.Kiota.Abstractions; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Paging response handler contract. -/// -public interface IPagingResponseHandler : IResponseHandler -{ - /// - /// Get response content headers. - /// - /// The response content headers. - /// Thrown when the response handler's HandleResponseAsync function hasn't yet run. - IDictionary> GetResponseContentHeaders(); - - /// - /// Get response headers. - /// - /// The response headers. - /// Thrown when the response handler's HandleResponseAsync function hasn't yet run. - IDictionary> GetResponseHeaders(); - - /// - /// Get a response stream. - /// - /// The cancellation token - /// The response content stream. - /// Thrown when the response handler's HandleResponseAsync function hasn't yet run. - Task GetResponseStreamAsync(CancellationToken cancellationToken = default); - - /// - /// Gets the status code. - /// - /// The status code. - /// Thrown when the response handler's HandleResponseAsync function hasn't yet run. - int? GetStatusCode(); - -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IPagingService.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IPagingService.cs deleted file mode 100644 index b14299f747..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/IPagingService.cs +++ /dev/null @@ -1,150 +0,0 @@ -using Microsoft.Kiota.Abstractions; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Paging service -/// -public interface IPagingService -{ - /// - /// Create a paging response handler. - /// - IPagingResponseHandler CreateResponseHandler(); - - /// - /// Gets the next page's link - /// - /// Holds data that could be used to extract paging information - /// The cancellation token - /// A Uri of the next page's link or null if there's no next page. - Task GetNextPageLinkAsync(PageLinkData pageLinkData, CancellationToken cancellationToken = default); - - /// - /// Returns the next page or all pages if fetch all pages is true - /// - /// Callback to run that returns a stream with the next page of data - /// Metadata that is used when fetching paging data - /// If this is true, the result will be a stream with all available pages - /// The cancellation token - Task GetPagedDataAsync(Func requestExecutorAsync, PageLinkData pageLinkData, bool fetchAllPages = false, CancellationToken cancellationToken = default); - - /// - /// Merges any new page received on each page request. - /// - /// Cumulative results up until the previous page. - /// The new page data that should be merged. - /// The cancellation token. - /// A stream with the merged new page data. - Task MergePageAsync(Stream currentResult, PageLinkData newPageData, CancellationToken cancellationToken = default); - - /// - /// Runs before getting paging data. Can be used to set request headers or query parameters before making a request - /// - /// A boolean result that if false, cancels the paging - bool OnBeforeGetPagedData(PageLinkData pageLinkData, bool fetchAllPages = false); -} - -/// -/// Holds data that could be used to extract paging information -/// -public readonly struct PageLinkData -{ - /// - /// Holds data that could be used to extract paging information - /// - /// The request information. Paging information (top, skip etc) can be extracted from a request. - /// The response body stream. - /// The response headers. - /// The response content-related headers. - /// The name of the property that has the data. - /// The name of the property that holds the next link. - public PageLinkData(RequestInformation requestInformation, Stream? response, IDictionary>? responseHeaders = null, IDictionary>? responseContentHeaders = null, string itemName = "value", string nextLinkName = "nextLink") - { - ItemName = itemName; - NextLinkName = nextLinkName; - Response = response; - ResponseHeaders = responseHeaders ?? new Dictionary>(StringComparer.OrdinalIgnoreCase); - ResponseContentHeaders = responseContentHeaders ?? new Dictionary>(StringComparer.OrdinalIgnoreCase); - RequestInformation = requestInformation; - } - - /// - /// The name of the property that has the data. - /// - public string ItemName - { - get; private init; - } - - /// - /// The name of the property that holds the next link. - /// - public string NextLinkName - { - get; private init; - } - - /// - /// The request information. Paging information (top, skip etc) can be extracted from a request - /// - public RequestInformation RequestInformation - { - get; private init; - } - - /// - /// The response body stream. Some responses provide paging data e.g. total item count or next page link. - /// - public Stream? Response - { - get; private init; - } - - /// - /// The response headers. Some responses provide paging data in headers e.g. GitHub's next page link. - /// - public IDictionary> ResponseHeaders - { - get; private init; - } - - /// - /// The response content related headers e.g. Content-Type - /// - public IDictionary> ResponseContentHeaders - { - get; private init; - } -} - -/// -/// Response for the paging service. -/// -public readonly struct PageResponse -{ - /// - /// Creates new instance - /// - public PageResponse(int statusCode = 0, Stream? response = null) - { - Response = response; - StatusCode = statusCode; - } - - /// - /// The response body stream. - /// - public Stream? Response - { - get; init; - } - - /// - /// The http response status code. Use to check for success or error. - /// - public int StatusCode - { - get; init; - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/ITableOutputFormatterOptions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/ITableOutputFormatterOptions.cs deleted file mode 100644 index 2e91c895b1..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/ITableOutputFormatterOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The table output formatter options -/// -public interface ITableOutputFormatterOptions : IOutputFormatterOptions -{ -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JmesPathOutputFilter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JmesPathOutputFilter.cs deleted file mode 100644 index 0aecc5d0bb..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JmesPathOutputFilter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Text; -using DevLab.JmesPath; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// An output filter that uses JMESPath queries to filter the output -/// -public class JmesPathOutputFilter : IOutputFilter -{ - private readonly JmesPath jmesPath; - - /// - /// Creates a new instance of JmesPathOutputFilter - /// - /// The JmesPath transformer instance. - public JmesPathOutputFilter(JmesPath jmesPath) - { - if (jmesPath is null) throw new ArgumentNullException(nameof(jmesPath), $"Parameter '{nameof(jmesPath)}' is required."); - this.jmesPath = jmesPath; - } - - /// - public async Task FilterOutputAsync(Stream content, string query, CancellationToken cancellationToken = default) { - if (string.IsNullOrEmpty(query)) return content; - cancellationToken.ThrowIfCancellationRequested(); - using var reader = new StreamReader(content); - var strContent = await reader.ReadToEndAsync(); - cancellationToken.ThrowIfCancellationRequested(); - var filtered = jmesPath.Transform(strContent, query); - cancellationToken.ThrowIfCancellationRequested(); - var bytes = Encoding.UTF8.GetBytes(filtered); - return new MemoryStream(bytes); - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JsonOutputFormatter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JsonOutputFormatter.cs deleted file mode 100644 index a0fb6378bd..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JsonOutputFormatter.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.CommandLine; -using System.Text.Json; -using Spectre.Console; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The JSON output formatter -/// -public class JsonOutputFormatter : IOutputFormatter -{ - private readonly IAnsiConsole _ansiConsole; - - /// - /// Creates a new JSON output formatter with a default console - /// - public JsonOutputFormatter() : this(AnsiConsole.Console) - { - } - - /// - /// Creates a new JSON output formatter with the provided console - /// - /// The console to use - public JsonOutputFormatter(IAnsiConsole console) - { - this._ansiConsole = console; - } - - /// - public async Task WriteOutputAsync(Stream? content, IOutputFormatterOptions? options = null, CancellationToken cancellationToken = default) - { - string resultStr; - if (content == null) - { - return; - } - - if (options is IJsonOutputFormatterOptions jsonOptions && jsonOptions.OutputIndented) - { - using var result = await ProcessJsonAsync(content, jsonOptions.OutputIndented, cancellationToken); - using var r = new StreamReader(result); - resultStr = await r.ReadToEndAsync(); - } - else - { - using var reader = new StreamReader(content); - resultStr = await reader.ReadToEndAsync(); - } - - _ansiConsole.WriteLine(resultStr); - } - - /// - /// Given a JSON input stream, returns a processed JSON stream with optional indentation - /// - /// JSON input stream - /// Whether to return indented output - /// The cancellation token - private static async Task ProcessJsonAsync(Stream input, bool indent = true, CancellationToken cancellationToken = default) - { - Stream cache = new MemoryStream(); - if (!input.CanSeek) { - // copy the stream - await input.CopyToAsync(cache, cancellationToken); - cache.Position = 0; - } else { - cache = input; - } - - try - { - var jsonDoc = await JsonDocument.ParseAsync(cache, default, cancellationToken); - var outputStream = new MemoryStream(); - await JsonSerializer.SerializeAsync(outputStream, jsonDoc, cancellationToken: cancellationToken, options: new() { WriteIndented = indent }); - outputStream.Position = 0; - return outputStream; - } - catch (JsonException) - { - } - - cache.Position = 0; - return cache; - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JsonOutputFormatterOptions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JsonOutputFormatterOptions.cs deleted file mode 100644 index 120bcd1ace..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/JsonOutputFormatterOptions.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The JSON output formatter options -/// -public class JsonOutputFormatterOptions : IJsonOutputFormatterOptions -{ - /// - /// Create new instance of JSON output formatter - /// - public JsonOutputFormatterOptions(bool outputIndented) - { - this.OutputIndented = outputIndented; - } - - /// - public bool OutputIndented { get; init; } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/NativePagingResponseHandler.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/NativePagingResponseHandler.cs deleted file mode 100644 index ac7043af30..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/NativePagingResponseHandler.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Microsoft.Kiota.Abstractions; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Output filter contract. Implement this to provide output filtering capabilities to the CLI. -/// -public class NativePagingResponseHandler : NativeResponseHandler, IPagingResponseHandler -{ - /// - /// Extract response content headers from a response handler. - /// - /// The response content headers. - /// Thrown when the response handler's HandleResponseAsync function hasn't yet run. - public IDictionary> GetResponseContentHeaders() - { - if (Value is HttpResponseMessage responseMessage) - { - return new Dictionary>(responseMessage.Content.Headers, StringComparer.OrdinalIgnoreCase); - } - - throw new InvalidOperationException("The response handler has not been invoked yet."); - } - - /// - public IDictionary> GetResponseHeaders() - { - if (Value is HttpResponseMessage responseMessage) - { - return new Dictionary>(responseMessage.Headers, StringComparer.OrdinalIgnoreCase); - } - - throw new InvalidOperationException("The response handler has not been invoked yet."); - } - - /// - public async Task GetResponseStreamAsync(CancellationToken cancellationToken = default) - { - if (Value is HttpResponseMessage responseMessage) - { - return await responseMessage.Content.ReadAsStreamAsync(cancellationToken); - } - - throw new InvalidOperationException("The response handler has not been invoked yet."); - } - - /// - public int? GetStatusCode() - { - if (Value is HttpResponseMessage responseMessage) - { - return (int)responseMessage.StatusCode; - } - - throw new InvalidOperationException("The response handler has not been invoked yet."); - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/NoneOutputFormatter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/NoneOutputFormatter.cs deleted file mode 100644 index 6e18c02781..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/NoneOutputFormatter.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.CommandLine; -using System.Text.Json; -using Spectre.Console; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// A no-op output formatter -/// -public class NoneOutputFormatter : IOutputFormatter -{ - /// - public Task WriteOutputAsync(Stream? content, IOutputFormatterOptions? options = null, CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/ODataPagingService.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/ODataPagingService.cs deleted file mode 100644 index 782aa81fe6..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/ODataPagingService.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Text.Json; -using System.Text.Json.Nodes; -using Microsoft.Kiota.Abstractions; -using Microsoft.Kiota.Abstractions.Serialization; - -[assembly: InternalsVisibleTo("Microsoft.Kiota.Cli.Commons.Tests")] -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// Paging service that supports the x-ms-pageable extension -/// -public class ODataPagingService : BasePagingService -{ - /// - public override IPagingResponseHandler CreateResponseHandler() - { - return new NativePagingResponseHandler(); - } - - /// - public override async Task GetNextPageLinkAsync(PageLinkData pageLinkData, CancellationToken cancellationToken = default) - { - if (IsJson(pageLinkData) && pageLinkData.Response != null) - { - try - { - using var doc = await JsonDocument.ParseAsync(pageLinkData.Response, cancellationToken: cancellationToken); - var hasNextLink = doc.RootElement.TryGetProperty(pageLinkData.NextLinkName, out var nextLink); - if (hasNextLink && nextLink.ValueKind == JsonValueKind.String) - { - string? link = nextLink.GetString(); - if (!string.IsNullOrWhiteSpace(link)) return new Uri(link); - } - } - catch (JsonException) - { - // If the response isn't valid JSON, there will be no next link. - // TODO: Log warning once logging story is defined - } - } - - return null; - } - - /// - public override async Task MergePageAsync(Stream? currentResult, PageLinkData newPageData, CancellationToken cancellationToken = default) - { - if (IsJson(newPageData)) - { - return await MergeJsonStreamsAsync(currentResult, newPageData.Response, newPageData.ItemName, newPageData.NextLinkName, cancellationToken); - } - - return null; - } - - /// - public override bool OnBeforeGetPagedData(PageLinkData pageLinkData, bool fetchAllPages = false) - { - return true; - } - - private bool IsJson(PageLinkData pageLinkData) - { - return pageLinkData.ResponseContentHeaders.TryGetValue("Content-Type", out var contentType) && contentType.Any(c => c.Contains("json")); - } - - /// - /// Merges 2 streams of JSON on the property defined by itemName. The property should be a JSON array - /// - /// The first stream. - /// The second stream. - /// The name of the array property to merge on. - /// The name of the property containing the next link name. - /// The cancellation token. - internal async Task MergeJsonStreamsAsync(Stream? left, Stream? right, string itemName = "value", string nextLinkName = "nextLink", CancellationToken cancellationToken = default) - { - if (left?.CanSeek == true) left?.Seek(0, SeekOrigin.Begin); - if (right?.CanSeek == true) right?.Seek(0, SeekOrigin.Begin); - if (left == null || right == null) - { - return left ?? right; - } - - JsonNode? nodeLeft = JsonNode.Parse(left); - if (left.CanSeek == true) left.Seek(0, SeekOrigin.Begin); - JsonNode? nodeRight = JsonNode.Parse(right); - if (right.CanSeek == true) right.Seek(0, SeekOrigin.Begin); - - JsonArray? leftArray = null; - JsonArray? rightArray = null; - if (!string.IsNullOrWhiteSpace(itemName)) - { - if (nodeLeft?[itemName] == null) - { - return right; - } - else if (nodeRight?[itemName] == null) - { - return left; - } - - leftArray = nodeLeft[itemName]?.AsArray(); - rightArray = nodeRight[itemName]?.AsArray(); - } - else - { - leftArray = nodeLeft?.AsArray(); - rightArray = nodeRight?.AsArray(); - } - - - if (leftArray != null && rightArray != null) - { - var elements = rightArray.Where(i => i != null); - var item = elements.FirstOrDefault(); - while (item != null) - { - rightArray.Remove(item); - leftArray.Add(item); - item = elements.FirstOrDefault(); - } - } - if (!string.IsNullOrWhiteSpace(itemName) && nodeLeft != null) - { - nodeLeft[itemName] = leftArray ?? rightArray; - } - else - { - nodeLeft = leftArray ?? rightArray; - } - - // Replace next link with new page's next link - if (!string.IsNullOrWhiteSpace(nextLinkName)) - { - var obj1 = nodeLeft as JsonObject; - if (obj1?[nextLinkName] != null) - obj1.Remove(nextLinkName); - if (nodeRight is JsonObject obj2 && obj2?[nextLinkName] != null) - { - var nextLink = obj2[nextLinkName]; - obj2.Remove(nextLinkName); - obj1?.Add(nextLinkName, nextLink); - } - } - var stream = new MemoryStream(); - using var writer = new Utf8JsonWriter(stream); - nodeLeft?.WriteTo(writer); - await writer.FlushAsync(cancellationToken); - stream.Position = 0; - - return stream; - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/OutputFormatterFactory.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/OutputFormatterFactory.cs deleted file mode 100644 index 5be487417d..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/OutputFormatterFactory.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -public sealed class OutputFormatterFactory : IOutputFormatterFactory -{ - /// - public IOutputFormatter GetFormatter(FormatterType formatterType) - { - return formatterType switch - { - FormatterType.JSON => new JsonOutputFormatter(), - FormatterType.TABLE => new TableOutputFormatter(), - FormatterType.TEXT => new TextOutputFormatter(), - _ => throw new NotSupportedException(), - }; - } - - /// - public IOutputFormatter GetFormatter(string format) - { - var success = Enum.TryParse(format, true, out FormatterType type); - if (!success) - { - throw new NotSupportedException(); - } - return GetFormatter(type); - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/OutputFormatterOptions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/OutputFormatterOptions.cs deleted file mode 100644 index 572eef36b0..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/OutputFormatterOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The output formatter options base -/// -public class OutputFormatterOptions : IOutputFormatterOptions -{ -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TableOutputFormatter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TableOutputFormatter.cs deleted file mode 100644 index a1fcddffe0..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TableOutputFormatter.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System.Runtime.CompilerServices; -using System.Text.Json; -using Spectre.Console; -using Spectre.Console.Rendering; - -[assembly: InternalsVisibleTo("Microsoft.Kiota.Cli.Commons.Tests")] -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The table output formatter -/// -public class TableOutputFormatter : IOutputFormatter -{ - private readonly IAnsiConsole _ansiConsole; - - /// - /// Creates a new table output formatter with a default console - /// - public TableOutputFormatter() : this(AnsiConsole.Console) - { - } - - /// - /// Creates a new table output formatter with the provided console - /// - /// The console to use - public TableOutputFormatter(IAnsiConsole console) - { - _ansiConsole = console; - } - - /// - public async Task WriteOutputAsync(Stream? content, IOutputFormatterOptions? options = null, CancellationToken cancellationToken = default) { - if (content == null) - { - return; - } - using var doc = await JsonDocument.ParseAsync(content, cancellationToken: cancellationToken); - var table = ConstructTable(doc); - _ansiConsole.Write(table); - } - - /// - /// Construct a table given a JSON document - /// - /// The parsed json document - /// A table - internal Table ConstructTable(JsonDocument document) { - var root = GetRootElement(document.RootElement); - var firstElement = GetFirstElement(root); - - IEnumerable propertyNames = GetPropertyNames(firstElement); - var table = new Table(); - table.Expand(); - - foreach (var propertyName in propertyNames) - { - table.AddColumn(propertyName, column => - { - if (firstElement.ValueKind == JsonValueKind.Object) - { - var hasProp = firstElement.TryGetProperty(propertyName, out var property); - if (property.ValueKind == JsonValueKind.Number) - column.RightAligned().PadLeft(10); - } - }); - } - - if (root.ValueKind == JsonValueKind.Array) - { - foreach (var row in root.EnumerateArray()) - { - var rowCols = GetRowColumns(propertyNames, row); - table.AddRow(rowCols); - } - } - else if (root.ValueKind == JsonValueKind.Object) - { - var rowCols = GetRowColumns(propertyNames, root); - table.AddRow(rowCols); - } - else - { - table.AddRow(GetPropertyValue(root)); - } - - return table; - } - - private static JsonElement GetRootElement(JsonElement input) { - var root = input; - if (root.ValueKind == JsonValueKind.Object && root.TryGetProperty("value", out var value)) - root = value; - - return root; - } - - private static JsonElement GetFirstElement(JsonElement root) { - var firstElement = root; - if (root.ValueKind == JsonValueKind.Array && root.GetArrayLength() > 0) - { - var enumerated = root.EnumerateArray(); - firstElement = enumerated.FirstOrDefault(); - } - - return firstElement; - } - - private static IEnumerable GetPropertyNames(JsonElement firstElement) { - IEnumerable propertyNames; - if (firstElement.ValueKind != JsonValueKind.Object) - { - propertyNames = new List { "Value" }; - } - else - { - var restrictedValueKinds = new JsonValueKind[] { - JsonValueKind.Array, - JsonValueKind.Object - }; - var objectEnumerator = firstElement.EnumerateObject(); - var buffer = new List(); - foreach (var property in objectEnumerator) - { - if (restrictedValueKinds.Contains(property.Value.ValueKind)) { - continue; - } - - buffer.Add(property.Name); - } - propertyNames = buffer; - } - - return propertyNames; - } - - private static IEnumerable GetRowColumns(IEnumerable propertyNames, JsonElement row) - { - return propertyNames.Select(p => - { - var propertyName = p; - if (row.ValueKind == JsonValueKind.Object) - { - var hasProp = row.TryGetProperty(propertyName, out var property); - if (hasProp) - return GetPropertyValue(property); - else - return new Markup("-"); - } - - return GetPropertyValue(row); - }); - } - - private static IRenderable GetPropertyValue(JsonElement property) - { - var valueKind = property.ValueKind; - object? value = null; - switch (valueKind) - { - case JsonValueKind.String: - value = property.GetString(); - break; - case JsonValueKind.True: - case JsonValueKind.False: - value = property.GetBoolean(); - break; - case JsonValueKind.Number: - value = property.GetDecimal(); - break; - } - return new Markup(value?.ToString() ?? "-"); - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TableOutputFormatterOptions.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TableOutputFormatterOptions.cs deleted file mode 100644 index 20f06056dd..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TableOutputFormatterOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The table output formatter options -/// -public class TableOutputFormatterOptions : ITableOutputFormatterOptions -{ -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TextOutputFormatter.cs b/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TextOutputFormatter.cs deleted file mode 100644 index 34e5acb95a..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/IO/TextOutputFormatter.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.CommandLine; -using System.Text.Json; -using Spectre.Console; - -namespace Microsoft.Kiota.Cli.Commons.IO; - -/// -/// The JSON output formatter -/// -public class TextOutputFormatter : IOutputFormatter -{ - private readonly IAnsiConsole _ansiConsole; - - /// - /// Creates a new JSON output formatter with a default console - /// - public TextOutputFormatter() : this(AnsiConsole.Console) - { - } - - /// - /// Creates a new JSON output formatter with the provided console - /// - /// The console to use - public TextOutputFormatter(IAnsiConsole console) - { - this._ansiConsole = console; - } - - /// - public async Task WriteOutputAsync(Stream? content, IOutputFormatterOptions? options = null, CancellationToken cancellationToken = default) - { - if (content == null) - { - return; - } - - using var reader = new StreamReader(content); - const int BUFFER_LENGTH = 4096; - var charsReceived = 0; - do { - var buffer = new char[BUFFER_LENGTH]; - charsReceived = await reader.ReadAsync(buffer.AsMemory(0, buffer.Length), cancellationToken); - if (charsReceived == 0) { - break; - } - _ansiConsole.Write(new string(buffer, 0, charsReceived)); - } while(charsReceived == BUFFER_LENGTH); - _ansiConsole.WriteLine(); - } -} diff --git a/cli/commons/src/Microsoft.Kiota.Cli.Commons/Microsoft.Kiota.Cli.Commons.csproj b/cli/commons/src/Microsoft.Kiota.Cli.Commons/Microsoft.Kiota.Cli.Commons.csproj deleted file mode 100644 index 4d1cbfd13e..0000000000 --- a/cli/commons/src/Microsoft.Kiota.Cli.Commons/Microsoft.Kiota.Cli.Commons.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net7.0 - enable - enable - true - https://github.com/microsoft/kiota - 0.1.10-preview.1 - true - true - - - - - - - - - - - - - diff --git a/src/Kiota.Builder/Kiota.Builder.csproj b/src/Kiota.Builder/Kiota.Builder.csproj index 528d9d582b..8de6c446ae 100644 --- a/src/Kiota.Builder/Kiota.Builder.csproj +++ b/src/Kiota.Builder/Kiota.Builder.csproj @@ -28,7 +28,7 @@ - + diff --git a/src/Kiota.Builder/Writers/Python/CodeBlockEndWriter.cs b/src/Kiota.Builder/Writers/Python/CodeBlockEndWriter.cs index cfcdfb472d..5b4004f969 100644 --- a/src/Kiota.Builder/Writers/Python/CodeBlockEndWriter.cs +++ b/src/Kiota.Builder/Writers/Python/CodeBlockEndWriter.cs @@ -5,7 +5,6 @@ public class CodeBlockEndWriter : ICodeElementWriter { public void WriteCodeElement(BlockEnd codeElement, LanguageWriter writer) { - if(codeElement.Parent is CodeNamespace) return; writer.CloseBlock(string.Empty); } } diff --git a/src/Kiota.Builder/Writers/Python/CodeEnumWriter.cs b/src/Kiota.Builder/Writers/Python/CodeEnumWriter.cs index 453ee9dc87..e5ec8bf6c0 100644 --- a/src/Kiota.Builder/Writers/Python/CodeEnumWriter.cs +++ b/src/Kiota.Builder/Writers/Python/CodeEnumWriter.cs @@ -9,15 +9,18 @@ public class CodeEnumWriter : BaseElementWriter { + if(!codeElement.Options.Any()){ + writer.WriteLine("pass"); + } + else { + codeElement.Options.ToList().ForEach(x => { conventions.WriteInLineDescription(x.Description, writer); writer.WriteLine($"{x.Name.ToFirstCharacterUpperCase()} = \"{x.SerializationName ?? x.Name}\","); - }); + }); + } } } diff --git a/src/Kiota.Builder/Writers/Python/CodeMethodWriter.cs b/src/Kiota.Builder/Writers/Python/CodeMethodWriter.cs index 37bfe12437..99fb457c5b 100644 --- a/src/Kiota.Builder/Writers/Python/CodeMethodWriter.cs +++ b/src/Kiota.Builder/Writers/Python/CodeMethodWriter.cs @@ -31,7 +31,7 @@ public override void WriteCodeElement(CodeMethod codeElement, LanguageWriter wri if(!codeElement.IsOfKind(CodeMethodKind.Setter)) foreach(var parameter in codeElement.Parameters.Where(x => !x.Optional).OrderBy(x => x.Name)) { var parameterName = parameter.Name.ToSnakeCase(); - writer.WriteLine($"if not {parameterName}:"); + writer.WriteLine($"if {parameterName} is None:"); writer.IncreaseIndent(); writer.WriteLine($"raise Exception(\"{parameterName} cannot be undefined\")"); writer.DecreaseIndent(); @@ -79,8 +79,7 @@ public override void WriteCodeElement(CodeMethod codeElement, LanguageWriter wri WriteDefaultMethodBody(codeElement, writer, returnType); break; } - writer.DecreaseIndent(); - writer.WriteLine(); + writer.CloseBlock(string.Empty); } private void WriteIndexerBody(CodeMethod codeElement, CodeClass parentClass, string returnType, LanguageWriter writer) { var pathParametersProperty = parentClass.GetPropertyOfKind(CodePropertyKind.PathParameters); @@ -116,7 +115,7 @@ private static void WriteQueryParametersMapper(CodeMethod codeElement, CodeClass var parameterName = parameter.Name.ToSnakeCase(); var escapedProperties = parentClass.Properties.Where(x => x.IsOfKind(CodePropertyKind.QueryParameter) && x.IsNameEscaped); foreach(var escapedProperty in escapedProperties) { - writer.WriteLine($"if {parameterName} == \"{escapedProperty.Name}\":"); + writer.WriteLine($"if {parameterName} == \"{escapedProperty.Name.ToSnakeCase()}\":"); writer.IncreaseIndent(); writer.WriteLine($"return \"{escapedProperty.SerializationName}\""); writer.DecreaseIndent(); @@ -289,7 +288,7 @@ private void WriteRequestExecutorBody(CodeMethod codeElement, RequestParams requ writer.WriteLine($"{errorMappingVarName}: Dict[str, ParsableFactory] = {{"); writer.IncreaseIndent(); foreach(var errorMapping in codeElement.ErrorMappings) { - writer.WriteLine($"\"{errorMapping.Key.ToUpperInvariant()}\": o_data_error.{errorMapping.Value.Name}.get_from_discriminator_value(),"); + writer.WriteLine($"\"{errorMapping.Key.ToUpperInvariant()}\": {errorMapping.Value.Name.ToSnakeCase()}.{errorMapping.Value.Name},"); } writer.CloseBlock(); } diff --git a/src/Kiota.Builder/Writers/Python/CodePropertyWriter.cs b/src/Kiota.Builder/Writers/Python/CodePropertyWriter.cs index e525ee6179..49be5d7880 100644 --- a/src/Kiota.Builder/Writers/Python/CodePropertyWriter.cs +++ b/src/Kiota.Builder/Writers/Python/CodePropertyWriter.cs @@ -19,8 +19,7 @@ public override void WriteCodeElement(CodeProperty codeElement, LanguageWriter w writer.IncreaseIndent(); conventions.WriteShortDescription(codeElement.Description, writer); conventions.AddRequestBuilderBody(parentClass, returnType, writer); - writer.DecreaseIndent(); - writer.WriteLine(); + writer.CloseBlock(string.Empty); break; case CodePropertyKind.QueryParameters: case CodePropertyKind.Headers: diff --git a/src/Kiota.Builder/Writers/Python/PythonConventionService.cs b/src/Kiota.Builder/Writers/Python/PythonConventionService.cs index 478c123dff..c80d5fd143 100644 --- a/src/Kiota.Builder/Writers/Python/PythonConventionService.cs +++ b/src/Kiota.Builder/Writers/Python/PythonConventionService.cs @@ -105,6 +105,8 @@ private static string TranslateInternalType(CodeType type) return type.TypeDefinition?.Name.ToFirstCharacterUpperCase(); if (type.Name.Contains("QueryParameters")) return type.Name; + if (type.Name.Contains("APIError")) + return type.Name; return type.Name switch { "String" or "string" => "str", "integer" or "int32" or "int64" or "byte" or "sbyte" => "int", diff --git a/tests/Kiota.Builder.Tests/Writers/Python/CodeEnumWriterTests.cs b/tests/Kiota.Builder.Tests/Writers/Python/CodeEnumWriterTests.cs index d43fda03e9..0b7a0274bd 100644 --- a/tests/Kiota.Builder.Tests/Writers/Python/CodeEnumWriterTests.cs +++ b/tests/Kiota.Builder.Tests/Writers/Python/CodeEnumWriterTests.cs @@ -38,9 +38,10 @@ public void WritesEnum() { Assert.Contains(optionName, result); } [Fact] - public void DoesntWriteAnythingOnNoOption() { + public void WritesNullStatementOnNoOption() { writer.Write(currentEnum); var result = tw.ToString(); - Assert.Empty(result); + Assert.Contains("(Enum):", result); + Assert.Contains("pass", result); } } diff --git a/tests/Kiota.Builder.Tests/Writers/Python/CodeMethodWriterTests.cs b/tests/Kiota.Builder.Tests/Writers/Python/CodeMethodWriterTests.cs index 92b8f60c6f..f5e64afe09 100644 --- a/tests/Kiota.Builder.Tests/Writers/Python/CodeMethodWriterTests.cs +++ b/tests/Kiota.Builder.Tests/Writers/Python/CodeMethodWriterTests.cs @@ -233,9 +233,9 @@ public void WritesRequestExecutorBody() { var result = tw.ToString(); Assert.Contains("request_info", result); Assert.Contains("error_mapping: Dict[str, ParsableFactory] =", result); - Assert.Contains("\"4XX\": o_data_error.Error4XX.get_from_discriminator_value()", result); - Assert.Contains("\"5XX\": o_data_error.Error5XX.get_from_discriminator_value()", result); - Assert.Contains("\"403\": o_data_error.Error403.get_from_discriminator_value()", result); + Assert.Contains("\"4XX\": error4_x_x.Error4XX", result); + Assert.Contains("\"5XX\": error5_x_x.Error5XX", result); + Assert.Contains("\"403\": error403.Error403", result); Assert.Contains("send_async", result); Assert.Contains("raise Exception", result); } @@ -720,11 +720,17 @@ public void WritesNameMapperMethod() { Kind = CodePropertyKind.QueryParameter, SerializationName = "%24expand" }, + new CodeProperty { + Name = "select-from", + Kind = CodePropertyKind.QueryParameter, + SerializationName = "select%2Dfrom" + }, new CodeProperty { Name = "filter", Kind = CodePropertyKind.QueryParameter, SerializationName = "%24filter" }); + method.AddParameter(new CodeParameter{ Kind = CodeParameterKind.QueryParametersMapperParameter, Name = "originalName", @@ -734,11 +740,13 @@ public void WritesNameMapperMethod() { }); writer.Write(method); var result = tw.ToString(); - Assert.Contains("if not original_name:", result); + Assert.Contains("if original_name is None:", result); Assert.Contains("if original_name == \"select\":", result); Assert.Contains("return \"%24select\"", result); Assert.Contains("if original_name == \"expand\":", result); Assert.Contains("return \"%24expand\"", result); + Assert.Contains("if original_name == \"select_from\":", result); + Assert.Contains("return \"select%2Dfrom\"", result); Assert.Contains("if original_name == \"filter\":", result); Assert.Contains("return \"%24filter\"", result); Assert.Contains("return original_name", result);