From dc949954b01fa28dc98725da44ab2e235f01b21a Mon Sep 17 00:00:00 2001 From: David Maas Date: Wed, 14 May 2025 15:33:41 -0500 Subject: [PATCH 1/2] Normalize license file formatting --- LICENSE | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/LICENSE b/LICENSE index 6cc246b..a0432fd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,13 +1,11 @@ -MIT License +Copyright (c) Bonsai Foundation CIC and Contributors -Copyright (c) 2023 Bonsai Foundation CIC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -18,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. \ No newline at end of file From 95360010fbd2f7905f2869049da6de05de0067ec Mon Sep 17 00:00:00 2001 From: David Maas Date: Fri, 16 May 2025 23:21:22 -0500 Subject: [PATCH 2/2] Add CI/CD and brought repository into compliance with modern standards --- .bonsai/NuGet.config | 3 - .config/dotnet-tools.json | 5 +- .editorconfig | 46 +++ .gitattributes | 3 +- .github/workflows/Bonsai.Scripting.Python.yml | 344 ++++++++++++++++++ .github/workflows/docs.yml | 51 --- .gitignore | 11 +- .gitmodules | 6 +- ....Python.sln => Bonsai.Scripting.Python.sln | 11 +- Directory.Build.props | 3 + Directory.Build.targets | 3 + build/Common.Tests.csproj.props | 6 + build/Common.csproj.props | 80 ++++ build/Common.csproj.targets | 46 +++ build/Package.props | 9 + build/Project.csproj.props | 5 + build/icon.png | Bin 0 -> 4224 bytes docs/.gitignore | 1 - README.md => docs/README.md | 0 docs/api/.gitignore | 5 - docs/bonsai | 1 - docs/bonsai-docfx | 1 + docs/build.ps1 | 21 +- docs/docfx.json | 67 ++-- docs/export-images.ps1 | 44 +++ docs/favicon.ico | Bin 113038 -> 0 bytes docs/filter.yml | 4 + docs/logo.svg | 96 ----- docs/template/public/main.css | 2 +- docs/template/public/main.js | 2 +- docs/toc.yml | 6 +- docs/workflows/.gitignore | 2 +- global.json | 6 + src/.editorconfig | 27 -- .../Bonsai.Scripting.Python.csproj | 5 +- .../Properties/launchSettings.json | 2 +- src/Directory.Build.props | 24 -- src/NuGet.config | 6 - 38 files changed, 678 insertions(+), 276 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/Bonsai.Scripting.Python.yml delete mode 100644 .github/workflows/docs.yml rename src/Bonsai.Scripting.Python.sln => Bonsai.Scripting.Python.sln (63%) create mode 100644 Directory.Build.props create mode 100644 Directory.Build.targets create mode 100644 build/Common.Tests.csproj.props create mode 100644 build/Common.csproj.props create mode 100644 build/Common.csproj.targets create mode 100644 build/Package.props create mode 100644 build/Project.csproj.props create mode 100644 build/icon.png delete mode 100644 docs/.gitignore rename README.md => docs/README.md (100%) delete mode 100644 docs/api/.gitignore delete mode 160000 docs/bonsai create mode 160000 docs/bonsai-docfx create mode 100644 docs/export-images.ps1 delete mode 100644 docs/favicon.ico create mode 100644 docs/filter.yml delete mode 100644 docs/logo.svg create mode 100644 global.json delete mode 100644 src/.editorconfig delete mode 100644 src/Directory.Build.props delete mode 100644 src/NuGet.config diff --git a/.bonsai/NuGet.config b/.bonsai/NuGet.config index 97e8b73..aa5beec 100644 --- a/.bonsai/NuGet.config +++ b/.bonsai/NuGet.config @@ -1,8 +1,5 @@ - - - diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 278b6c7..d32441d 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,10 +3,11 @@ "isRoot": true, "tools": { "docfx": { - "version": "2.75.3", + "version": "2.78.3", "commands": [ "docfx" - ] + ], + "rollForward": false } } } \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c9a9d0d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,46 @@ +root = true + +[*] +indent_style = space + +#-------------------------------------------------------------------------------------------------- +# XML, JSON, and web files +#-------------------------------------------------------------------------------------------------- +[*.{xml,csproj,vcxproj,vcxproj.filters,shproj,props,targets,config,nuspec,resx,vsixmanifest,wxs,vstemplate,slnx}] +indent_size = 2 + +[*.json] +indent_size = 2 + +[*.{html,css}] +indent_size = 2 + +#-------------------------------------------------------------------------------------------------- +# C++ +#-------------------------------------------------------------------------------------------------- +[*.{c,cpp,h,hpp,ixx}] +indent_size = 4 +charset = utf-8-bom +trim_trailing_whitespace = true +insert_final_newline = true + +#-------------------------------------------------------------------------------------------------- +# C# +#-------------------------------------------------------------------------------------------------- +[*.{cs,csx}] +indent_size = 4 +charset = utf-8-bom +trim_trailing_whitespace = true +insert_final_newline = true + +# Language keyword vs full type name +# Predefined for members, etc does not create a message because the explicitly sized types are conveient in interop scenarios where the bit size matters. +dotnet_style_predefined_type_for_locals_parameters_members = true:none +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Instantiate argument exceptions correctly +dotnet_diagnostic.CA2208.severity = warning + +# Don't complain about not using modern collection syntax +dotnet_style_prefer_collection_expression = never +csharp_style_prefer_range_operator = false diff --git a/.gitattributes b/.gitattributes index eb356c9..601a4e2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,6 +8,7 @@ # Config *.gitignore text *.gitattributes text +*.gitmodules text eol=lf *.editorconfig text *.git-blame-ignore-revs text *.sln text @@ -39,4 +40,4 @@ LICENSE text *.png binary *.ico binary *.gif binary -*.svg text \ No newline at end of file +*.svg text diff --git a/.github/workflows/Bonsai.Scripting.Python.yml b/.github/workflows/Bonsai.Scripting.Python.yml new file mode 100644 index 0000000..4c5e78d --- /dev/null +++ b/.github/workflows/Bonsai.Scripting.Python.yml @@ -0,0 +1,344 @@ +# ======================================================================================================================================================================= +# Bonsai.Scripting.Python CI/CD +# ======================================================================================================================================================================= +# Index: +# * Build, test, and package .NET +# * Build documentation +# * Render workflow images +# * Publish packages to GitHub +# * Publish packages to NuGet.org +# * Publish documentation +# ======================================================================================================================================================================= +# Note that this is a generic workflow meant for all Bonsai packages. Minor local modifications are fine, see https://github.com/bonsai-rx/prefect for more information. +# ======================================================================================================================================================================= +name: Bonsai.Scripting.Python +on: + push: + # This prevents tag pushes from triggering this workflow + branches: ['*'] + pull_request: + release: + types: [published] + workflow_dispatch: +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_GENERATE_ASPNET_CERTIFICATE: false + ContinuousIntegrationBuild: true +jobs: + # ===================================================================================================================================================================== + # Build, test, and package .NET + # ___ _ _ _ _ _ _ _ _ _ ___ _____ + # | _ )_ _(_) |__| | | |_ ___ __| |_ __ _ _ _ __| | _ __ __ _ __| |____ _ __ _ ___ | \| | __|_ _| + # | _ \ || | | / _` |_ | _/ -_|_-< _|_ / _` | ' \/ _` | | '_ \/ _` / _| / / _` / _` / -_) _| .` | _| | | + # |___/\_,_|_|_\__,_( ) \__\___/__/\__( ) \__,_|_||_\__,_| | .__/\__,_\__|_\_\__,_\__, \___| (_)_|\_|___| |_| + # |/ |/ |_| |___/ + # ===================================================================================================================================================================== + build: + strategy: + fail-fast: false + matrix: + platform: + - name: Windows x64 + os: windows-latest + rid: win-x64 + - name: Linux x64 + os: ubuntu-22.04 + rid: linux-x64 + configuration: ['debug', 'release'] + include: + - platform: + rid: win-x64 + configuration: release + collect-packages: true + name: ${{matrix.platform.name}} ${{matrix.configuration}} + runs-on: ${{matrix.platform.os}} + outputs: + need-workflow-image-render: ${{steps.configure-build.outputs.need-workflow-image-render}} + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + # ----------------------------------------------------------------------- Set up tools + - name: Set up .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + # ----------------------------------------------------------------------- Configure build + - name: Configure build + id: configure-build + uses: bonsai-rx/configure-build@v1 + + # ----------------------------------------------------------------------- Build + - name: Restore + run: dotnet restore + + - name: Build + run: dotnet build --no-restore --configuration ${{matrix.configuration}} + + # ----------------------------------------------------------------------- Pack + - name: Pack + id: pack + run: dotnet pack --no-restore --no-build --configuration ${{matrix.configuration}} + + # ----------------------------------------------------------------------- Test + - name: Test .NET Framework 4.7.2 + run: dotnet test --no-restore --no-build --configuration ${{matrix.configuration}} --verbosity normal --framework net472 + - name: Test .NET 8 + run: dotnet test --no-restore --no-build --configuration ${{matrix.configuration}} --verbosity normal --framework net8.0 + - name: Test .NET 8 Windows + if: matrix.platform.rid == 'win-x64' + run: dotnet test --no-restore --no-build --configuration ${{matrix.configuration}} --verbosity normal --framework net8.0-windows + + # ----------------------------------------------------------------------- Collect artifacts + - name: Collect NuGet packages + uses: actions/upload-artifact@v4 + if: matrix.collect-packages && steps.pack.outcome == 'success' && always() + with: + name: Packages + if-no-files-found: error + path: artifacts/package/${{matrix.configuration}}/** + + # ===================================================================================================================================================================== + # Build documentation + # ___ _ _ _ _ _ _ _ + # | _ )_ _(_) |__| | __| |___ __ _ _ _ __ ___ _ _| |_ __ _| |_(_)___ _ _ + # | _ \ || | | / _` | / _` / _ \/ _| || | ' \/ -_) ' \ _/ _` | _| / _ \ ' \ + # |___/\_,_|_|_\__,_| \__,_\___/\__|\_,_|_|_|_\___|_||_\__\__,_|\__|_\___/_||_| + # ===================================================================================================================================================================== + build-documentation: + name: Build documentation + runs-on: ubuntu-latest + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + # ----------------------------------------------------------------------- Set up tools + - name: Set up .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Set up .NET tools + run: dotnet tool restore + + # ----------------------------------------------------------------------- Restore + - name: Restore + run: dotnet restore + + # ----------------------------------------------------------------------- Build metadata + - name: Build metadata + id: build-metadata + run: dotnet docfx metadata docs/docfx.json --noRestore + + # ----------------------------------------------------------------------- Build documentation + - name: Build documentation + id: build-documentation + run: dotnet docfx build docs/docfx.json + + # ----------------------------------------------------------------------- Collect artifacts + - name: Collect documentation metadata + uses: actions/upload-artifact@v4 + if: steps.build-metadata.outcome == 'success' && always() + with: + name: DocumentationMetadata + if-no-files-found: error + path: artifacts/docs/api/ + + - name: Collect documentation artifact + uses: actions/upload-artifact@v4 + if: steps.build-documentation.outcome == 'success' && always() + with: + name: DocumentationWebsite + if-no-files-found: error + path: artifacts/docs/site/ + + # ===================================================================================================================================================================== + # Render workflow images + # ___ _ _ __ _ _ + # | _ \___ _ _ __| |___ _ _ __ __ _____ _ _| |__/ _| |_____ __ __ (_)_ __ __ _ __ _ ___ ___ + # | / -_) ' \/ _` / -_) '_| \ V V / _ \ '_| / / _| / _ \ V V / | | ' \/ _` / _` / -_|_-< + # |_|_\___|_||_\__,_\___|_| \_/\_/\___/_| |_\_\_| |_\___/\_/\_/ |_|_|_|_\__,_\__, \___/__/ + # |___/ + # ===================================================================================================================================================================== + workflow-images: + name: Render workflow images + runs-on: windows-latest + needs: build + if: needs.build.outputs.need-workflow-image-render == 'true' + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + # ----------------------------------------------------------------------- Download built packages + - name: Download packages for rendering + uses: actions/download-artifact@v4 + with: + name: Packages + path: artifacts/packages/ + + # ----------------------------------------------------------------------- Set up Bonsai environments + - name: Set up Bonsai environments + uses: bonsai-rx/setup-bonsai@v1 + with: + environment-paths: '**/.bonsai/' + inject-packages: artifacts/packages/*.nupkg + + # ----------------------------------------------------------------------- Render + - name: Render images + id: render + run: pwsh ./docs/export-images.ps1 -OutputFolder artifacts/docs/site/ -Verbose + + # ----------------------------------------------------------------------- Collect artifacts + - name: Collect images + uses: actions/upload-artifact@v4 + if: steps.render.outcome == 'success' && always() + with: + name: DocumentationWorkflowImages + if-no-files-found: error + path: artifacts/docs/site/ + + # ===================================================================================================================================================================== + # Publish packages to GitHub + # ___ _ _ _ _ _ _ ___ _ _ _ _ _ + # | _ \_ _| |__| (_)__| |_ _ __ __ _ __| |____ _ __ _ ___ ___ | |_ ___ / __(_) |_| || |_ _| |__ + # | _/ || | '_ \ | (_-< ' \ | '_ \/ _` / _| / / _` / _` / -_|_-< | _/ _ \ | (_ | | _| __ | || | '_ \ + # |_| \_,_|_.__/_|_/__/_||_| | .__/\__,_\__|_\_\__,_\__, \___/__/ \__\___/ \___|_|\__|_||_|\_,_|_.__/ + # |_| |___/ + # ===================================================================================================================================================================== + publish-github: + name: Publish packages to GitHub + runs-on: ubuntu-latest + needs: build + permissions: + # Needed to attach files to releases + contents: write + # Needed to upload to GitHub Packages + packages: write + if: github.event_name == 'push' || github.event_name == 'release' + steps: + # ----------------------------------------------------------------------- Set up .NET + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + # ----------------------------------------------------------------------- Download built packages + - name: Download built packages + uses: actions/download-artifact@v4 + with: + name: Packages + path: artifacts/packages/ + + # ----------------------------------------------------------------------- Upload release assets + - name: Upload release assets + if: github.event_name == 'release' + run: gh release upload --repo ${{github.repository}} ${{github.event.release.tag_name}} artifacts/packages/* --clobber + env: + GH_TOKEN: ${{github.token}} + + # ----------------------------------------------------------------------- Push to GitHub Packages + - name: Push to GitHub Packages + run: dotnet nuget push "artifacts/packages/*.nupkg" --skip-duplicate --no-symbols --api-key ${{secrets.GITHUB_TOKEN}} --source https://nuget.pkg.github.com/${{github.repository_owner}} + env: + # This is a workaround for https://github.com/NuGet/Home/issues/9775 + DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER: 0 + + # ===================================================================================================================================================================== + # Publish packages to NuGet.org + # ___ _ _ _ _ _ _ _ _ ___ _ + # | _ \_ _| |__| (_)__| |_ _ __ __ _ __| |____ _ __ _ ___ ___ | |_ ___ | \| |_ _ / __|___| |_ ___ _ _ __ _ + # | _/ || | '_ \ | (_-< ' \ | '_ \/ _` / _| / / _` / _` / -_|_-< | _/ _ \ | .` | || | (_ / -_) _|_/ _ \ '_/ _` | + # |_| \_,_|_.__/_|_/__/_||_| | .__/\__,_\__|_\_\__,_\__, \___/__/ \__\___/ |_|\_|\_,_|\___\___|\__(_)___/_| \__, | + # |_| |___/ |___/ + # ===================================================================================================================================================================== + publish-packages-nuget-org: + name: Publish packages to NuGet.org + runs-on: ubuntu-latest + environment: public-release + needs: build + if: github.event_name == 'release' + steps: + # ----------------------------------------------------------------------- Set up .NET + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + # ----------------------------------------------------------------------- Download built packages + - name: Download built packages + uses: actions/download-artifact@v4 + with: + name: Packages + path: artifacts/packages/ + + # ----------------------------------------------------------------------- Push to NuGet.org + - name: Push to NuGet.org + run: dotnet nuget push "artifacts/packages/*.nupkg" --api-key ${{secrets.NUGET_API_KEY}} --source ${{vars.NUGET_API_URL}} + env: + # This is a workaround for https://github.com/NuGet/Home/issues/9775 + DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER: 0 + + + # ===================================================================================================================================================================== + # Publish documentation + # ___ _ _ _ _ _ _ _ _ + # | _ \_ _| |__| (_)__| |_ __| |___ __ _ _ _ __ ___ _ _| |_ __ _| |_(_)___ _ _ + # | _/ || | '_ \ | (_-< ' \ / _` / _ \/ _| || | ' \/ -_) ' \ _/ _` | _| / _ \ ' \ + # |_| \_,_|_.__/_|_/__/_||_| \__,_\___/\__|\_,_|_|_|_\___|_||_\__\__,_|\__|_\___/_||_| + # ===================================================================================================================================================================== + publish-documentation: + name: Publish documentation + runs-on: ubuntu-latest + # Publishing is not strictly necessary here, but if we're going to do a public release we want to wait to publish the docs until it goes out + needs: [build-documentation, workflow-images, publish-packages-nuget-org] + permissions: + # Both required by actions/deploy-pages + pages: write + id-token: write + environment: + # Intentionally not using the "default" github-pages environment as it's not compatible with this workflow + name: documentation-website + url: ${{steps.publish.outputs.page_url}} + # Only run if the workflow isn't dying and build-documentation was successful and either A) we're releasing or B) we have continuous deployment enabled + if: | + !cancelled() && !failure() && needs.build-documentation.result == 'success' + && (github.event_name == 'release' + || (vars.CONTINUOUS_DOCUMENTATION && github.event_name != 'pull_request') + ) + steps: + # ----------------------------------------------------------------------- Download documentation website components + # It is intentional that we use two independent download steps here as it ensures that workflow images are permitted + # to overwrite any conflicts in the docfx output but not the other way around. + - name: Download documentation website + uses: actions/download-artifact@v4 + with: + name: DocumentationWebsite + + - name: Download workflow images + if: ${{needs.workflow-images.result == 'success'}} + uses: actions/download-artifact@v4 + with: + name: DocumentationWorkflowImages + + # ----------------------------------------------------------------------- Collect artifacts + - name: Upload final documentation website artifact + uses: actions/upload-pages-artifact@v3 + with: + path: '.' + + # ----------------------------------------------------------------------- Publish to GitHub Pages (for forks) + - name: Publish to GitHub Pages (forks) + id: publish + if: github.event_name == 'release' || github.event.repository.fork + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 9e0c786..0000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,51 +0,0 @@ -# Builds and publishes the documentation website to gh-pages branch -name: Build docs - -on: - workflow_dispatch: - -jobs: - build: - runs-on: windows-latest - steps: - - name: Checkout - uses: actions/checkout@v4.1.1 - with: - submodules: true - - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v2 - - - name: Restore NuGet Packages - run: msbuild -t:restore src/Bonsai.Scripting.Python.sln - - - name: Build Solution - run: msbuild src/Bonsai.Scripting.Python.sln /p:Configuration=Release - - - name: Setup .NET Core SDK - uses: actions/setup-dotnet@v4.0.0 - with: - dotnet-version: 7.x - - - name: Setup DocFX - run: dotnet tool restore - - - name: Setup Bonsai - working-directory: .bonsai - run: .\Setup.ps1 - - - name: Build Documentation - working-directory: docs - run: .\build.ps1 - - - name: Checkout gh-pages - uses: actions/checkout@v4.1.1 - with: - ref: gh-pages - path: gh-pages - - name: Publish to github pages - uses: peaceiris/actions-gh-pages@v3.9.3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/_site - force_orphan: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6b16b78..81aec86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ -.vs +.bonsai/Bonsai.exe* +.bonsai/Packages/ +.bonsai/Settings/ +.vs/ +/artifacts/ .venv -bin -obj -Packages -*.exe -*.exe.* *.user *.suo diff --git a/.gitmodules b/.gitmodules index c8ffa76..acf6d39 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "docs/bonsai"] - path = docs/bonsai - url = https://github.com/bonsai-rx/docfx-tools +[submodule "docs/bonsai-docfx"] + path = docs/bonsai-docfx + url = https://github.com/bonsai-rx/docfx-tools.git diff --git a/src/Bonsai.Scripting.Python.sln b/Bonsai.Scripting.Python.sln similarity index 63% rename from src/Bonsai.Scripting.Python.sln rename to Bonsai.Scripting.Python.sln index b8f13eb..6d2e540 100644 --- a/src/Bonsai.Scripting.Python.sln +++ b/Bonsai.Scripting.Python.sln @@ -3,11 +3,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32825.248 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Scripting.Python", "Bonsai.Scripting.Python\Bonsai.Scripting.Python.csproj", "{DE54420F-E2A7-48E5-B96E-7D9CEA1B2CB0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonsai.Scripting.Python", "src\Bonsai.Scripting.Python\Bonsai.Scripting.Python.csproj", "{DE54420F-E2A7-48E5-B96E-7D9CEA1B2CB0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{497840F3-F4DC-4E8A-A000-21E5929B945B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{DEE5DD87-39C1-BF34-B639-A387DCCF972B}" ProjectSection(SolutionItems) = preProject - Directory.Build.props = Directory.Build.props + build\Common.csproj.props = build\Common.csproj.props + build\Common.csproj.targets = build\Common.csproj.targets + build\Common.Tests.csproj.props = build\Common.Tests.csproj.props + build\icon.png = build\icon.png + build\Package.props = build\Package.props + build\Project.csproj.props = build\Project.csproj.props EndProjectSection EndProject Global diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..91586df --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..b7ac253 --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/build/Common.Tests.csproj.props b/build/Common.Tests.csproj.props new file mode 100644 index 0000000..c42b25f --- /dev/null +++ b/build/Common.Tests.csproj.props @@ -0,0 +1,6 @@ + + + false + false + + \ No newline at end of file diff --git a/build/Common.csproj.props b/build/Common.csproj.props new file mode 100644 index 0000000..1099119 --- /dev/null +++ b/build/Common.csproj.props @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + + + + + 12.0 + true + strict + enable + true + + + true + $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../artifacts')) + + + $(ArtifactsPath)/wsl + + + + + true + Dependency;BonsaiLibrary + + icon.png + $(MSBuildThisFileDirectory)icon.png + + LICENSE + $(MSBuildThisFileDirectory)../LICENSE + + README.md + $(MSBuildThisFileDirectory)../docs/README.md + $(MSBuildThisFileDirectory)README.nuget.md + $(MSBuildProjectDirectory)\README.md + $(MSBuildProjectDirectory)\README.nuget.md + + + false + true + snupkg + + + false + true + + + + + $(WarningsAsErrors);NU1701;CS7035 + + + true + + + true + + + $(MSBuildThisFileDirectory)../.bonsai/Bonsai.exe + + + + + + \ No newline at end of file diff --git a/build/Common.csproj.targets b/build/Common.csproj.targets new file mode 100644 index 0000000..07f4916 --- /dev/null +++ b/build/Common.csproj.targets @@ -0,0 +1,46 @@ + + + + + + + + + + + $(TargetName.ToLowerInvariant()) + DotnetTool + + + 1591,1573 + + + + + + + + 0 + 42.42.42-dev$(DevVersion) + + $(CiBuildVersion) + + + + + + + + + + + + \ No newline at end of file diff --git a/build/Package.props b/build/Package.props new file mode 100644 index 0000000..a353a81 --- /dev/null +++ b/build/Package.props @@ -0,0 +1,9 @@ + + + Bonsai Rx Scripting Python Python.NET + https://bonsai-rx.org/python-scripting + + Bonsai Foundation + Copyright © Bonsai Foundation CIC and Contributors + + \ No newline at end of file diff --git a/build/Project.csproj.props b/build/Project.csproj.props new file mode 100644 index 0000000..1d004b4 --- /dev/null +++ b/build/Project.csproj.props @@ -0,0 +1,5 @@ + + + annotations + + \ No newline at end of file diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..50b328bfb57c11901c222ab7d1b5696dd9949134 GIT binary patch literal 4224 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", + "_appLogoPath": "logo.svg", + "_appFaviconPath": "icon.png", "_enableNewTab": true, "_enableSearch": true, - "pdf": false, - "_appFooter": "© 2024 Bonsai Foundation CIC and Contributors. Made with docfx", "_gitContribute": { - "repo": "https://github.com/bonsai-rx/python-scripting", - "branch": "main", "apiSpecFolder": "docs/apidoc" } }, - "markdownEngineName": "markdig", "markdownEngineProperties": { "markdigExtensions": [ "attributes", diff --git a/docs/export-images.ps1 b/docs/export-images.ps1 new file mode 100644 index 0000000..e613b87 --- /dev/null +++ b/docs/export-images.ps1 @@ -0,0 +1,44 @@ +[CmdletBinding()] param ( + [string[]]$LibrarySources, + [bool]$UseGalleryForWorkflowsDirectory=$false, + [bool]$UseGalleryForExamplesDirectory=$true, + [string]$OutputFolder=$null +) +Set-StrictMode -Version 3.0 +$ErrorActionPreference = 'Stop' +$PSNativeCommandUseErrorActionPreference = $true + +if ($OutputFolder) { + $OutputFolder = Join-Path (Get-Location) $OutputFolder +} + +function Process-Workflow-Collection([bool]$useGallery, [string]$workflowPath, [string]$environmentPath) { + $libPath = $LibrarySources + + if ($useGallery) { + $libPath = @() + $galleryPath = Join-Path $environmentPath 'Gallery' + $null = New-Item -ItemType Directory -Path $galleryPath -Force + foreach ($librarySource in $LibrarySources) { + Get-ChildItem -Path $librarySource -Filter *.nupkg | Copy-Item -Destination $galleryPath + } + } + + $bootstrapperPath = (Join-Path $environmentPath 'Bonsai.exe') + .\bonsai-docfx\modules\Export-Image.ps1 -libPath $libPath -workflowPath $workflowPath -bootstrapperPath $bootstrapperPath -outputFolder $OutputFolder -documentationRoot $PSScriptRoot +} + +Push-Location $PSScriptRoot +try { + if (Test-Path -Path 'workflows/') { + Process-Workflow-Collection $UseGalleryForWorkflowsDirectory './workflows' '../.bonsai/' + } + + if (Test-Path -Path 'examples/') { + foreach ($environment in (Get-ChildItem -Path 'examples/' -Filter '.bonsai' -Recurse -FollowSymlink -Directory)) { + Process-Workflow-Collection $UseGalleryForExamplesDirectory ($environment.Parent.FullName) ($environment.FullName) + } + } +} finally { + Pop-Location +} diff --git a/docs/favicon.ico b/docs/favicon.ico deleted file mode 100644 index 5387c2df21da5a4d5118dd88f7c2604f72d47d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113038 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 - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/docs/template/public/main.css b/docs/template/public/main.css index ee56505..13bc806 100644 --- a/docs/template/public/main.css +++ b/docs/template/public/main.css @@ -1 +1 @@ -@import "workflow.css"; \ No newline at end of file +@import "workflow.css"; diff --git a/docs/template/public/main.js b/docs/template/public/main.js index 62c7fa4..9a0c9f7 100644 --- a/docs/template/public/main.js +++ b/docs/template/public/main.js @@ -10,4 +10,4 @@ export default { start: () => { WorkflowContainer.init(); } -} \ No newline at end of file +} diff --git a/docs/toc.yml b/docs/toc.yml index e61b382..3f6d310 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -1,4 +1,4 @@ -- name: Manual +- name: Documentation href: articles/ -- name: Reference - href: api/ +- name: API + href: ../artifacts/docs/api/ diff --git a/docs/workflows/.gitignore b/docs/workflows/.gitignore index af455cb..e2beea4 100644 --- a/docs/workflows/.gitignore +++ b/docs/workflows/.gitignore @@ -1,2 +1,2 @@ *.layout -*.svg \ No newline at end of file +*.svg diff --git a/global.json b/global.json new file mode 100644 index 0000000..989a69c --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "8.0.100", + "rollForward": "latestMinor" + } +} \ No newline at end of file diff --git a/src/.editorconfig b/src/.editorconfig deleted file mode 100644 index d0f6ba9..0000000 --- a/src/.editorconfig +++ /dev/null @@ -1,27 +0,0 @@ -# To learn more about .editorconfig see https://aka.ms/editorconfigdocs -############################### -# Core EditorConfig Options # -############################### -# All files -[*] -indent_style = space - -# XML project files -[*.{csproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] -indent_size = 2 - -# XML config files -[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] -indent_size = 2 - -# Code files -[*.{cs,csx}] -indent_size = 4 -insert_final_newline = true -charset = utf-8-bom -############################### -# .NET Coding Conventions # -############################### -[*.{cs}] -# Organize usings -dotnet_sort_system_directives_first = true diff --git a/src/Bonsai.Scripting.Python/Bonsai.Scripting.Python.csproj b/src/Bonsai.Scripting.Python/Bonsai.Scripting.Python.csproj index 0855a4f..38e145f 100644 --- a/src/Bonsai.Scripting.Python/Bonsai.Scripting.Python.csproj +++ b/src/Bonsai.Scripting.Python/Bonsai.Scripting.Python.csproj @@ -3,10 +3,7 @@ Bonsai - Python Scripting Library Bonsai Scripting Library for interfacing with the Python runtime. - Bonsai Rx Scripting Python Python.NET net472;netstandard2.0 - 0.2.1 - 8.0 @@ -14,4 +11,4 @@ - + \ No newline at end of file diff --git a/src/Bonsai.Scripting.Python/Properties/launchSettings.json b/src/Bonsai.Scripting.Python/Properties/launchSettings.json index 93c2d6b..4af4f46 100644 --- a/src/Bonsai.Scripting.Python/Properties/launchSettings.json +++ b/src/Bonsai.Scripting.Python/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Bonsai": { "commandName": "Executable", - "executablePath": "$(SolutionDir)..\\.bonsai\\Bonsai.exe", + "executablePath": "$(BonsaiExecutablePath)", "commandLineArgs": "--lib:\"$(TargetDir).\"", "nativeDebugging": true } diff --git a/src/Directory.Build.props b/src/Directory.Build.props deleted file mode 100644 index 6007f57..0000000 --- a/src/Directory.Build.props +++ /dev/null @@ -1,24 +0,0 @@ - - - - Bonsai - Copyright © Bonsai Foundation CIC and Contributors 2023 - snupkg - true - ..\bin\$(Configuration) - README.md - https://bonsai-rx.org/python-scripting - https://github.com/bonsai-rx/python-scripting/blob/main/LICENSE - https://bonsai-rx.org/assets/images/bonsai.png - true - true - https://github.com/bonsai-rx/python-scripting.git - git - - strict - - - - - - \ No newline at end of file diff --git a/src/NuGet.config b/src/NuGet.config deleted file mode 100644 index 43a0574..0000000 --- a/src/NuGet.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file