diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 54a9d69bdc..655ffe289e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -33,117 +33,18 @@ body: id: _version attributes: label: Version - description: What version are you running? Look to OpenPype Tray + description: What version are you running? Look to AYON Tray options: - - 3.18.7-nightly.1 - - 3.18.6 - - 3.18.6-nightly.2 - - 3.18.6-nightly.1 - - 3.18.5 - - 3.18.5-nightly.3 - - 3.18.5-nightly.2 - - 3.18.5-nightly.1 - - 3.18.4 - - 3.18.4-nightly.1 - - 3.18.3 - - 3.18.3-nightly.2 - - 3.18.3-nightly.1 - - 3.18.2 - - 3.18.2-nightly.6 - - 3.18.2-nightly.5 - - 3.18.2-nightly.4 - - 3.18.2-nightly.3 - - 3.18.2-nightly.2 - - 3.18.2-nightly.1 - - 3.18.1 - - 3.18.1-nightly.1 - - 3.18.0 - - 3.17.7 - - 3.17.7-nightly.7 - - 3.17.7-nightly.6 - - 3.17.7-nightly.5 - - 3.17.7-nightly.4 - - 3.17.7-nightly.3 - - 3.17.7-nightly.2 - - 3.17.7-nightly.1 - - 3.17.6 - - 3.17.6-nightly.3 - - 3.17.6-nightly.2 - - 3.17.6-nightly.1 - - 3.17.5 - - 3.17.5-nightly.3 - - 3.17.5-nightly.2 - - 3.17.5-nightly.1 - - 3.17.4 - - 3.17.4-nightly.2 - - 3.17.4-nightly.1 - - 3.17.3 - - 3.17.3-nightly.2 - - 3.17.3-nightly.1 - - 3.17.2 - - 3.17.2-nightly.4 - - 3.17.2-nightly.3 - - 3.17.2-nightly.2 - - 3.17.2-nightly.1 - - 3.17.1 - - 3.17.1-nightly.3 - - 3.17.1-nightly.2 - - 3.17.1-nightly.1 - - 3.17.0 - - 3.16.7 - - 3.16.7-nightly.2 - - 3.16.7-nightly.1 - - 3.16.6 - - 3.16.6-nightly.1 - - 3.16.5 - - 3.16.5-nightly.5 - - 3.16.5-nightly.4 - - 3.16.5-nightly.3 - - 3.16.5-nightly.2 - - 3.16.5-nightly.1 - - 3.16.4 - - 3.16.4-nightly.3 - - 3.16.4-nightly.2 - - 3.16.4-nightly.1 - - 3.16.3 - - 3.16.3-nightly.5 - - 3.16.3-nightly.4 - - 3.16.3-nightly.3 - - 3.16.3-nightly.2 - - 3.16.3-nightly.1 - - 3.16.2 - - 3.16.2-nightly.2 - - 3.16.2-nightly.1 - - 3.16.1 - - 3.16.0 - - 3.16.0-nightly.2 - - 3.16.0-nightly.1 - - 3.15.12 - - 3.15.12-nightly.4 - - 3.15.12-nightly.3 - - 3.15.12-nightly.2 - - 3.15.12-nightly.1 - - 3.15.11 - - 3.15.11-nightly.5 - - 3.15.11-nightly.4 - - 3.15.11-nightly.3 - - 3.15.11-nightly.2 - - 3.15.11-nightly.1 - - 3.15.10 - - 3.15.10-nightly.2 - - 3.15.10-nightly.1 - - 3.15.9 - - 3.15.9-nightly.2 - - 3.15.9-nightly.1 + - 1.0.0 validations: required: true - type: dropdown validations: required: true attributes: - label: What platform you are running OpenPype on? + label: What platform you are running on? description: | - Please specify the operating systems you are running OpenPype with. + Please specify the operating systems you are using. multiple: true options: - Windows diff --git a/.github/pr-glob-labeler.yml b/.github/pr-glob-labeler.yml deleted file mode 100644 index 286e7768b5..0000000000 --- a/.github/pr-glob-labeler.yml +++ /dev/null @@ -1,102 +0,0 @@ -# Add type: unittest label if any changes in tests folders -'type: unittest': -- '*/*tests*/**/*' - -# any changes in documentation structure -'type: documentation': -- '*/**/*website*/**/*' -- '*/**/*docs*/**/*' - -# hosts triage -'host: Nuke': -- '*/**/*nuke*' -- '*/**/*nuke*/**/*' - -'host: Photoshop': -- '*/**/*photoshop*' -- '*/**/*photoshop*/**/*' - -'host: Harmony': -- '*/**/*harmony*' -- '*/**/*harmony*/**/*' - -'host: UE': -- '*/**/*unreal*' -- '*/**/*unreal*/**/*' - -'host: Houdini': -- '*/**/*houdini*' -- '*/**/*houdini*/**/*' - -'host: Maya': -- '*/**/*maya*' -- '*/**/*maya*/**/*' - -'host: Resolve': -- '*/**/*resolve*' -- '*/**/*resolve*/**/*' - -'host: Blender': -- '*/**/*blender*' -- '*/**/*blender*/**/*' - -'host: Hiero': -- '*/**/*hiero*' -- '*/**/*hiero*/**/*' - -'host: Fusion': -- '*/**/*fusion*' -- '*/**/*fusion*/**/*' - -'host: Flame': -- '*/**/*flame*' -- '*/**/*flame*/**/*' - -'host: TrayPublisher': -- '*/**/*traypublisher*' -- '*/**/*traypublisher*/**/*' - -'host: 3dsmax': -- '*/**/*max*' -- '*/**/*max*/**/*' - -'host: TV Paint': -- '*/**/*tvpaint*' -- '*/**/*tvpaint*/**/*' - -'host: CelAction': -- '*/**/*celaction*' -- '*/**/*celaction*/**/*' - -'host: After Effects': -- '*/**/*aftereffects*' -- '*/**/*aftereffects*/**/*' - -'host: Substance Painter': -- '*/**/*substancepainter*' -- '*/**/*substancepainter*/**/*' - -# modules triage -'module: Deadline': -- '*/**/*deadline*' -- '*/**/*deadline*/**/*' - -'module: RoyalRender': -- '*/**/*royalrender*' -- '*/**/*royalrender*/**/*' - -'module: Sitesync': -- '*/**/*sync_server*' -- '*/**/*sync_server*/**/*' - -'module: Ftrack': -- '*/**/*ftrack*' -- '*/**/*ftrack*/**/*' - -'module: Shotgrid': -- '*/**/*shotgrid*' -- '*/**/*shotgrid*/**/*' - -'module: Kitsu': -- '*/**/*kitsu*' -- '*/**/*kitsu*/**/*' diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml deleted file mode 100644 index f2e7d1058f..0000000000 --- a/.github/workflows/documentation.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: ๐Ÿ“œ Documentation - -on: - pull_request: - branches: [develop] - types: [review_requested, ready_for_review] - paths: - - 'website/**' - push: - branches: [main] - paths: - - 'website/**' - workflow_dispatch: - -jobs: - check-build: - if: github.event_name != 'push' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: 14.x - cache: yarn - - name: Test Build - run: | - cd website - if [ -e yarn.lock ]; then - yarn install --frozen-lockfile - elif [ -e package-lock.json ]; then - npm ci - else - npm i - fi - npm run build - deploy-website: - if: github.event_name != 'pull_request' - runs-on: ubuntu-latest - steps: - - name: ๐Ÿšš Get latest code - uses: actions/checkout@v2 - - - uses: actions/setup-node@v1 - with: - node-version: 14.x - cache: yarn - - name: ๐Ÿ”จ Build - run: | - cd website - if [ -e yarn.lock ]; then - yarn install --frozen-lockfile - elif [ -e package-lock.json ]; then - npm ci - else - npm i - fi - npm run build - - - name: ๐Ÿ“‚ Sync files - uses: SamKirkland/FTP-Deploy-Action@4.0.0 - with: - server: ftp.openpype.io - username: ${{ secrets.ftp_user }} - password: ${{ secrets.ftp_password }} - local-dir: ./website/build/ \ No newline at end of file diff --git a/.github/workflows/milestone_assign.yml b/.github/workflows/milestone_assign.yml deleted file mode 100644 index df4625c225..0000000000 --- a/.github/workflows/milestone_assign.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: ๐Ÿ‘‰๐Ÿป Milestone - assign to PRs - -on: - pull_request_target: - types: [closed] - -jobs: - run_if_release: - if: startsWith(github.base_ref, 'release/') - runs-on: ubuntu-latest - steps: - - name: 'Assign Milestone [next-minor]' - if: github.event.pull_request.milestone == null - uses: zoispag/action-assign-milestone@v1 - with: - repo-token: "${{ secrets.YNPUT_BOT_TOKEN }}" - milestone: 'next-minor' - - run_if_develop: - if: ${{ github.base_ref == 'develop' }} - runs-on: ubuntu-latest - steps: - - name: 'Assign Milestone [next-patch]' - if: github.event.pull_request.milestone == null - uses: zoispag/action-assign-milestone@v1 - with: - repo-token: "${{ secrets.YNPUT_BOT_TOKEN }}" - milestone: 'next-patch' diff --git a/.github/workflows/milestone_create.yml b/.github/workflows/milestone_create.yml deleted file mode 100644 index 437c9e31b4..0000000000 --- a/.github/workflows/milestone_create.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: โž• Milestone - create default - -on: - milestone: - types: [closed, edited] - -jobs: - generate-next-patch: - runs-on: ubuntu-latest - steps: - - name: 'Get Milestones' - uses: "WyriHaximus/github-action-get-milestones@master" - id: milestones - env: - GITHUB_TOKEN: "${{ secrets.YNPUT_BOT_TOKEN }}" - - - run: printf "name=number::%s" $(printenv MILESTONES | jq --arg MILESTONE $(printenv MILESTONE) '.[] | select(.title == $MILESTONE) | .number') - id: querymilestone - env: - MILESTONES: ${{ steps.milestones.outputs.milestones }} - MILESTONE: "next-patch" - - - name: Read output - run: | - echo "${{ steps.querymilestone.outputs.number }}" - - - name: 'Create `next-patch` milestone' - if: steps.querymilestone.outputs.number == '' - id: createmilestone - uses: "WyriHaximus/github-action-create-milestone@v1" - with: - title: 'next-patch' - env: - GITHUB_TOKEN: "${{ secrets.YNPUT_BOT_TOKEN }}" - - generate-next-minor: - runs-on: ubuntu-latest - steps: - - name: 'Get Milestones' - uses: "WyriHaximus/github-action-get-milestones@master" - id: milestones - env: - GITHUB_TOKEN: "${{ secrets.YNPUT_BOT_TOKEN }}" - - - run: printf "name=number::%s" $(printenv MILESTONES | jq --arg MILESTONE $(printenv MILESTONE) '.[] | select(.title == $MILESTONE) | .number') - id: querymilestone - env: - MILESTONES: ${{ steps.milestones.outputs.milestones }} - MILESTONE: "next-minor" - - - name: Read output - run: | - echo "${{ steps.querymilestone.outputs.number }}" - - - name: 'Create `next-minor` milestone' - if: steps.querymilestone.outputs.number == '' - id: createmilestone - uses: "WyriHaximus/github-action-create-milestone@v1" - with: - title: 'next-minor' - env: - GITHUB_TOKEN: "${{ secrets.YNPUT_BOT_TOKEN }}" diff --git a/.github/workflows/miletone_release_trigger.yml b/.github/workflows/miletone_release_trigger.yml deleted file mode 100644 index d755f7eb9f..0000000000 --- a/.github/workflows/miletone_release_trigger.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: ๐Ÿšฉ Milestone Release [trigger] - -on: - workflow_dispatch: - inputs: - milestone: - required: true - milestone: - types: closed - - -jobs: - milestone-title: - runs-on: ubuntu-latest - outputs: - milestone: ${{ steps.milestoneTitle.outputs.value }} - steps: - - name: Switch input milestone - uses: haya14busa/action-cond@v1 - id: milestoneTitle - with: - cond: ${{ inputs.milestone == '' }} - if_true: ${{ github.event.milestone.title }} - if_false: ${{ inputs.milestone }} - - name: Print resulted milestone - run: | - echo "${{ steps.milestoneTitle.outputs.value }}" - - call-ci-tools-milestone-release: - needs: milestone-title - uses: ynput/ci-tools/.github/workflows/milestone_release_ref.yml@main - with: - milestone: ${{ needs.milestone-title.outputs.milestone }} - repo-owner: ${{ github.event.repository.owner.login }} - repo-name: ${{ github.event.repository.name }} - version-py-path: "./openpype/version.py" - pyproject-path: "./pyproject.toml" - secrets: - token: ${{ secrets.YNPUT_BOT_TOKEN }} - user_email: ${{ secrets.CI_EMAIL }} - user_name: ${{ secrets.CI_USER }} - cu_api_key: ${{ secrets.CLICKUP_API_KEY }} - cu_team_id: ${{ secrets.CLICKUP_TEAM_ID }} - cu_field_id: ${{ secrets.CLICKUP_RELEASE_FIELD_ID }} diff --git a/.github/workflows/nightly_merge.yml b/.github/workflows/nightly_merge.yml deleted file mode 100644 index 3f8c75dce3..0000000000 --- a/.github/workflows/nightly_merge.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: ๐Ÿ”€ Dev -> Main - -on: - schedule: - - cron: '21 3 * * 3,6' - workflow_dispatch: - -jobs: - develop-to-main: - - runs-on: ubuntu-latest - - steps: - - name: ๐Ÿš› Checkout Code - uses: actions/checkout@v2 - - - name: ๐Ÿ”จ Merge develop to main - uses: everlytic/branch-merge@1.1.0 - with: - github_token: ${{ secrets.YNPUT_BOT_TOKEN }} - source_ref: 'develop' - target_branch: 'main' - commit_message_template: '[Automated] Merged {source_ref} into {target_branch}' - - - name: Invoke pre-release workflow - uses: benc-uk/workflow-dispatch@v1 - with: - workflow: prerelease.yml - token: ${{ secrets.YNPUT_BOT_TOKEN }} diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml deleted file mode 100644 index 8c5c733c08..0000000000 --- a/.github/workflows/prerelease.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: โณ Nightly Prerelease - -on: - workflow_dispatch: - - -jobs: - create_nightly: - runs-on: ubuntu-latest - - steps: - - name: ๐Ÿš› Checkout Code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - name: Install Python requirements - run: pip install gitpython semver PyGithub - - - name: ๐Ÿ”Ž Determine next version type - id: version_type - run: | - TYPE=$(python ./tools/ci_tools.py --bump --github_token ${{ secrets.YNPUT_BOT_TOKEN }}) - echo "type=${TYPE}" >> $GITHUB_OUTPUT - - - name: ๐Ÿ’‰ Inject new version into files - id: version - if: steps.version_type.outputs.type != 'skip' - run: | - NEW_VERSION_TAG=$(python ./tools/ci_tools.py --nightly --github_token ${{ secrets.YNPUT_BOT_TOKEN }}) - echo "next_tag=${NEW_VERSION_TAG}" >> $GITHUB_OUTPUT - - - name: ๐Ÿ’พ Commit and Tag - id: git_commit - if: steps.version_type.outputs.type != 'skip' - run: | - git config user.email ${{ secrets.CI_EMAIL }} - git config user.name ${{ secrets.CI_USER }} - git checkout main - git pull - git add . - git commit -m "[Automated] Bump version" - tag_name="CI/${{ steps.version.outputs.next_tag }}" - echo $tag_name - git tag -a $tag_name -m "nightly build" - - - name: Push to protected main branch - uses: CasperWA/push-protected@v2.10.0 - with: - token: ${{ secrets.YNPUT_BOT_TOKEN }} - branch: main - tags: true - unprotect_reviews: true - - - name: ๐Ÿ”จ Merge main back to develop - uses: everlytic/branch-merge@1.1.0 - if: steps.version_type.outputs.type != 'skip' - with: - github_token: ${{ secrets.YNPUT_BOT_TOKEN }} - source_ref: 'main' - target_branch: 'develop' - commit_message_template: '[Automated] Merged {source_ref} into {target_branch}' - - - name: Invoke Update bug report workflow - uses: benc-uk/workflow-dispatch@v1 - with: - workflow: update_bug_report.yml - token: ${{ secrets.YNPUT_BOT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/test_build.yml b/.github/workflows/test_build.yml deleted file mode 100644 index fd8e0e642d..0000000000 --- a/.github/workflows/test_build.yml +++ /dev/null @@ -1,66 +0,0 @@ -# This workflow will upload a Python Package using Twine when a release is created -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: ๐Ÿ—๏ธ Test Build - -on: - pull_request: - branches: [develop] - types: [review_requested, ready_for_review] - paths-ignore: - - 'docs/**' - - 'website/**' - - 'vendor/**' - -jobs: - Windows-latest: - - runs-on: windows-latest - strategy: - matrix: - python-version: [3.9] - - steps: - - name: ๐Ÿš› Checkout Code - uses: actions/checkout@v2 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - - name: ๐Ÿงต Install Requirements - shell: pwsh - run: | - ./tools/create_env.ps1 - - - name: ๐Ÿ”จ Build - shell: pwsh - run: | - $env:SKIP_THIRD_PARTY_VALIDATION="1" - ./tools/build.ps1 - - Ubuntu-latest: - - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.9] - - steps: - - name: ๐Ÿš› Checkout Code - uses: actions/checkout@v2 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - - name: ๐Ÿงต Install Requirements - run: | - ./tools/create_env.sh - - - name: ๐Ÿ”จ Build - run: | - export SKIP_THIRD_PARTY_VALIDATION="1" - ./tools/build.sh diff --git a/.gitmodules b/.gitmodules index 4de92471f7..ddf5618adb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,10 +1,3 @@ -[submodule "tools/modules/powershell/BurntToast"] - path = tools/modules/powershell/BurntToast - url = https://github.com/Windos/BurntToast.git - -[submodule "tools/modules/powershell/PSWriteColor"] - path = tools/modules/powershell/PSWriteColor - url = https://github.com/EvotecIT/PSWriteColor.git [submodule "openpype/hosts/unreal/integration"] path = openpype/hosts/unreal/integration url = https://github.com/ynput/ayon-unreal-plugin.git diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md deleted file mode 100644 index 912780d803..0000000000 --- a/ARCHITECTURE.md +++ /dev/null @@ -1,77 +0,0 @@ -# Architecture - -OpenPype is a monolithic Python project that bundles several parts, this document will try to give a birds eye overview of the project and, to a certain degree, each of the sub-projects. -The current file structure looks like this: - -``` -. -โ”œโ”€โ”€ common - Code in this folder is backend portion of Addon distribution logic for v4 server. -โ”œโ”€โ”€ docs - Documentation of the source code. -โ”œโ”€โ”€ igniter - The OpenPype bootstrapper, deals with running version resolution and setting up the connection to the mongodb. -โ”œโ”€โ”€ openpype - The actual OpenPype core package. -โ”œโ”€โ”€ schema - Collection of JSON files describing schematics of objects. This follows Avalon's convention. -โ”œโ”€โ”€ tests - Integration and unit tests. -โ”œโ”€โ”€ tools - Conveninece scripts to perform common actions (in both bash and ps1). -โ”œโ”€โ”€ vendor - When using the igniter, it deploys third party tools in here, such as ffmpeg. -โ””โ”€โ”€ website - Source files for https://openpype.io/ which is Docusaursus (https://docusaurus.io/). -``` - -The core functionality of the pipeline can be found in `igniter` and `openpype`, which in turn rely on the `schema` files, whenever you build (or download a pre-built) version of OpenPype, these two are bundled in there, and `Igniter` is the entry point. - - -## Igniter - -It's the setup and update tool for OpenPype, unless you want to package `openpype` separately and deal with all the config manually, this will most likely be your entry point. - -``` -igniter/ -โ”œโ”€โ”€ bootstrap_repos.py - Module that will find or install OpenPype versions in the system. -โ”œโ”€โ”€ __init__.py - Igniter entry point. -โ”œโ”€โ”€ install_dialog.py- Show dialog for choosing central pype repository. -โ”œโ”€โ”€ install_thread.py - Threading helpers for the install process. -โ”œโ”€โ”€ __main__.py - Like `__init__.py` ? -โ”œโ”€โ”€ message_dialog.py - Qt Dialog with a message and "Ok" button. -โ”œโ”€โ”€ nice_progress_bar.py - Fancy Qt progress bar. -โ”œโ”€โ”€ splash.txt - ASCII art for the terminal installer. -โ”œโ”€โ”€ stylesheet.css - Installer Qt styles. -โ”œโ”€โ”€ terminal_splash.py - Terminal installer animation, relies in `splash.txt`. -โ”œโ”€โ”€ tools.py - Collection of methods that don't fit in other modules. -โ”œโ”€โ”€ update_thread.py - Threading helper to update existing OpenPype installs. -โ”œโ”€โ”€ update_window.py - Qt UI to update OpenPype installs. -โ”œโ”€โ”€ user_settings.py - Interface for the OpenPype user settings. -โ””โ”€โ”€ version.py - Igniter's version number. -``` - -## OpenPype - -This is the main package of the OpenPype logic, it could be loosely described as a combination of [Avalon](https://getavalon.github.io), [Pyblish](https://pyblish.com/) and glue around those with custom OpenPype only elements, things are in progress of being moved around to better prepare for V4, which will be released under a new name AYON. - -``` -openpype/ -โ”œโ”€โ”€ client - Interface for the MongoDB. -โ”œโ”€โ”€ hooks - Hooks to be executed on certain OpenPype Applications defined in `openpype.lib.applications`. -โ”œโ”€โ”€ host - Base class for the different hosts. -โ”œโ”€โ”€ hosts - Integration with the different DCCs (hosts) using the `host` base class. -โ”œโ”€โ”€ lib - Libraries that stitch together the package, some have been moved into other parts. -โ”œโ”€โ”€ modules - OpenPype modules should contain separated logic of specific kind of implementation, such as Ftrack connection and its python API. -โ”œโ”€โ”€ pipeline - Core of the OpenPype pipeline, handles creation of data, publishing, etc. -โ”œโ”€โ”€ plugins - Global/core plugins for loader and publisher tool. -โ”œโ”€โ”€ resources - Icons, fonts, etc. -โ”œโ”€โ”€ scripts - Loose scipts that get run by tools/publishers. -โ”œโ”€โ”€ settings - OpenPype settings interface. -โ”œโ”€โ”€ style - Qt styling. -โ”œโ”€โ”€ tests - Unit tests. -โ”œโ”€โ”€ tools - Core tools, check out https://openpype.io/docs/artist_tools. -โ”œโ”€โ”€ vendor - Vendoring of needed required Python packes. -โ”œโ”€โ”€ widgets - Common re-usable Qt Widgets. -โ”œโ”€โ”€ action.py - LEGACY: Lives now in `openpype.pipeline.publish.action` Pyblish actions. -โ”œโ”€โ”€ cli.py - Command line interface, leverages `click`. -โ”œโ”€โ”€ __init__.py - Sets two constants. -โ”œโ”€โ”€ __main__.py - Entry point, calls the `cli.py` -โ”œโ”€โ”€ plugin.py - Pyblish plugins. -โ”œโ”€โ”€ pype_commands.py - Implementation of OpenPype commands. -โ””โ”€โ”€ version.py - Current version number. -``` - - - diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 009150ae7d..0000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,18614 +0,0 @@ -# Changelog - - -## [3.18.6](https://github.com/ynput/OpenPype/tree/3.18.6) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.5...3.18.6) - -### **๐Ÿš€ Enhancements** - - -
-AYON: Use `SettingsField` from ayon server #6173 - -This is preparation for new version of pydantic which will require to customize the field class for AYON purposes as raw pydantic Field could not be used. - - -___ - -
- - -
-Nuke: Expose write knobs - OP-7592 #6137 - -This PR adds `exposed_knobs` to the creator plugins settings at `ayon+settings://nuke/create/CreateWriteRender/exposed_knobs`.When exposed knobs will be linked from the write node to the outside publish group, for users to adjust. - - -___ - -
- - -
-AYON: Remove kitsu addon #6172 - -Removed kitsu addon from server addons because already has own repository. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Fusion: provide better logging for validate saver crash due type error #6082 - -Handles reported issue for `NoneType` error thrown in conversion `int(tool["Comments"][frame])`. It is most likely happening when saver node has no input connections.There is a validator for that, but it might be not obvious, that this error is caused by missing input connections and it has been already reported by `"Validate Saver Has Input"`. - - -___ - -
- - -
-Workfile Template Builder: Use correct variable in create placeholder #6141 - -Use correct variable where failed instances are stored for validation. - - -___ - -
- - -
-ExtractOIIOTranscode: Missing product_names to subsets conversion #6159 - -The `Product Names` filtering should be fixed with this. - - -___ - -
- - -
-Blender: Fix missing animation data when updating blend assets #6165 - -Fix missing animation data when updating blend assets. - - -___ - -
- - -
-TrayPublisher: Pre-fill of version works in AYON #6180 - -Use `folderPath` instead of `asset` in AYON mode to calculate next available version. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Chore: remove Muster #6085 - -Muster isn't maintained for a long time and it wasn't working anyway. This is removing related code from the code base. If there is renewed interest in Muster, it needs to be re-implemented in modern AYON compatible way. - - -___ - -
- -### **Merged pull requests** - - -
-Maya: change label in the render settings to be more readable #6134 - -AYON replacement for #5713. - - -___ - -
- - - - -## [3.18.5](https://github.com/ynput/OpenPype/tree/3.18.5) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.4...3.18.5) - -### **๐Ÿš€ Enhancements** - - -
-Chore: Add addons dir only if exists #6140 - -Do not add addons directory path for addons discovery if does not exists. - - -___ - -
- - -
-Hiero: Effect Categories - OP-7397 #6143 - -This PR introduces `Effect Categories` for the Hiero settings. This allows studios to split effect stacks into meaningful subsets. - - -___ - -
- - -
-Nuke: Render Workfile Attributes #6146 - -`Workfile Dependency` default value can now be controlled from project settings.`Use Published Workfile` makes using published workfiles for rendering optional. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Attributes are locked after publishing if they are locked in Camera Family #6073 - -This PR is to make sure unlock attributes only during the bake context, make sure attributes are relocked after to preserve the lock state of the original node being baked. - - -___ - -
- - -
-Missing nuke family Windows arguments #6131 - -Default Windows arguments for launching the Nuke family was missing. - - -___ - -
- - -
-AYON: Fix the bug on the limit group not being set correctly in Maya Deadline Setting #6139 - -This PR is to bug-fix the limit groups from maya deadline settings errored out when the user tries to edit the setting. - - -___ - -
- - -
-Chore: Transcoding extensions add missing '.tif' extension #6142 - -Image extensions in transcoding helper was missing `.tif` extension and had `.tiff` twice. - - -___ - -
- - -
-Blender: Use the new API for override context #6145 - -Blender 4.0 disabled the old API to override context. This API updates the code to use the new API. - - -___ - -
- - -
-BugFix: Include Model in FBX Loader in Houdini #6150 - -A quick bugfig where we can't load fbx exported from blender. The bug was reported here. - - -___ - -
- - -
-Blender: Restore actions to objects after update #6153 - -Restore the actions assigned to objects after updating assets from blend files. - - -___ - -
- - -
-Chore: Collect template data with hierarchy context #6154 - -Fixed queue loop where is used wrong variable to pop items from queue. - - -___ - -
- - -
-OP-6382 - Thumbnail Integration Problem #6156 - -This ticket alerted to 3 different cases of integration issues; -- [x] Using the Tray Publisher with the same image format (extension) for representation and review representation. -- [x] Clash on publish file path from output definitions in `ExtractOIIOTranscode`. -- [x] Clash on publish file from thumbnail in `ExtractThumbnail`There might be an issue with this fix, if a studio does not use the `{output}` token in their `render` anatomy template. But thinking if they have customized it, they will be responsible to maintain these edge cases. - - -___ - -
- - -
-Max: Bugfix saving camera scene errored out when creating render instance with multi-camera option turned off #6163 - -This PR is to make sure the integrator of saving camera scene turned off and the render submitted successfully when multi-camera options being turned off in 3dsmax - - -___ - -
- - -
-Chore: Fix duplicated project name on create project structure #6166 - -Small fix in project folders. It is not used same variable name to change values which breaks values on any next loop. - - -___ - -
- -### **Merged pull requests** - - -
-Maya: Remove duplicate plugin #6157 - -The two plugins below are doing the same work, so we can remove the one focused solely on lookdev.https://github.com/ynput/OpenPype/blob/develop/openpype/hosts/maya/plugins/publish/validate_look_members_unique.pyhttps://github.com/ynput/OpenPype/blob/develop/openpype/hosts/maya/plugins/publish/validate_node_ids_unique.py - - -___ - -
- - -
-Publish report viewer: Report items sorting #6092 - -Proposal of items sorting in Publish report viewer tool. Items are sorted by report creation time. Creation time is also added to publish report data when saved from publisher tool. - - -___ - -
- - -
-Maya: Extended error message #6161 - -Added more details to message - - -___ - -
- - -
-Fusion: Added settings for Fusion creators to legacy OP #6162 - -Added missing OP variant of setting for new Fusion creator. - - -___ - -
- - - - -## [3.18.4](https://github.com/ynput/OpenPype/tree/3.18.4) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.3...3.18.4) - -### **๐Ÿš€ Enhancements** - - -
-multiple render camera supports for 3dsmax #5124 - -Supports for rendering with multiple cameras in 3dsmax -- [x] Add Batch Render Layers functions -- [x] Rewrite lib.rendersetting and lib.renderproduct -- [x] Add multi-camera options in creator. -- [x] Collector with batch render-layer when multi-camera enabled. -- [x] Add instance plugin for saving scene files with different cameras respectively by using subprocess -- [x] Refactor submit_max_deadline -- [x] Check with metadata.json in submit publish job - - -___ - -
- - -
-Fusion: new creator for image product type #6057 - -In many DCC `render` product type is expected to be sequence of files. This PR adds new explicit creator for `image` product type which is focused on single frame image. Workflows for both product types might be a bit different, this gives artists more granularity to choose better workflow. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Account and ignore free image planes. #5993 - -Free image planes do not have the `->` path separator, so we need to account for that. - - -___ - -
- - -
-Blender: Fix long names for instances #6070 - -Changed naming for instances to use only final part of the `folderPath`. - - -___ - -
- - -
-Traypublisher & Chore: Instance version on follow workfile version #6117 - -If `follow_workfile_version` is enabled but context does not have filled workfile version, a version on instance is used instead. - - -___ - -
- - -
-Substance Painter: Thumbnail errors with PBR Texture Set #6127 - -When publishing with PBR Metallic Roughness as Output Template, Emissive Map errors out because of the missing channel in the material and the map can't be generated in Substance Painter. This PR is to make sure `imagestance.data["publish"] = False` so that the related "empty" texture instance would be skipped to generate the output. - - -___ - -
- - -
-Transcoding: Fix reading image sequences through oiiotool #6129 - -When transcoding image sequences, the second image onwards includes the invalid xml line of `Reading path/to/file.exr` of the oiiotool output.This is most likely not the best solution, but it fixes the issue and illustrates the problem.Error: -``` -ERROR:pyblish.plugin:Traceback (most recent call last): - File "C:\Users\tokejepsen\AppData\Local\Ynput\AYON\dependency_packages\ayon_2310271602_windows.zip\dependencies\pyblish\plugin.py", line 527, in __explicit_process - runner(*args) - File "C:\Users\tokejepsen\OpenPype\openpype\plugins\publish\extract_color_transcode.py", line 152, in process - File "C:\Users\tokejepsen\OpenPype\openpype\lib\transcoding.py", line 1136, in convert_colorspace - input_info = get_oiio_info_for_input(input_path, logger=logger) - File "C:\Users\tokejepsen\OpenPype\openpype\lib\transcoding.py", line 124, in get_oiio_info_for_input - output.append(parse_oiio_xml_output(xml_text, logger=logger)) - File "C:\Users\tokejepsen\OpenPype\openpype\lib\transcoding.py", line 276, in parse_oiio_xml_output - tree = xml.etree.ElementTree.fromstring(xml_string) - File "xml\etree\ElementTree.py", line 1347, in XML -xml.etree.ElementTree.ParseError: syntax error: line 1, column 0 -Traceback (most recent call last): - File "C:\Users\tokejepsen\AppData\Local\Ynput\AYON\dependency_packages\ayon_2310271602_windows.zip\dependencies\pyblish\plugin.py", line 527, in __explicit_process - runner(*args) - File "", line 152, in process - File "C:\Users\tokejepsen\OpenPype\openpype\lib\transcoding.py", line 1136, in convert_colorspace - input_info = get_oiio_info_for_input(input_path, logger=logger) - File "C:\Users\tokejepsen\OpenPype\openpype\lib\transcoding.py", line 124, in get_oiio_info_for_input - output.append(parse_oiio_xml_output(xml_text, logger=logger)) - File "C:\Users\tokejepsen\OpenPype\openpype\lib\transcoding.py", line 276, in parse_oiio_xml_output - tree = xml.etree.ElementTree.fromstring(xml_string) - File "xml\etree\ElementTree.py", line 1347, in XML -xml.etree.ElementTree.ParseError: syntax error: line 1, column 0 -``` - - - -___ - -
- - -
-AYON: Remove 'IntegrateHeroVersion' conversion #6130 - -Remove settings conversion for `IntegrateHeroVersion`. - - -___ - -
- - -
-Chore tools: Make sure style object is not garbage collected #6136 - -Minor fix in tool utils to make sure style C++ object is not garbage collected when not stored into variable. - - -___ - -
- - - - -## [3.18.3](https://github.com/ynput/OpenPype/tree/3.18.3) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.2...3.18.3) - -### **๐Ÿš€ Enhancements** - - -
-Maya: Apply initial viewport shader for Redshift Proxy after loading #6102 - -When the published redshift proxy is being loaded, the shader of the proxy is missing. This is different from the manual load through creating redshift proxy for files. This PR is to assign the default lambert to the redshift proxy, which replicates the same approach when the user manually loads the proxy with filepath. - - -___ - -
- - -
-General: We should keep current subset version when we switch only the representation type #4629 - -When we switch only the representation type of subsets, we should not get the representation from the last version of the subset. - - -___ - -
- - -
-Houdini: Add loader for redshift proxy family #5948 - -Loader for Redshift Proxy in Houdini (Thanks for @BigRoy contribution) - - -___ - -
- - -
-AfterEffects: exposing Deadline pools fields in Publisher UI #6079 - -Deadline pools might be adhoc set by an artist during publishing. AfterEffects implementation wasn't providing this. - - -___ - -
- - -
-Chore: Event callbacks can have order #6080 - -Event callbacks can have order in which are called, and fixed issue with getting function name and file when using `partial` function as callback. - - -___ - -
- - -
-AYON: OpenPype addon defines runtime dependencies #6095 - -Moved runtime dependencies from ayon-launcher to openpype addon. - - -___ - -
- - -
-Max: User's setting for scene unit scale #6097 - -Options for users to set the default scene unit scale for their scenes.AYONLegacy OP - - -___ - -
- - -
-Chore: Remove deprecated templates profiles #6103 - -Remove deprecated usage of template profiles from settings. - - -___ - -
- - -
-Publisher: Window is not always on top #6107 - -Goal of this PR is to avoid using `WindowStaysOnTopHint` which causes issues, especially in cases when DCC shows a popup dialog that is behind the window, in that case both Publisher and DCC are frozen and there is nothing to do. - - -___ - -
- - -
-Houdini: add split job export support for Redshift ROP #6108 - -This is adding support for splitting of export and render jobs for Redshift as is already implemented for Vray, Mantra and Arnold. - - -___ - -
- - -
-Fusion: automatic installation of PySide2 #6111 - -This PR adds hook which tries to check if PySide2 is installed in Python used by Fusion and if not, it tries to install it automatically. - - -___ - -
- - -
-AYON: OpenPype addon dependencies #6113 - -Added `click` and `six` to requirements of openpype addon, and removed `Qt.py` requirement, which is not used anywhere. - - -___ - -
- - -
-Chore: Thumbnail representation has 'outputName' #6114 - -Add thumbnail output name to thumbnail representation to prevent same output filename during integration. - - -___ - -
- - -
-Kitsu: Clear credentials is safe #6116 - -Do not remove not existing keyring items. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: bug fix the playblast without textures #5942 - -Bug fix the texture not being displayed when users enable texture placement in the OP/AYON setting - - -___ - -
- - -
-Blender: Workfile instance update fix #6048 - -Make sure workfile instance has always available 'instance_node' in transient data. - - -___ - -
- - -
-Publisher: Fix issue with parenting of widgets #6106 - -Don't use publisher window parent (usually main DCC window) as parent for report widget. - - -___ - -
- - -
-:wrench: fix and update pydocstyle configuration #6109 - -Fix pydocstyle configuration and move it to `pyproject.toml` - - -___ - -
- - -
-Nuke: Create camera node with the latest camera node class in Nuke 14 #6118 - -Creating instance fails for certain cameras, and it seems to only exist in Nuke 14. The reason of causing that contributes to the new camera node class `Camera4` while the camera creator is working with the `Camera2` class. - - -___ - -
- - -
-Site Sync: small fixes in Loader #6119 - -Resolves issue: -- local and studio icons were same, they should be different -- `TypeError: string indices must be integers` error when downloading/uploading workfiles - - -___ - -
- - -
-Chore: Template data for editorial publishing #6120 - -Template data for editorial publishing are filled during `CollectInstanceAnatomyData`. The structure for editorial is determined, as it's required for ExtractHierarchy AYON/OpenPype plugins. - - -___ - -
- - -
-SceneInventory: Fix site sync icon conversion #6123 - -Use 'get_qt_icon' to convert icon definitions from site sync. - - -___ - -
- - - - -## [3.18.2](https://github.com/ynput/OpenPype/tree/3.18.2) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.1...3.18.2) - -### **๐Ÿš€ Enhancements** - - -
-Testing: Release Maya/Deadline job from pending when testing. #5988 - -When testing we wont put the Deadline jobs into pending with dependencies, so the worker can start as soon as possible. - - -___ - -
- - -
-Max: Tweaks on Extractions for the exporters #5814 - -With this PR -- Suspend Refresh would be introduced in abc & obj extractors for optimization. -- Allow users to choose the custom attributes to be included in abc exports - - -___ - -
- - -
-Maya: Optional preserve references. #5994 - -Optional preserve references when publishing Maya scenes. - - -___ - -
- - -
-AYON ftrack: Expect 'ayon' group in custom attributes #6066 - -Expect `ayon` group as one of options to get custom attributes. - - -___ - -
- - -
-AYON Chore: Remove dependencies related to separated addons #6074 - -Removed dependencies from openpype client pyproject.toml that are already defined by addons which require them. - - -___ - -
- - -
-Editorial & chore: Stop using pathlib2 #6075 - -Do not use `pathlib2` which is Python 2 backport for `pathlib` module in python 3. - - -___ - -
- - -
-Traypublisher: Correct validator label #6084 - -Use correct label for Validate filepaths. - - -___ - -
- - -
-Nuke: Extract Review Intermediate disabled when both Extract Review Mov and Extract Review Intermediate disabled in setting #6089 - -Report in Discord https://discord.com/channels/517362899170230292/563751989075378201/1187874498234556477 - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Bug fix the file from texture node not being collected correctly in Yeti Rig #5990 - -Fix the bug of collect Yeti Rig not being able to get the file parameter(s) from the texture node(s), resulting to the failure of publishing the textures to the resource directory. - - -___ - -
- - -
-Bug: fix AYON settings for Maya workspace #6069 - -This is changing bug in default AYON setting for Maya workspace, where missing semicolumn caused workspace not being set. This is also syncing default workspace settings to OpenPype - - -___ - -
- - -
-Refactor colorspace handling in CollectColorspace plugin #6033 - -Traypublisher is now capable set available colorspaces or roles to publishing images sequence or video. This is fix of new implementation where we allowed to use roles in the enumerator selector. - - -___ - -
- - -
-Bugfix: Houdini render split bugs #6037 - -This PR is a follow up PR to https://github.com/ynput/OpenPype/pull/5420This PR does: -- refactor `get_output_parameter` to what is used to be. -- fix a bug with split render -- rename `exportJob` flag to `split_render` - - -___ - -
- - -
-Fusion: fix for single frame rendering #6056 - -Fixes publishes of single frame of `render` product type. - - -___ - -
- - -
-Photoshop: fix layer publish thumbnail missing in loader #6061 - -Thumbnails from any products (either `review` nor separate layer instances) weren't stored in Ayon.This resulted in not showing them in Loader and Server UI. After this PR thumbnails should be shown in the Loader and on the Server (`http://YOUR_AYON_HOSTNAME:5000/projects/YOUR_PROJECT/browser`). - - -___ - -
- - -
-AYON Chore: Do not use thumbnailSource for thumbnail integration #6063 - -Do not use `thumbnailSource` for thumbnail integration. - - -___ - -
- - -
-Photoshop: fix creation of .mov #6064 - -Generation of .mov file with 1 frame per published layer was failing. - - -___ - -
- - -
-Photoshop: fix Collect Color Coded settings #6065 - -Fix for wrong default value for `Collect Color Coded Instances` Settings - - -___ - -
- - -
-Bug: Fix Publisher parent window in Nuke #6067 - -Fixing issue where publisher parent window wasn't set because wrong use of version constant. - - -___ - -
- - -
-Python console widget: Save registry fix #6076 - -Do not save registry until there is something to save. - - -___ - -
- - -
-Ftrack: update asset names for multiple reviewable items #6077 - -Multiple reviewable assetVersion components with better grouping to asset version name. - - -___ - -
- - -
-Ftrack: DJV action fixes #6098 - -Fix bugs in DJV ftrack action. - - -___ - -
- - -
-AYON Workfiles tool: Fix arrow to timezone typo #6099 - -Fix parenthesis typo with arrow local timezone function. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Chore: Update folder-favorite icon to ayon icon #5718 - -Updates old "Pype-2.0-era" (from ancient greece times) to AYON logo equivalent.I believe it's only used in Nuke. - - -___ - -
- -### **Merged pull requests** - - -
-Chore: Maya / Nuke remove publish gui filters from settings #5570 - -- Remove Publish GUI Filters from Nuke settings -- Remove Publish GUI Filters from Maya settings - - -___ - -
- - -
-Fusion: Project/User option for output format (create_saver) #6045 - -Adds "Output Image Format" option which can be set via project settings and overwritten by users in "Create" menu. This replaces the current behaviour of being hardcoded to "exr". Replacing the need for people to manually edit the saver path if they require a different extension. - - -___ - -
- - -
-Fusion: Output Image Format Updating Instances (create_saver) #6060 - -Adds the ability to update Saver image output format if changed in the Publish UI.~~Adds an optional validator that compares "Output Image Format" in the Publish menu against the one currently found on the saver. It then offers a repair action to update the output extension on the saver.~~ - - -___ - -
- - -
-Tests: Fix representation count for AE legacy test #6072 - - -___ - -
- - - - -## [3.18.1](https://github.com/ynput/OpenPype/tree/3.18.1) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.18.0...3.18.1) - -### **๐Ÿš€ Enhancements** - - -
-AYON: Update ayon api to 1.0.0-rc.3 #6052 - -Updated ayon python api to 1.0.0-rc.3. - - -___ - -
- - - - -## [3.18.0](https://github.com/ynput/OpenPype/tree/3.18.0) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/...3.18.0) - -### **๐Ÿ› Bug fixes** - - -
-Chore: Fix subst paths handling #5702 - -Make sure that source disk ends with `\` instead of destination disk. - - -___ - -
- - - - -## [3.17.7](https://github.com/ynput/OpenPype/tree/3.17.7) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.6...3.17.7) - -### **๐Ÿ†• New features** - - -
-AYON: Use folder path as unique identifier #5817 - -Use folder path instead of asset name as unique identifier, with OpenPype compatibility. - - -___ - -
- - -
-Houdini: Farm caching submission to Deadline #4903 - -Implements functionality to offload instances of the specific families to be processed on Deadline instead of locally. This increases productivity as artist can use local machine could be used for other tasks.Implemented for families: -- [x] ass -- [x] redshift proxy -- [x] ifd -- [x] abc -- [x] bgeo -- [x] vdb - - -___ - -
- - -
-Houdini: Add support to split Deadline render tasks in export + render #5420 - -This adds initial support in Houdini so when submitting render jobs to Deadline it's not running as a single Houdini task but rather it gets split in two different tasks: Export + Render. This way it's more efficient as we only need a Houdini license during the export step and the render tasks can run exclusively with a render license. Moreover, we aren't wasting all the overhead time of opening the render scene in Houdini for every frame.I have also added the corresponding settings json files so we can set some of the default values for the Houdini deadline submitter. - - -___ - -
- - -
-Wrap: new integration #5823 - -These modifications are necessary for adding Wrap integration (DCC handling scans and textures) . - - -___ - -
- - -
-AYON: Prepare for 'data' via graphql #5923 - -AYON server does support to query 'data' field for hierarchy entities (project > ... > representation) using GraphQl since version 0.5.5. Because of this PR in ayon-python-api it is required to modify custom graphql function in `openpype.client` to support that option. - - -___ - -
- - -
-Chore AYON: AYON addon class #5937 - -Introduced base class for AYON addon in openpype modules discovery logic. - - -___ - -
- - -
-Asset Usage Reporter Tool #5946 - -This adds simple tool for OpenPype mode that will go over all published workfiles and print linked assets and their version:This is created per project and can be exported in csv file or copied to clipboard in _"ASCII Human readable form"_. - - -___ - -
- - -
-Testing: dump_databases flag #5955 - -This introduces a `dump_databases` flag which makes it convenient to output the resulting database of a successful test run. The flag supports two formats; `bson` and `json`.Due to outputting to the test data folder, when dumping the databases, the test data folder will persist.Split from https://github.com/ynput/OpenPype/pull/5644 - - -___ - -
- - -
-SiteSync: implemented in Ayon Loader #5962 - -Implemented `Availability` column in Ayon loader and redo of loaders to `ActionItems` in representation window there. - - -___ - -
- - -
-AYON: Workfile template build works #5975 - -Modified workfile template builder to work, to some degree, in AYON mode. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Small Tweaks on Validator for Look Default Shader Connection for Maya 2024 #5957 - -Resolve https://github.com/ynput/OpenPype/issues/5269 - - -___ - -
- - -
-Settings: Changes in default settings #5983 - -We've made some changes in the default settings as several application versions were obsolete (Maya 18, Nuke 11, PS 2020, etc). Also added tools and changed settings for Blender, Maya, and Blender. - -All should work as usual. -___ - -
- - -
-Testing: Do not persist data by default in Maya/Deadline. #5987 - -This is similar to the Maya publishing test. - - -___ - -
- - -
-Max: Validate loaded plugins tweaks #5820 - -In the current development of 3dsMax, users need to use separate validators to validate if certain plugins being loaded before the extraction. For example, usd extractor in model family, prt/tycache extractor in pointcloud/tycache family.But with the PR where implements optional validate loaded plugin, users just need to put what kind of plugins they want to validate in the settings. They no longer need to go through all the separate plugin validators when publishing, and only one validator would do all the check on the loaded plugins before extraction. - - -___ - -
- - -
-Nuke: Change context label enhancement #5887 - -Use QAction to change label of context label in Nuke pipeline menu. - - -___ - -
- - -
-Chore: Do not use template data as source for context #5918 - -Use available information on context to receive context data instead of using `"anatomyData"` during publishing. - - -___ - -
- - -
-Houdini: Add python3.10 libs for Houdini 20 startup #5932 - -Add python3.10 libs for Houdini 20 startup - - -___ - -
- - -
-General: Use colorspace data when creating thumbnail #5938 - -Thumbnails with applied colormanagement. - - -___ - -
- - -
-Ftrack: rewriting component creation to support multiple thumbnails #5939 - -The creation of Ftrack components needs to allow for multiple thumbnails. This is important in situations where there could be several reviewable streams, like in the case of a nuke intermediate files preset. Customers have asked for unique thumbnails for each data stream.For instance, one stream might contain a baked LUT file along with Display and View. Another stream might only include the baked Display and View. These variations can change the overall look. Thus, we found it necessary to depict these differences via thumbnails. - - -___ - -
- - -
-Chore: PySide6 tree view style #5940 - -Define solid color for background of branch in QTreeView. - - -___ - -
- - -
-Nuke: Explicit Thumbnail workflow #5941 - -Nuke made a shift from using its own plugin to a global one for thumbnail creation. This was because it had to handle several thumbnail workflows for baking intermediate data streams. To manage this, the global plugin had to be upgraded. Now, each baking stream can set a unique tag 'need_thumbnail'. This tag is used to mark representations that need a thumbnail. - - -___ - -
- - -
-Global: extract thumbnail with new settings #5944 - -Settings are now configurable for the following: -- target size of thumbnail - source or constrained to specific -- where should be frame taken from in sequence or video file -- if thumbnail should be integrated or not -- background color for letter boxes -- added AYON settings - - -___ - -
- - -
-RoyalRender: inject submitter environment to the royal render job #5958 - -This is an attempt to solve runtime environment injection for render jobs in RoyalRender as there is no easy way to implement something like `GlobalJobPreload` logic in Deadline. Idea is to inject OpenPype environments directly to the job itself. - - -___ - -
- - -
-General: Use manual thumbnail if present when publishing #5969 - -Use manual thumbnail added to the publisher instead of using it from published representation. - - -___ - -
- - -
-AYON: Change of server url should work as expected #5971 - -Using login action in tray menu to change server url should correctly start new process without issues of missing bundle or previous url. - - -___ - -
- - -
-AYON: make sure the AYON menu bar in 3dsMax is named AYON when AYON launches #5972 - -Renaming the menu bar in 3dsMax for AYON and some cosmetic fix in the docstring - - -___ - -
- - -
-Resolve: renaming menu to AYON #5974 - -Resolve in Ayon is now having aligned name. - - -___ - -
- - -
-Hiero: custom tools menu rename #5976 - -- OpenPype Tools are now Custom Tools menu -- fixing order of tools. Create should be first. - - -___ - -
- - -
-nuke: updating name for custom tools menu item #5977 - -- Ayon variant of settings renamed `Custom Tools` menu item - - -___ - -
- - -
-fusion: AYON renaming menu #5978 - -Fusion is having Ayon menu. - - -___ - -
- - -
-Blender: Changed the labels for Layout JSON Extractor #5981 - -Changed the labels for Blender's Layout JSON Extractor. - - -___ - -
- - -
-Testing: Skip Arnold license for test rendering. #5984 - -Skip license check when rendering for testing. - - -___ - -
- - -
-Testing: Validate errors and failed status from Deadline jobs. #5986 - -While waiting for the Deadline jobs to finish, we query the errors on the job and its dependent jobs to fail as early as possible. Plus the failed status. - - -___ - -
- - -
-AYON: rename Openpype Tools as Custom Tools in Maya Host #5991 - -Rename Openpype Tools as Custom Tools in Maya Host in - - -___ - -
- - -
-AYON: Use AYON label in ayon mode #5995 - -Replaced OpenPype with AYON in AYON mode and added bundle nam to information. - - -___ - -
- - -
-AYON: Update ayon python api #6002 - -Updated ayon-python-api to '1.0.0-rc.1'. - - -___ - -
- - -
-Max: Add missing repair action in validate resolution setting #6014 - -Add missing repair action for validate resolution setting - - -___ - -
- - -
-Add the AYON/OP settings to enable extractor for model family in 3dsmax #6027 - -Add the AYON/OP settings to enable extractor for model family in 3dsmax - - -___ - -
- - -
-Bugfix: Fix error message formatting if ayon executable can't be found by deadline #6028 - -Without this fix the error message would report executables string with `;` between EACH character, similar to this PR: https://github.com/ynput/OpenPype/pull/5815However that PR apparently missed also fixing it in `GlobalJobPreLoad` and only fixed it in `Ayon.py` plugin. - - -___ - -
- - -
-Show slightly different info in AYON mode #6031 - -This PR changes what is shown in Tray menu in AYON mode. Previously, it showed version of OpenPype that is very confusing in AYON mode. So this now shows AYON version instead. When clicked, it will opene AYON info window, where OpenPype version is now added, for debugging purposes. - - -___ - -
- - -
-AYON Editorial: Hierarchy context have names as keys #6041 - -Use folder name as keys in `hierarchyContext` and modify hierachy extraction accordingly. - - -___ - -
- - -
-AYON: Convert the createAt value to local timezone #6043 - -Show correct create time in UIs. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Render creation - fix broken imports #5893 - -Maya specific imports were moved to specific methods but not in all cases by #5775. This is just quickly restoring functionality without questioning that decision. - - -___ - -
- - -
-Maya: fix crashing model renderset collector #5929 - -This fix is handling case where model is in some type of render sets but no other connections are made there. Publishing this model would fail with `RuntimeError: Found no items to list the history for.` - - -___ - -
- - -
-Maya: Remove duplicated attributes of MTOA verbosity level #5945 - -Remove duplicated attributes implementation mentioned in https://github.com/ynput/OpenPype/pull/5931#discussion_r1402175289 - - -___ - -
- - -
-Maya: Bug fix Redshift Proxy not being successfully published #5956 - -Bug fix redshift proxy family not being successfully published due to the error found in integrate.py - - -___ - -
- - -
-Maya: Bug fix load image for texturesetMain #6011 - -Bug fix load image with file node for texturesetMain - - -___ - -
- - -
-Maya: bug fix the repair function in validate_rendersettings #6021 - -The following error has been encountered below: -``` -// pyblish.pyblish.plugin.Action : Finding failed instances.. -// pyblish.pyblish.plugin.Action : Attempting repair for instance: renderLookdevMain ... -// Error: pyblish.plugin : Traceback (most recent call last): -// File "C:\Users\lbate\AppData\Local\Ynput\AYON\dependency_packages\ayon_2310271602_windows.zip\dependencies\pyblish\plugin.py", line 527, in __explicit_process -// runner(*args) -// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\pipeline\publish\publish_plugins.py", line 241, in process -// plugin.repair(instance) -// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\hosts\maya\plugins\publish\validate_rendersettings.py", line 395, in repair -// cmds.setAttr("{}.{}".format(node, prefix_attr), -// UnboundLocalError: local variable 'node' referenced before assignment -// Traceback (most recent call last): -// File "C:\Users\lbate\AppData\Local\Ynput\AYON\dependency_packages\ayon_2310271602_windows.zip\dependencies\pyblish\plugin.py", line 527, in __explicit_process -// runner(*args) -// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\pipeline\publish\publish_plugins.py", line 241, in process -// plugin.repair(instance) -// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\hosts\maya\plugins\publish\validate_rendersettings.py", line 395, in repair -// cmds.setAttr("{}.{}".format(node, prefix_attr), -// UnboundLocalError: local variable 'node' referenced before assignment -``` -This PR is a fix for that - - -___ - -
- - -
-Fusion: Render avoid unhashable type `BlackmagicFusion.PyRemoteObject` error #5672 - -Fix Fusion 18.6+ support: Avoid issues with Fusion's `BlackmagicFusion.PyRemoteObject` instances being unhashable. -```python -Traceback (most recent call last): - File "E:\openpype\OpenPype\.venv\lib\site-packages\pyblish\plugin.py", line 527, in __explicit_process - runner(*args) - File "E:\openpype\OpenPype\openpype\hosts\fusion\plugins\publish\extract_render_local.py", line 61, in process - result = self.render(instance) - File "E:\openpype\OpenPype\openpype\hosts\fusion\plugins\publish\extract_render_local.py", line 118, in render - with enabled_savers(current_comp, savers_to_render): - File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\contextlib.py", line 119, in __enter__ - return next(self.gen) - File "E:\openpype\OpenPype\openpype\hosts\fusion\plugins\publish\extract_render_local.py", line 33, in enabled_savers - original_states[saver] = original_state -TypeError: unhashable type: 'BlackmagicFusion.PyRemoteObject' -``` - - - -___ - -
- - -
-Nuke: Validate Nuke Write Nodes refactor to use variable `node_value` instead of `value` #5764 - -Nuke: Validate Nuke Write Nodes refactor to use variable `node_value` instead of `value`The variable `value` only exists as the last variable value in the `for value in values` loop and might not be declared if `values` is an empty iterable. - - -___ - -
- - -
-resolve: fixing loader handles calculation #5863 - -Resolve was not correctly calculating duration of database related duration. - - -___ - -
- - -
-Chore: Staging mode determination #5895 - -Resources use `is_staging_enabled` function instead of `is_running_staging` to determine if should use staging icon. And fixed comparison bug in `is_running_staging`. - - -___ - -
- - -
-AYON: Handle staging templates category #5905 - -Staging anatomy templates category is handled during project templates conversion. The keys are stored into `others` with `"staging_"` prefix. - - -___ - -
- - -
-Max: fix the subset name not changing accordingly after the variant name changes #5911 - -Resolve #5902 - - -___ - -
- - -
-AYON: Loader tool bugs hunt #5915 - -Fix issues with invalid representation ids in loaded containers and handle missing product type in server database. - - -___ - -
- - -
-Publisher: Bugfixes and enhancements #5924 - -Small fixes/enhancements in publisher UI. - - -___ - -
- - -
-Maya: Supports for additional Job Info and Plugin Info in deadline submission #5931 - -This PR is to resolve some of the attributes such as MTOA's `ArnoldVerbose` are not preserved on farm and users can use the project settings to add the attributes back to either job or plugin Info. - - -___ - -
- - -
-Bugfix: Houdini license validator missing families #5934 - -Adding missing families to Houdini license validator. - - -___ - -
- - -
-TrayPublisher: adding back `asset_doc` variable #5943 - -Returning variable which had been removed accidentally in previous PR. - - -___ - -
- - -
-Settings: Fix ModulesManager init args #5947 - -Remove usage of kwargs to create ModulesManager. - - -___ - -
- - -
-Blender: Fix Deadline Frames per task #5949 - -Fixed a problem with Frames per task setting not being applied when publishing a render. - - -___ - -
- - -
-Testing: Fix is_test_failed #5951 - -`is_test_failed` is used (exclusively) on module fixtures to determine whether the tests have failed or not. This determines whether to run tear down code like cleaning up the database and temporary files.But in the module scope `request.node.rep_call` is not available, which results in `is_test_failed` always returning `True`, and no tear down code get executed.The solution was taken from; https://github.com/pytest-dev/pytest/issues/5090 - - -___ - -
- - -
-Harmony: Fix local rendering #5953 - -Local rendering was throwing warning about license, but didn't fail per se. It just didn't produce anything. - - -___ - -
- - -
-Testing: hou module should be within class code. #5954 - -`hou` module should be within the class code else we'll get pyblish errors from needing to skip the plugin. - - -___ - -
- - -
-Maya: Add Label to MayaUSDReferenceLoader #5964 - -As the create placeholder dialog displays the two distinct loaders with the same name, this PR is to distinguish Maya USD Reference Loaders from the loaders of which inherited from. See the screenshot below: - - -___ - -
- - -
-Max: Bug fix the resolution not being shown correctly in review burnin #5965 - -The resolution is not being shown correctly in review burnin - - -___ - -
- - -
-AYON: Fix thumbnail integration #5970 - -Thumbnail integration could cause crash of server if thumbnail id was changed for the same entity id multiple times. Modified the code to avoid that issue. - - -___ - -
- - -
-Photoshop: Updated label in Settings #5980 - -Replaced wrong label from different plugin. - - -___ - -
- - -
-Photoshop: Fix removed unsupported Path #5996 - -Path is not json serializable by default, it is not necessary, better model reused. - - -___ - -
- - -
-AYON: Prepare functions for newer ayon-python-api #5997 - -Newer ayon python api will add new filtering options or change order of existing. Kwargs are used in client code to prevent issues on update. - - -___ - -
- - -
-AYON: Conversion of the new playblast settings in Maya #6000 - -Conversion of the new playblast settings in Maya - - -___ - -
- - -
-AYON: Bug fix for loading Mesh in Substance Painter as new project not working #6004 - -Substance Painter in AYON can't load mesh for creating a new project - - -___ - -
- - -
-Deadline: correct webservice couldn't be selected in Ayon #6007 - -Changed the Setting model to mimic more OP approach as it needs to live together for time being. - - -___ - -
- - -
-AYON tools: Fix refresh thread #6008 - -Trigger 'refresh_finished' signal out of 'run' method. - - -___ - -
- - -
-Ftrack: multiple reviewable components missing variable #6013 - -Missing variable in code for editorial publishing in traypublisher. - - -___ - -
- - -
-TVPaint: Expect legacy instances in metadata #6015 - -Do not expect `"workfileInstances"` constains only new type instance data with `creator_identifier`. - - -___ - -
- - -
-Bugfix: handle missing key in Deadline #6019 - -This quickly fixes bug introduced by #5420 - - -___ - -
- - -
-Revert `extractenvironments` behaviour #6020 - -This is returning original behaviour of `extractenvironments` command from before #5958 so we restore functionality. - - -___ - -
- - -
-OP-7535 - Fix renaming composition in AE #6025 - -Removing of `render` instance caused renaming of composition to `dummyComp` which caused issue in publishing in next attempt.This PR stores original composition name(cleaned up for product name creation) and uses it if instance needs to be removed. - - -___ - -
- - -
-Refactor code to skip instance creation for new assets #6029 - -Publishing effects from hiero during editorial publish is working as expected again. - - -___ - -
- - -
-Refactor code to handle missing "representations" key in instance data #6032 - -Minor code change for optimisation of thumbnail workflow. - - -___ - -
- - -
-Traypublisher: editorial preserve clip case sensitivity #6036 - -Keep EDL clip name inheritance with case sensitivity. - - -___ - -
- - -
-Bugfix/add missing houdini settings #6039 - -add missing settings. now, it looks like this:| Ayon | OpenPype || -- | -- | | | || | | - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Maya: Remove RenderSetup layer observers #5836 - -Remove RenderSetup layer observers that are not needed since new publisher since Renderlayer Creators manage these themselves on Collect and Save/Update of instances. - - -___ - -
- -### **Merged pull requests** - - -
-Tests: Removed render instance #6026 - -This test was created as simple model and workfile publish, without Deadline rendering. Cleaned up render elements. - - -___ - -
- - -
-Tests: update after thumbnail default change #6040 - -https://github.com/ynput/OpenPype/pull/5944 changed default state of integration of Thumbnails to NOT integrate. This PR updates automatic tests to follow that. - - -___ - -
- - -
-Houdini: Remove legacy LOPs USD output processors #5861 - -Remove unused/broken legacy code for Houdini Solaris USD LOPs output processors. The code was originally written in Avalon, against early Houdini 18 betas which had a different API for output processors and thus the current state doesn't even work in recent versions of Houdini. - - -___ - -
- - -
-Chore: Substance Painter Addons for Ayon #5914 - -Substance Painter Addons for Ayon - - -___ - -
- - -
-Ayon: Updated name of Adobe extension to Ayon #5992 - -This changes name in menu in Adobe extensions to Ayon. - - -___ - -
- - -
-Chore/houdini update startup log #6003 - -print `Installing AYON ...` on startup when launching houdini from launcher in ayon mode.also update submenu to `ayon_menu` instead of `openpype_menu` - - -___ - -
- - -
-Revert "Ayon: Updated name of Adobe extension to Ayon" #6010 - -Reverts ynput/OpenPype#5992 - -That PR is only applicable to Ayon. -___ - -
- - -
-Standalone/Tray Publisher: Remove simple Unreal texture publishing #6012 - -We are removing _simple Unreal Texture publishing_ that was just renaming texture files to fit to Unreal naming conventions but without any additional functionality. We might return this functionality back with better texture publishing system.Related to #5983 - - -___ - -
- - -
-Deadline: Bump version because of Settings changes for Deadline #6023 - - -___ - -
- - -
-Change ASCII art in the Console based on the server mode #6030 - -This changes ASCII art in the console based on the AYON/OpenPype mode - - -___ - -
- - - - -## [3.17.6](https://github.com/ynput/OpenPype/tree/3.17.6) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.5...3.17.6) - -### **๐Ÿš€ Enhancements** - - -
-Testing: Validate Maya Logs #5775 - -This PR adds testing of the logs within Maya such as Python and Pyblish errors.The reason why we need to touch so many files outside of Maya is because of the pyblish errors below; -``` -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "collect_otio_frame_ranges" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "collect_otio_frame_ranges" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "collect_otio_review" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "collect_otio_review" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "collect_otio_subset_resources" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "collect_otio_subset_resources" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "extract_otio_audio_tracks" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "extract_otio_audio_tracks" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "extract_otio_file" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "extract_otio_file" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "extract_otio_review" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "extract_otio_review" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "extract_otio_trimming_video" (No module named 'opentimelineio') -# Error: pyblish.plugin : Skipped: "extract_otio_trimming_video" (No module named 'opentimelineio') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "submit_blender_deadline" (No module named 'bpy') -# Error: pyblish.plugin : Skipped: "submit_blender_deadline" (No module named 'bpy') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "submit_houdini_remote_publish" (No module named 'hou') -# Error: pyblish.plugin : Skipped: "submit_houdini_remote_publish" (No module named 'hou') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "submit_houdini_render_deadline" (No module named 'hou') -# Error: pyblish.plugin : Skipped: "submit_houdini_render_deadline" (No module named 'hou') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "submit_max_deadline" (No module named 'pymxs') -# Error: pyblish.plugin : Skipped: "submit_max_deadline" (No module named 'pymxs') # -pyblish (ERROR) (line: 1371) pyblish.plugin: -Skipped: "submit_nuke_deadline" (No module named 'nuke') -# Error: pyblish.plugin : Skipped: "submit_nuke_deadline" (No module named 'nuke') # -``` -We also needed to `stdout` and `stderr` from the launched application to capture the output.Split from #5644.Dependent on #5734 - - -___ - -
- - -
-Maya: Render Settings cleanup remove global `RENDER_ATTRS` #5801 - -Remove global `lib.RENDER_ATTRS` and implement a `RenderSettings.get_padding_attr(renderer)` method instead. - - -___ - -
- - -
-Testing: Ingest expected files and input workfile #5840 - -This ingests the Maya workfile from the Drive storage. Have changed the format to MayaAscii so its easier to see what changes are happening in a PR. This meant changing the expected files and database entries as well. - - -___ - -
- - -
-Chore: Create plugin auto-apply settings #5908 - -Create plugins can auto-apply settings. - - -___ - -
- - -
-Resolve: Add save current file button + "Save" shortcut when menu is active #5691 - -Adds a "Save current file" to the OpenPype menu.Also adds a "Save" shortcut key sequence (CTRL+S on Windows) to the button, so that clicking CTRL+S when the menu is active will save the current workfile. However this of course does not work if the menu does not receive the key press event (e.g. when Resolve UI is active instead)Resolves #5684 - - -___ - -
- - -
-Reference USD file as maya native geometry #5781 - -Add MayaUsdReferenceLoader to reference USD as Maya native geometry using `mayaUSDImport` file translator. - - -___ - -
- - -
-Max: Bug fix on wrong aspect ratio and viewport not being maximized during context in review family #5839 - -This PR will fix the bug on wrong aspect ratio and viewport not being maximized when creating preview animationBesides, the support of tga image format and the options for AA quality are implemented in this PR - - -___ - -
- - -
-Blender: Incorporate blender "Collections" into Publish/Load #5841 - -Allow `blendScene` family to include collections. - - -___ - -
- - -
-Max: Allows user preset the setting of preview animation in OP/AYON Setting #5859 - -Allows user preset the setting of preview animation in OP/AYON Setting for review family. -- [x] Openpype -- [x] AYON - - -___ - -
- - -
-Publisher: Center publisher window on first show #5877 - -Move publisher window to center of a screen on first show. - - -___ - -
- - -
-Publisher: Instance context changes confirm works #5881 - -Confirmation of context changes in publisher on existing instances does not cause glitches. - - -___ - -
- - -
-AYON workfiles tools: Revisit workfiles tool #5897 - -Revisited workfiles tool for AYON mode to reuse common models and widgets. - - -___ - -
- - -
-Nuke: updated colorspace settings #5906 - -Updating nuke colorspace settings into more convenient way with usage of ocio config roles rather then particular colorspace names. This way we should not have troubles to switch between linear Rec709 or ACES configs without any additional settings changes. - - -___ - -
- - -
-Blender: Refactor to new publisher #5910 - -Refactor Blender integration to use the new publisher - - -___ - -
- - -
-Enhancement: Some publish logs cosmetics #5917 - -General logging message tweaks: -- Sort some lists of folder/filenames so they appear sorted in the logs -- Fix some grammar / typos -- In some cases provide slightly more information in a log - - -___ - -
- - -
-Blender: Better name of 'asset_name' function #5927 - -Renamed function `asset_name` to `prepare_scene_name`. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Bug fix the fbx animation export errored out when the skeletonAnim set is empty #5875 - -Resolve this bug discordIf the skeletonAnim SET is empty and fbx animation collect, the fbx animation extractor would skip the fbx extraction - - -___ - -
- - -
-Bugfix: fix few typos in houdini's and Maya's Ayon settings #5882 - -Fixing few typos -- [x] Maya unreal static mesh -- [x] Houdini static mesh -- [x] Houdini collect asset handles - - -___ - -
- - -
-Bugfix: Ayon Deadline env vars + error message on no executable found #5815 - -Fix some Ayon x Deadline issues as came up in this topic: -- missing Environment Variables issue explained here for `deadlinePlugin.RunProcess` for the AYON _extract environments_ call. -- wrong error formatting described here with a `;` between each character like this: `Ayon executable was not found in the semicolon separated list "C;:;/;P;r;o;g;r;a;m; ;F;i;l;e;s;/;Y;n;p;u;t;/;A;Y;O;N; ;1;.;0;.;0;-;b;e;t;a;.;5;/;a;y;o;n;_;c;o;n;s;o;l;e;.;e;x;e". The path to the render executable can be configured from the Plugin Configuration in the Deadline Monitor.` - - -___ - -
- - -
-AYON: Fix bundles access in settings #5856 - -Fixed access to bundles data in settings to define correct develop variant. - - -___ - -
- - -
-AYON 3dsMax settings: 'ValidateAttributes' settings converte only if available #5878 - -Convert `ValidateAttributes` settings only if are available in AYON settings. - - -___ - -
- - -
-AYON: Fix TrayPublisher editorial settings #5880 - -Fixing Traypublisher settings for adding task in simple editorial. - - -___ - -
- - -
-TrayPublisher: editorial frame range check not needed #5884 - -Validator for frame ranges is not needed during editorial publishing since entity data are not yet in database. - - -___ - -
- - -
-Update houdini license validator #5886 - -As reported in this community commentHoudini USD publishing is only restricted in Houdini apprentice. - - -___ - -
- - -
-Blender: Fix blend extraction and packed images #5888 - -Fixed a with blend extractor and packed images. - - -___ - -
- - -
-AYON: Initialize connection with all information #5890 - -Create global AYON api connection with all informations all the time. - - -___ - -
- - -
-AYON: Scene inventory tool without site sync #5896 - -Skip 'get_site_icons' if site sync addon is disabled. - - -___ - -
- - -
-Publish report tool: Fix PySide6 #5898 - -Use constants from classes instead of objects. - - -___ - -
- - -
-fusion: removing hardcoded template name for saver #5907 - -Fusion is not hardcoded for `render` anatomy template only anymore. This was blocking AYON deployment. - - -___ - -
- - - - -## [3.17.5](https://github.com/ynput/OpenPype/tree/3.17.5) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.4...3.17.5) - -### **๐Ÿ†• New features** - - -
-Fusion: Add USD loader #4896 - -Add an OpenPype managed USD loader (`uLoader`) for Fusion. - - -___ - -
- - -
-Fusion: Resolution validator #5325 - -Added a resolution validator.The code is from my old PR (https://github.com/ynput/OpenPype/pull/4921) that I closed because the PR also contained a frame range validator that no longer is needed. - - -___ - -
- - -
-Context Selection tool: Refactor Context tool (for AYON) #5766 - -Context selection tool has AYON variant. - - -___ - -
- - -
-AYON: Use AYON username for user in template data #5842 - -Use ayon username for template data in AYON mode. - - -___ - -
- - -
-Testing: app_group flag #5869 - -`app_group` command flag. This is for changing which flavour of the host to launch. In the case of Maya, you can launch Maya and MayaPy, but it can be used for the Nuke family as well.Split from #5644 - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Enhancement: Fusion fix saver creation + minor Blender/Fusion logging tweaks #5558 - -- Blender change logs to `debug` level in preparation for new publisher artist facing reports (note that it currently still uses the old publisher) -- Fusion: Create Saver fix redeclaration of default_variants -- Fusion: Fix saver being created in incorrect state without saving directly after create -- Fusion: Allow reset frame range on render family -- Fusion: Tweak logging level for artist-facing report - - -___ - -
- - -
-Resolve: load clip to timeline at set time #5665 - -It is possible to load clip to correct place on timeline. - - -___ - -
- - -
-Nuke: Optional Deadline workfile dependency. #5732 - -Adds option to add the workfile as dependency for the Deadline job.Think it used to have something like this, but it disappeared. Usecase is for remote workflow where the Nuke script needs to be synced before the job can start. - - -___ - -
- - -
-Enhancement/houdini rearrange ayon houdini settings files #5748 - -Rearranging Houdini Settings to be more readable, easier to edit, update settings (include all families/product types)This PR is mainly for Ayon Settings to have more organized files. For Openpype, I'll make sure that each Houdini setting in Ayon has an equivalent in Openpype. -- [x] update Ayon settings, fix typos and remove deprecated settings. -- [x] Sync with Openpype -- [x] Test in Openpype -- [x] Test in Ayon - - -___ - -
- - -
-Chore: updating create ayon addon script #5822 - -Adding developers environment options. - - -___ - -
- - -
-Max: Implement Validator for Properties/Attributes Value Check #5824 - -Add optional validator which can check if the property attributes are valid in Max - - -___ - -
- - -
-Nuke: Remove unused 'get_render_path' function #5826 - -Remove unused function `get_render_path` from nuke integration. - - -___ - -
- - -
-Chore: Limit current context template data function #5845 - -Current implementation of `get_current_context_template_data` does return the same values as base template data function `get_template_data`. - - -___ - -
- - -
-Max: Make sure Collect Render not ignoring instance asset #5847 - -- Make sure Collect Render is not always using asset from context. -- Make sure Scene version being collected -- Clean up unnecessary uses of code in the collector. - - -___ - -
- - -
-Ftrack: Events are not processed if project is not available in OpenPype #5853 - -Events that happened on project which is not in OpenPype is not processed. - - -___ - -
- - -
-Nuke: Add Nuke 11.0 as default setting #5855 - -Found I needed Nuke 11.0 in the default settings to help with unit testing. - - -___ - -
- - -
-TVPaint: Code cleanup #5857 - -Removed unused import. Use `AYON` label in ayon mode. Removed unused data in publish context `"previous_context"`. - - -___ - -
- - -
-AYON settings: Use correct label for follow workfile version #5874 - -Follow workfile version label was marked as Collect Anatomy Instance Data label. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Nuke: Fix workfile template builder so representations get loaded next to each other #5061 - -Refactor when the cleanup of the placeholder happens for the cases where multiple representations are loaded by a single placeholder.The existing code didn't take into account the case where a template placeholder can load multiple representations so it was trying to do the cleanup of the placeholder node and the re-arrangement of the imported nodes too early. I assume this was designed only for the cases where a single representation can load multiple nodes. - - -___ - -
- - -
-Nuke: Dont update node name on update #5704 - -When updating `Image` containers the code is trying to set the name of the node. This results in a warning message from Nuke shown below;Suggesting to not change the node name when updating. - - -___ - -
- - -
-UIDefLabel can be unique #5827 - -`UILabelDef` have implemented comparison and uniqueness. - - -___ - -
- - -
-AYON: Skip kitsu module when creating ayon addons #5828 - -Create AYON packages is skipping kitsu module in creation of modules/addons and kitsu module is not loaded from modules on start. The addon already has it's repository https://github.com/ynput/ayon-kitsu. - - -___ - -
- - -
-Bugfix: Collect Rendered Files only collecting first instance #5832 - -Collect all instances from the metadata file - don't return on first instance iteration. - - -___ - -
- - -
-Houdini: set frame range for the created composite ROP #5833 - -Quick bug fix for created composite ROP, set its frame range to the frame range of the playbar. - - -___ - -
- - -
-Fix registering launcher actions from OpenPypeModules #5843 - -Fix typo `actions_dir` -> `path` to fix register launcher actions fromm OpenPypeModule - - -___ - -
- - -
-Bugfix in houdini shelves manager and beautify settings #5844 - -This PR fixes the problem in this PR https://github.com/ynput/OpenPype/issues/5457 by using the right function to load a pre-made houdini `.shelf` fileAlso, it beautifies houdini shelves settings to provide better guidance for users which helps with other issue https://github.com/ynput/OpenPype/issues/5458 , Rather adding default shelf and set names, I'll educate users how to use the tool correctly.Users now are able to select between the two options.| OpenPype | Ayon || -- | -- || | | - - -___ - -
- - -
-Blender: Fix missing Grease Pencils in review #5848 - -Fix Grease Pencil missing in review when isolating objects. - - -___ - -
- - -
-Blender: Fix Render Settings in Ayon #5849 - -Fix Render Settings in Ayon for Blender. - - -___ - -
- - -
-Bugfix: houdini tab menu working as expected #5850 - -This PR:Tab menu name changes to Ayon when using ayon get_network_categories is checked in all creator plugins. | Product | Network Category | | -- | -- | | Alembic camera | rop, obj | | Arnold Ass | rop | | Arnold ROP | rop | | Bgeo | rop, sop | | composite sequence | cop2, rop | | hda | obj | | Karma ROP | rop | | Mantra ROP | rop | | ABC | rop, sop | | RS proxy | rop, sop| | RS ROP | rop | | Review | rop | | Static mesh | rop, obj, sop | | USD | lop, rop | | USD Render | rop | | VDB | rop, obj, sop | | V Ray | rop | - - -___ - -
- - -
-Bigfix: Houdini skip frame_range_validator if node has no 'trange' parameter #5851 - -I faced a bug when publishing HDA instance as it has no `trange` parameter. As this PR title says : skip frame_range_validator if node has no 'trange' parameter - - -___ - -
- - -
-Bugfix: houdini image sequence loading and missing frames #5852 - -I made this PR in to fix issues mentioned here https://github.com/ynput/OpenPype/pull/5833#issuecomment-1789207727in short: -- image load doesn't work -- publisher only publish one frame - - -___ - -
- - -
-Nuke: loaders' containers updating as nodes #5854 - -Nuke loaded containers are updating correctly even they have been duplicating of originally loaded nodes. This had previously been removed duplicated nodes. - - -___ - -
- - -
-deadline: settings are not blocking extension input #5864 - -Settings are not blocking user input. - - -___ - -
- - -
-Blender: Fix loading of blend layouts #5866 - -Fix a problem with loading blend layouts. - - -___ - -
- - -
-AYON: Launcher refresh issues #5867 - -Fixed refresh of projects issue in launcher tool. And renamed Qt models to contain `Qt` in their name (it was really hard to find out where were used). It is not possible to click on disabled item in launcher's projects view. - - -___ - -
- - -
-Fix the Wrong key words for tycache workfile template settings in AYON #5870 - -Fix the wrong key words for the tycache workfile template settings in AYON(i.e. Instead of families, product_types should be used) - - -___ - -
- - -
-AYON tools: Handle empty icon definition #5876 - -Ignore if passed icon definition is `None`. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Houdini: Remove on instance toggled callback #5860 - -Remove on instance toggled callback which isn't relevant to the new publisher - - -___ - -
- - -
-Chore: Remove unused `instanceToggled` callbacks #5862 - -The `instanceToggled` callbacks should be irrelevant for new publisher. - - -___ - -
- - - - -## [3.17.4](https://github.com/ynput/OpenPype/tree/3.17.4) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.3...3.17.4) - -### **๐Ÿ†• New features** - - -
-Add Support for Husk-AYON Integration #5816 - -This draft pull request introduces support for integrating Husk with AYON within the OpenPype repository. - - -___ - -
- - -
-Push to project tool: Prepare push to project tool for AYON #5770 - -Cloned Push to project tool for AYON and modified it. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Max: tycache family support #5624 - -Tycache family supports for Tyflow Plugin in Max - - -___ - -
- - -
-Unreal: Changed behaviour for updating assets #5670 - -Changed how assets are updated in Unreal. - - -___ - -
- - -
-Unreal: Improved error reporting for Sequence Frame Validator #5730 - -Improved error reporting for Sequence Frame Validator. - - -___ - -
- - -
-Max: Setting tweaks on Review Family #5744 - -- Bug fix of not being able to publish the preferred visual style when creating preview animation -- Exposes the parameters after creating instance -- Add the Quality settings and viewport texture settings for preview animation -- add use selection for create review - - -___ - -
- - -
-Max: Add families with frame range extractions back to the frame range validator #5757 - -In 3dsMax, there are some instances which exports the files in frame range but not being added to the optional frame range validator. In this PR, these instances would have the optional frame range validators to allow users to check if frame range aligns with the context data from DB.The following families have been added to have optional frame range validator: -- maxrender -- review -- camera -- redshift proxy -- pointcache -- point cloud(tyFlow PRT) - - -___ - -
- - -
-TimersManager: Use available data to get context info #5804 - -Get context information from pyblish context data instead of using `legacy_io`. - - -___ - -
- - -
-Chore: Removed unused variable from `AbstractCollectRender` #5805 - -Removed unused `_asset` variable from `RenderInstance`. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Bugfix/houdini: wrong frame calculation with handles #5698 - -This PR make collect plugins to consider `handleStart` and `handleEnd` when collecting frame range it affects three parts: -- get frame range in collect plugins -- expected file in render plugins -- submit houdini job deadline plugin - - -___ - -
- - -
-Nuke: ayon server settings improvements #5746 - -Nuke settings were not aligned with OpenPype settings. Also labels needed to be improved. - - -___ - -
- - -
-Blender: Fix pointcache family and fix alembic extractor #5747 - -Fixed `pointcache` family and fixed behaviour of the alembic extractor. - - -___ - -
- - -
-AYON: Remove 'shotgun_api3' from dependencies #5803 - -Removed `shotgun_api3` dependency from openpype dependencies for AYON launcher. The dependency is already defined in shotgrid addon and change of version causes clashes. - - -___ - -
- - -
-Chore: Fix typo in filename #5807 - -Move content of `contants.py` into `constants.py`. - - -___ - -
- - -
-Chore: Create context respects instance changes #5809 - -Fix issue with unrespected change propagation in `CreateContext`. All successfully saved instances are marked as saved so they have no changes. Origin data of an instance are explicitly not handled directly by the object but by the attribute wrappers. - - -___ - -
- - -
-Blender: Fix tools handling in AYON mode #5811 - -Skip logic in `before_window_show` in blender when in AYON mode. Most of the stuff called there happes on show automatically. - - -___ - -
- - -
-Blender: Include Grease Pencil in review and thumbnails #5812 - -Include Grease Pencil in review and thumbnails. - - -___ - -
- - -
-Workfiles tool AYON: Fix double click of workfile #5813 - -Fix double click on workfiles in workfiles tool to open the file. - - -___ - -
- - -
-Webpublisher: removal of usage of no_of_frames in error message #5819 - -If it throws exception, `no_of_frames` value wont be available, so it doesn't make sense to log it. - - -___ - -
- - -
-Attribute Defs: Hide multivalue widget in Number by default #5821 - -Fixed default look of `NumberAttrWidget` by hiding its multiselection widget. - - -___ - -
- -### **Merged pull requests** - - -
-Corrected a typo in Readme.md (Top -> To) #5800 - - -___ - -
- - -
-Photoshop: Removed redundant copy of extension.zxp #5802 - -`extension.zxp` shouldn't be inside of extension folder. - - -___ - -
- - - - -## [3.17.3](https://github.com/ynput/OpenPype/tree/3.17.3) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.2...3.17.3) - -### **๐Ÿ†• New features** - - -
-Maya: Multi-shot Layout Creator #5710 - -New Multi-shot Layout creator is a way of automating creation of the new Layout instances in Maya, associated with correct shots, frame ranges and Camera Sequencer in Maya. - - -___ - -
- - -
-Colorspace: ociolook file product type workflow #5541 - -Traypublisher support for publishing of colorspace look files (ociolook) which are json files holding any LUT files. This new product is available for loading in Nuke host at the moment.Added colorspace selector to publisher attribute with better labeling. We are supporting also Roles and Alias (only v2 configs). - - -___ - -
- - -
-Scene Inventory tool: Refactor Scene Inventory tool (for AYON) #5758 - -Modified scene inventory tool for AYON. The main difference is in how project name is defined and replacement of assets combobox with folders dialog. - - -___ - -
- - -
-AYON: Support dev bundles #5783 - -Modules can be loaded in AYON dev mode from different location. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Testing: Ingest Maya userSetup #5734 - -Suggesting to ingest `userSetup.py` startup script for easier collaboration and transparency of testing. - - -___ - -
- - -
-Fusion: Work with pathmaps #5329 - -Path maps are a big part of our Fusion workflow. We map the project folder to a path map within Fusion so all loaders and savers point to the path map variable. This way any computer on any OS can open any comp no matter where the project folder is located. - - -___ - -
- - -
-Maya: Add Maya 2024 and remove pre 2022. #5674 - -Adding Maya 2024 as default application variant.Removing Maya 2020 and older, as these are not supported anymore. - - -___ - -
- - -
-Enhancement: Houdini: Allow using template keys in Houdini shelves manager #5727 - -Allow using Template keys in Houdini shelves manager. - - -___ - -
- - -
-Houdini: Fix Show in usdview loader action #5737 - -Fix the "Show in USD View" loader to show up in Houdini - - -___ - -
- - -
-Nuke: validator of asset context with repair actions #5749 - -Instance nodes with different context of asset and task can be now validated and repaired via repair action. - - -___ - -
- - -
-AYON: Tools enhancements #5753 - -Few enhancements and tweaks of AYON related tools. - - -___ - -
- - -
-Max: Tweaks on ValidateMaxContents #5759 - -This PR provides enhancements on ValidateMaxContent as follow: -- Rename `ValidateMaxContents` to `ValidateContainers` -- Add related families which are required to pass the validation(All families except `Render` as the render instance is the one which only allows empty container) - - -___ - -
- - -
-Enhancement: Nuke refactor `SelectInvalidAction` #5762 - -Refactor `SelectInvalidAction` to behave like other action for other host, create `SelectInstanceNodeAction` as dedicated action to select the instance node for a failed plugin. -- Note: Selecting Instance Node will still select the instance node even if the user has currently 'fixed' the problem. - - -___ - -
- - -
-Enhancement: Tweak logging for Nuke for artist facing reports #5763 - -Tweak logs that are not artist-facing to debug level + in some cases clarify what the logged value is. - - -___ - -
- - -
-AYON Settings: Disk mapping #5786 - -Added disk mapping settings to core addon settings. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: add colorspace argument to redshiftTextureProcessor #5645 - -In color managed Maya, texture processing during Look Extraction wasn't passing texture colorspaces set on textures to `redshiftTextureProcessor` tool. This in effect caused this tool to produce non-zero exit code (even though the texture was converted into wrong colorspace) and therefor crash of the extractor. This PR is passing colorspace to that tool if color management is enabled. - - -___ - -
- - -
-Maya: don't call `cmds.ogs()` in headless mode #5769 - -`cmds.ogs()` is a call that will crash if Maya is running in headless mode (mayabatch, mayapy). This is handling that case. - - -___ - -
- - -
-Resolve: inventory management fix #5673 - -Loaded Timeline item containers are now updating correctly and version management is working as it suppose to. -- [x] updating loaded timeline items -- [x] Removing of loaded timeline items - - -___ - -
- - -
-Blender: Remove 'update_hierarchy' #5756 - -Remove `update_hierarchy` function which is causing crashes in scene inventory tool. - - -___ - -
- - -
-Max: bug fix on the settings in pointcloud family #5768 - -Bug fix on the settings being errored out in validate point cloud(see links:https://github.com/ynput/OpenPype/pull/5759#pullrequestreview-1676681705) and passibly in point cloud extractor. - - -___ - -
- - -
-AYON settings: Fix default factory of tools #5773 - -Fix default factory of application tools. - - -___ - -
- - -
-Fusion: added missing OPENPYPE_VERSION #5776 - -Fusion submission to Deadline was missing OPENPYPE_VERSION env var when submitting from build (not source code directly). This missing env var might break rendering on DL if path to OP executable (openpype_console.exe) is not set explicitly and might cause an issue when different versions of OP are deployed.This PR adds this environment variable. - - -___ - -
- - -
-Ftrack: Skip tasks when looking for asset equivalent entity #5777 - -Skip tasks when looking for asset equivalent entity. - - -___ - -
- - -
-Nuke: loading gizmos fixes #5779 - -Gizmo product is not offered in Loader as plugin. It is also updating as expected. - - -___ - -
- - -
-General: thumbnail extractor as last extractor #5780 - -Fixing issue with the order of the `ExtractOIIOTranscode` and `ExtractThumbnail` plugins. The problem was that the `ExtractThumbnail` plugin was processed before the `ExtractOIIOTranscode` plugin. As a result, the `ExtractThumbnail` plugin did not inherit the `review` tag into the representation data. This caused the `ExtractThumbnail` plugin to fail in processing and creating thumbnails. - - -___ - -
- - -
-Bug: fix key in application json #5787 - -In PR #5705 `maya` was wrongly used instead of `mayapy`, breaking AYON defaults in AYON Application Addon. - - -___ - -
- - -
-'NumberAttrWidget' shows 'Multiselection' label on multiselection #5792 - -Attribute definition widget 'NumberAttrWidget' shows `< Multiselection >` label on multiselection. - - -___ - -
- - -
-Publisher: Selection change by enabled checkbox on instance update attributes #5793 - -Change of instance by clicking on enabled checkbox will actually update attributes on right side to match the selection. - - -___ - -
- - -
-Houdini: Remove `setParms` call since it's responsibility of `self.imprint` to set the values #5796 - -Revert a recent change made in #5621 due to this comment. However the change is faulty as can be seen mentioned here - - -___ - -
- - -
-AYON loader: Fix SubsetLoader functionality #5799 - -Fix SubsetLoader plugin processing in AYON loader tool. - - -___ - -
- -### **Merged pull requests** - - -
-Houdini: Add self publish button #5621 - -This PR allows single publishing by adding a publish button to created rop nodes in HoudiniAdmins are much welcomed to enable it from houdini general settingsPublish Button also includes all input publish instances. in this screen shot the alembic instance is ignored because the switch is turned off - - -___ - -
- - -
-Nuke: fixing UNC support for OCIO path #5771 - -UNC paths were broken on windows for custom OCIO path and this is solving the issue with removed double slash at start of path - - -___ - -
- - - - -## [3.17.2](https://github.com/ynput/OpenPype/tree/3.17.2) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.1...3.17.2) - -### **๐Ÿ†• New features** - - -
-Maya: Add MayaPy application. #5705 - -This adds mayapy to the application to be launched from a task. - - -___ - -
- - -
-Feature: Copy resources when downloading last workfile #4944 - -When the last published workfile is downloaded as a prelaunch hook, all resource files referenced in the workfile representation are copied to the `resources` folder, which is inside the local workfile folder. - - -___ - -
- - -
-Blender: Deadline support #5438 - -Add Deadline support for Blender. - - -___ - -
- - -
-Fusion: implement toggle to use Deadline plugin FusionCmd #5678 - -Fusion 17 doesn't work in DL 10.3, but FusionCmd does. It might be probably better option as headless variant.Fusion plugin seems to be closing and reopening application when worker is running on artist machine, not so with FusionCmdAdded configuration to Project Settings for admin to select appropriate Deadline plugin: - - -___ - -
- - -
-Loader tool: Refactor loader tool (for AYON) #5729 - -Refactored loader tool to new tool. Separated backend and frontend logic. Refactored logic is AYON-centric and is used only in AYON mode, so it does not affect OpenPype. The tool is also replacing library loader. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: implement matchmove publishing #5445 - -Add possibility to export multiple cameras in single `matchmove` family instance, both in `abc` and `ma`.Exposed flag 'Keep image planes' to control export of image planes. - - -___ - -
- - -
-Maya: Add optional Fbx extractors in Rig and Animation family #5589 - -This PR allows user to export control rigs(optionally with mesh) and animated rig in fbx optionally by attaching the rig objects to the two newly introduced sets. - - -___ - -
- - -
-Maya: Optional Resolution Validator for Render #5693 - -Adding optional resolution validator for maya in render family, similar to the one in Max.It checks if the resolution in render setting aligns with that in setting from the db. - - -___ - -
- - -
-Use host's node uniqueness for instance id in new publisher #5490 - -Instead of writing `instance_id` as parm or attributes on the publish instances we can, for some hosts, just rely on a unique name or path within the scene to refer to that particular instance. By doing so we fix #4820 because upon duplicating such a publish instance using the host's (DCC) functionality the uniqueness for the duplicate is then already ensured instead of attributes remaining exact same value as where to were duplicated from, making `instance_id` a non-unique value. - - -___ - -
- - -
-Max: Implementation of OCIO configuration #5499 - -Resolve #5473 Implementation of OCIO configuration for Max 2024 regarding to the update of Max 2024 - - -___ - -
- - -
-Nuke: Multiple format supports for ExtractReviewDataMov #5623 - -This PR would fix the bug of the plugin `ExtractReviewDataMov` not being able to support extensions other than `mov`. The plugin is also renamed to `ExtractReviewDataBakingStreams` as i provides multiple format supoort. - - -___ - -
- - -
-Bugfix: houdini switching context doesnt update variables #5651 - -Allows admins to have a list of vars (e.g. JOB) with (dynamic) values that will be updated on context changes, e.g. when switching to another asset or task.Using template keys is supported but formatting keys capitalization variants is not, e.g. {Asset} and {ASSET} won't workDisabling Update Houdini vars on context change feature will leave all Houdini vars unmanaged and thus no context update changes will occur.Also, this PR adds a new button in menu to update vars on demand. - - -___ - -
- - -
-Publisher: Fix report maker memory leak + optimize lookups using set #5667 - -Fixes a memory leak where resetting publisher does not clear the stored plugins for the Publish Report Maker.Also changes the stored plugins to a `set` to optimize the lookup speeds. - - -___ - -
- - -
-Add openpype_mongo command flag for testing. #5676 - -Instead of changing the environment, this command flag allows for changing the database. - - -___ - -
- - -
-Nuke: minor docstring and code tweaks for ExtractReviewMov #5695 - -Code and docstring tweaks on https://github.com/ynput/OpenPype/pull/5623 - - -___ - -
- - -
-AYON: Small settings fixes #5699 - -Small changes/fixes related to AYON settings. All foundry apps variant `13-0` has label `13.0`. Key `"ExtractReviewIntermediates"` is not mandatory in settings. - - -___ - -
- - -
-Blender: Alembic Animation loader #5711 - -Implemented loading Alembic Animations in Blender. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Missing "data" field and enabling of audio #5618 - -When updating audio containers, the field "data" was missing and the audio node was not enabled on the timeline. - - -___ - -
- - -
-Maya: Bug in validate Plug-in Path Attribute #5687 - -Overwriting list with string is causing `TypeError: string indices must be integers` in subsequent iterations, crashing the validator plugin. - - -___ - -
- - -
-General: Avoid fallback if value is 0 for handle start/end #5652 - -There's a bug on the `pyblish_functions.get_time_data_from_instance_or_context` where if `handleStart` or `handleEnd` on the instance are set to value 0 it's falling back to grabbing the handles from the instance context. Instead, the logic should be that it only falls back to the `instance.context` if the key doesn't exist.This change was only affecting me on the `handleStart`/`handleEnd` and it's unlikely it could cause issues on `frameStart`, `frameEnd` or `fps` but regardless, the `get` logic is wrong. - - -___ - -
- - -
-Fusion: added missing env vars to Deadline submission #5659 - -Environment variables discerning type of job was missing. Without this injection of environment variables won't start. - - -___ - -
- - -
-Nuke: workfile version synchronization settings fixed #5662 - -Settings for synchronizing workfile version to published products is fixed. - - -___ - -
- - -
-AYON Workfiles Tool: Open workfile changes context #5671 - -Change context when workfile is opened. - - -___ - -
- - -
-Blender: Fix remove/update in new layout instance #5679 - -Fixes an error that occurs when removing or updating an asset in a new layout instance. - - -___ - -
- - -
-AYON Launcher tool: Fix refresh btn #5685 - -Refresh button does propagate refreshed content properly. Folders and tasks are cached for 60 seconds instead of 10 seconds. Auto-refresh in launcher will refresh only actions and related data which is project and project settings. - - -___ - -
- - -
-Deadline: handle all valid paths in RenderExecutable #5694 - -This commit enhances the path resolution mechanism in the RenderExecutable function of the Ayon plugin. Previously, the function only considered paths starting with a tilde (~), ignoring other valid paths listed in exe_list. This limitation led to an empty expanded_paths list when none of the paths in exe_list started with a tilde, causing the function to fail in finding the Ayon executable.With this fix, the RenderExecutable function now correctly processes and includes all valid paths from exe_list, improving its reliability and preventing unnecessary errors related to Ayon executable location. - - -___ - -
- - -
-AYON Launcher tool: Fix skip last workfile boolean #5700 - -Skip last workfile boolean works as expected. - - -___ - -
- - -
-Chore: Explore here action can work without task #5703 - -Explore here action does not crash when task is not selected, and change error message a little. - - -___ - -
- - -
-Testing: Inject mongo_url argument earlier #5706 - -Fix for https://github.com/ynput/OpenPype/pull/5676The Mongo url is used earlier in the execution. - - -___ - -
- - -
-Blender: Add support to auto-install PySide2 in blender 4 #5723 - -Change version regex to support blender 4 subfolder. - - -___ - -
- - -
-Fix: Hardcoded main site and wrongly copied workfile #5733 - -Fixing these two issues: -- Hardcoded main site -> Replaced by `anatomy.fill_root`. -- Workfiles can sometimes be copied while they shouldn't. - - -___ - -
- - -
-Bugfix: ServerDeleteOperation asset -> folder conversion typo #5735 - -Fix ServerDeleteOperation asset -> folder conversion typo - - -___ - -
- - -
-Nuke: loaders are filtering correctly #5739 - -Variable name for filtering by extensions were not correct - it suppose to be plural. It is fixed now and filtering is working as suppose to. - - -___ - -
- - -
-Nuke: failing multiple thumbnails integration #5741 - -This handles the situation when `ExtractReviewIntermediates` (previously `ExtractReviewDataMov`) has multiple outputs, including thumbnails that need to be integrated. Previously, integrating the thumbnail representation was causing an issue in the integration process. However, we have now resolved this issue by no longer integrating thumbnails as loadable representations.NOW default is that thumbnail representation are NOT integrated (eg. they will not show up in DB > couldn't be Loaded in Loader) and no `_thumb.jpg` will be left in `render` (most likely) publish folder.IF there would be need to override this behavior, please use `project_settings/global/publish/PreIntegrateThumbnails` - - -___ - -
- - -
-AYON Settings: Fix global overrides #5745 - -The `output` dictionary that gets passed into `ayon_settings._convert_global_project_settings` gets replaced when converting the settings for `ExtractOIIOTranscode`. This results in `global` not being in the output dictionary and thus the defaults being used and not the project overrides. - - -___ - -
- - -
-Chore: AYON query functions arguments #5752 - -Fixed how `archived` argument is handled in get subsets/assets function. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Publisher: Refactor Report Maker plugin data storage to be a dict by plugin.id #5668 - -Refactor Report Maker plugin data storage to be a dict by `plugin.id`Also fixes `_current_plugin_data` type on `__init__` - - -___ - -
- - -
-Chore: Refactor Resolve into new style HostBase, IWorkfileHost, ILoadHost #5701 - -Refactor Resolve into new style HostBase, IWorkfileHost, ILoadHost - - -___ - -
- -### **Merged pull requests** - - -
-Chore: Maya reduce get project settings calls #5669 - -Re-use system settings / project settings where we can instead of requerying. - - -___ - -
- - -
-Extended error message when getting subset name #5649 - -Each Creator is using `get_subset_name` functions which collects context data and fills configured template with placeholders.If any key is missing in the template, non descriptive error is thrown.This should provide more verbose message: - - -___ - -
- - -
-Tests: Remove checks for env var #5696 - -Env var will be filled in `env_var` fixture, here it is too early to check - - -___ - -
- - - - -## [3.17.1](https://github.com/ynput/OpenPype/tree/3.17.1) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.0...3.17.1) - -### **๐Ÿ†• New features** - - -
-Unreal: Yeti support #5643 - -Implemented Yeti support for Unreal. - - -___ - -
- - -
-Houdini: Add Static Mesh product-type (family) #5481 - -This PR adds support to publish Unreal Static Mesh in Houdini as FBXQuick recap -- [x] Add UE Static Mesh Creator -- [x] Dynamic subset name like in Maya -- [x] Collect Static Mesh Type -- [x] Update collect output node -- [x] Validate FBX output node -- [x] Validate mesh is static -- [x] Validate Unreal Static Mesh Name -- [x] Validate Subset Name -- [x] FBX Extractor -- [x] FBX Loader -- [x] Update OP Settings -- [x] Update AYON Settings - - -___ - -
- - -
-Launcher tool: Refactor launcher tool (for AYON) #5612 - -Refactored launcher tool to new tool. Separated backend and frontend logic. Refactored logic is AYON-centric and is used only in AYON mode, so it does not affect OpenPype. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Use custom staging dir function for Maya renders - OP-5265 #5186 - -Check for custom staging dir when setting the renders output folder in Maya. - - -___ - -
- - -
-Colorspace: updating file path detection methods #5273 - -Support for OCIO v2 file rules integrated into the available color management API - - -___ - -
- - -
-Chore: add default isort config #5572 - -Add default configuration for isort tool - - -___ - -
- - -
-Deadline: set PATH environment in deadline jobs by GlobalJobPreLoad #5622 - -This PR makes `GlobalJobPreLoad` to set `PATH` environment in deadline jobs so that we don't have to use the full executable path for deadline to launch the dcc app. This trick should save us adding logic to pass houdini patch version and modifying Houdini deadline plugin. This trick should work with other DCCs - - -___ - -
- - -
-nuke: extract review data mov read node with expression #5635 - -Some productions might have set default values for read nodes, those settings are not colliding anymore now. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Support new publisher for colorsets validation. #5630 - -Fix `validate_color_sets` for the new publisher.In current `develop` the repair option does not appear due to wrong error raising. - - -___ - -
- - -
-Houdini: Camera Loader fix mismatch for Maya cameras #5584 - -This PR adds -- A workaround to match Maya render mask in Houdini -- `SetCameraResolution` inventory action -- set camera resolution when loading or updating camera - - -___ - -
- - -
-Nuke: fix set colorspace on writes #5634 - -Colorspace is set correctly to any write node created from publisher. - - -___ - -
- - -
-TVPaint: Fix review family extraction #5637 - -Extractor marks representation of review instance with review tag. - - -___ - -
- - -
-AYON settings: Extract OIIO transcode settings #5639 - -Output definitions of Extract OIIO transcode have name to match OpenPype settings, and the settings are converted to dictionary in settings conversion. - - -___ - -
- - -
-AYON: Fix task type short name conversion #5641 - -Convert AYON task type short name for OpenPype correctly. - - -___ - -
- - -
-colorspace: missing `allowed_exts` fix #5646 - -Colorspace module is not failing due to missing `allowed_exts` attribute. - - -___ - -
- - -
-Photoshop: remove trailing underscore in subset name #5647 - -If {layer} placeholder is at the end of subset name template and not used (for example in `auto_image` where separating it by layer doesn't make any sense) trailing '_' was kept. This updates cleaning logic and extracts it as it might be similar in regular `image` instance. - - -___ - -
- - -
-traypublisher: missing `assetEntity` in context data #5648 - -Issue with missing `assetEnity` key in context data is not problem anymore. - - -___ - -
- - -
-AYON: Workfiles tool save button works #5653 - -Fix save as button in workfiles tool.(It is mystery why this stopped to work??) - - -___ - -
- - -
-Max: bug fix delete items from container #5658 - -Fix the bug shown when clicking "Delete Items from Container" and selecting nothing and press ok. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Chore: Remove unused functions from Fusion integration #5617 - -Cleanup unused code from Fusion integration - - -___ - -
- -### **Merged pull requests** - - -
-Increase timout for deadline test #5654 - -DL picks up jobs quite slow, so bump up delay. - - -___ - -
- - - - -## [3.17.0](https://github.com/ynput/OpenPype/tree/3.17.0) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.7...3.17.0) - -### **๐Ÿš€ Enhancements** - - -
-Chore: Remove schema from OpenPype root #5355 - -Remove unused schema directory in root of repository which was moved inside openpype/pipeline/schema. - - -___ - -
- - -
-Igniter: Allow custom Qt scale factor rounding policy #5554 - -Do not force `PassThrough` rounding policy if different policy is defined via env variable. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Chore: Lower urllib3 to support older OpenSSL #5538 - -Lowered `urllib3` to `1.26.16` to support older OpenSSL. - - -___ - -
- - -
-Chore: Do not try to add schema to zip files #5557 - -Do not add `schema` folder to zip file. This fixes issue cause by https://github.com/ynput/OpenPype/pull/5355 . - - -___ - -
- - -
-Chore: Lower click dependency version #5629 - -Lower click version to support older versions of python. - - -___ - -
- -### **Merged pull requests** - - -
-Bump certifi from 2023.5.7 to 2023.7.22 #5351 - -Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.5.7 to 2023.7.22. -
-Commits - -
-
- - -[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2023.5.7&new-version=2023.7.22)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) - -You can trigger a rebase of this PR by commenting `@dependabot rebase`. - -[//]: # (dependabot-automerge-start) -[//]: # (dependabot-automerge-end) - ---- - -
-Dependabot commands and options -
- -You can trigger Dependabot actions by commenting on this PR: -- `@dependabot rebase` will rebase this PR -- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it -- `@dependabot merge` will merge this PR after your CI passes on it -- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it -- `@dependabot cancel merge` will cancel a previously requested merge and block automerging -- `@dependabot reopen` will reopen this PR if it is closed -- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually -- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) -You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/ynput/OpenPype/network/alerts). - -
- -> **Note** -> Automatic rebases have been disabled on this pull request as it has been open for over 30 days. - -___ - -
- - - - -## [3.16.7](https://github.com/ynput/OpenPype/tree/3.16.7) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.6...3.16.7) - -### **๐Ÿ†• New features** - - -
-Maya: Extract active view as thumbnail when no thumbnail set #5426 - -This sets the Maya instance's thumbnail to the current active view if no thumbnail was set yet. - - -___ - -
- - -
-Maya: Implement USD publish and load using native `mayaUsdPlugin` #5573 - -Implement Creator and Loaders for extraction and loading of USD files using Maya's own `mayaUsdPlugin`.Also adds support to load a `usd` file into an Arnold Standin (`aiStandin`) and assigning looks to it. - - -___ - -
- - -
-AYON: Ignore separated modules #5619 - -Do not load already separated modules from default directory. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Reduce amount of code for Collect Looks #5253 - -- Refactor `get_file_node_files` because popping from `paths` by index should have been done in reversed order anyway. It's now changed to not need popping at all. -- Removed unused `RENDERER_NODE_TYPES` and if-branch which collected `node_attrs` list which was unused + collected members which was also done outside of the if branch and thus generated no extra data. -- Collected all materials from look set attributes at once instead of multiple queries -- Collected all file nodes in history from a single query instead of per type -- Restructured assignment of `instance.data["resources"]` to be more readable -- Cached `PXR_NODES` only ones (Note: plugin load is checked on discovery of the collect look plugin) instead of querying plugin load and its nodes per file node per attribute -- Removed some debug logs or combined some messages - - -___ - -
- - -
-AYON: Mark deprecated settings in Maya #5627 - -Added deprecated info to docstrings of maya colormanagement settings.Resolves: https://github.com/ynput/OpenPype/issues/5556 - - -___ - -
- - -
-Max: switching versions of maxScene maintain parentage/links with the loaders #5424 - -When using scene inventory to manage or update the version of the loading objects, the linked modifiers or parentage of the objects would be kept.Meanwhile, loaded objects from all loaders no longer parented to the container with OP Data. - - -___ - -
- - -
-3ds max: small tweaks to obj extractor and model publishing flow #5605 - -There migh be situation where OBJ Extractor passes without failure, but no obj file is produced. This is adding simple check directly into the extractor to catch it earlier then in the integration phase. Also switched `Validate USD Plugin` to optional, because it was always run no matter if the Extract USD was enabled or not, hindering testing (and publishing). - - -___ - -
- - -
-TVPaint: Plugin can be reopened #5610 - -TVPaint plugin can be reopened. - - -___ - -
- - -
-Maya: Remove context prompt #5632 - -More of a plea than a PR, but could we please remove the context prompt in Maya when switching tasks? - - -___ - -
- - -
-General: Create a desktop icon is checked #5636 - -In OP Installer `Create a desktop icon` is checked by default. -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Extract look is not AYON compatible - OP-5375 #5341 - -The textures that would use hardlinking are going through texture processors. Currently all texture processors are hardcoded to copy texture instead of respecting the settings of forcing to copy.The texture processors were last modified 4 months ago, so effectively all clients that are on any pipeline updated in the last 4 months wont be utilizing hardlinking at all, since the hardcoded texture processors will copy texture no matter the OS.This opts for completely disabling the hardlinking feature, while we figure out what to do about it. - - -___ - -
- - -
-Maya: Multiverse USD Override inherit from correct new style creator #5566 - -Fix Creator for Multiverse USD Override by inheriting from correct new style creator class type - - -___ - -
- - -
-Max: Bug Fix Alembic Loaders with Ornatrix #5434 - -Bugfix the alembic loader with both ornatrix alembic and max alembic supportsAdd the ornatrix alembic loaders for loading the alembic with Ornatrix-related modifiers. - - -___ - -
- - -
-AYON: Avoid creation of duplicated links #5593 - -Handle cases when an existing link should be recreated and do not create the same link multitple times during single publishing. - - -___ - -
- - -
-Extract Review: Multilayer specification for ffmpeg #5613 - -Extract review is specifying layer name when exr is multilayer. - - -___ - -
- - -
-Fussion: added support for Fusion 17 #5614 - -Fusion 17 still uses Python 3.6 which causes issues with some our delivered libraries. Vendorized necessary set for Python 3.6 - - -___ - -
- - -
-Publisher: Fix screenshot widget #5615 - -Use correct super method name.EDITED:Removed fade animation which is not triggered at some cases, e.g. in Nuke the animation does not start. I do expect that is caused by `exec_` on the dialog, which blocks event processing to the animation, even when I've added the window as parent it still didn't trigger registered callback.Modified how the "empty" space is not filled by using paths instead of clear mode on painter. Added render hints to add antialiasing. - - -___ - -
- - -
-Photoshop: auto_images without alpha will not fail #5620 - -ExtractReview caused issue on `auto_image` instance without alpha channel, this fixes it. - - -___ - -
- - -
-Fix - _id key used instead of id in get_last_version_by_subset_name #5626 - -Just 'id' is not returned because value in fields. Caused KeyError. - - -___ - -
- - -
-Bugfix: create symlinks for ssl libs on Centos 7 #5633 - -Docker build was missing `libssl.1.1.so` and `libcrypto.1.1.so` symlinks needed by the executable itself, because Python is now explicitly built with OpenSSL 1.1.1 - - -___ - -
- -### **๐Ÿ“ƒ Documentation** - - -
-Documentation/local settings #5102 - -I completed the "Working with local settings" page. I updated the screenshot, wrote an explanation for each empty category, and if available, linked the more detailed pages already existing. I also added the "Environments" category. - - -___ - -
- - - - -## [3.16.6](https://github.com/ynput/OpenPype/tree/3.16.6) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.5...3.16.6) - -### **๐Ÿ†• New features** - - -
-Workfiles tool: Refactor workfiles tool (for AYON) #5550 - -Refactored workfiles tool to new tool. Separated backend and frontend logic. Refactored logic is AYON-centric and is used only in AYON mode, so it does not affect OpenPype. - - -___ - -
- - -
-AfterEffects: added validator for missing files in FootageItems #5590 - -Published composition in AE could contain multiple FootageItems as a layers. If FootageItem contains imported file and it doesn't exist, render triggered by Publish process will silently fail and no output is generated. This could cause failure later in the process with unclear reason. (In `ExtractReview`).This PR adds validation to protect from this. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Yeti Cache Include viewport preview settings from source #5561 - -When publishing and loading yeti caches persist the display output and preview colors + settings to ensure consistency in the view - - -___ - -
- - -
-Houdini: validate colorspace in review rop #5322 - -Adding a validator that checks if 'OCIO Colorspace' parameter on review rop was set to a valid value.It is a step towards managing colorspace in review ropvalid values are the ones in the dropdown menuthis validator also provides some helper actions This PR is related to #4836 and #4833 - - -___ - -
- - -
-Colorspace: adding abstraction of publishing related functions #5497 - -The functionality of Colorspace has been abstracted for greater usability. - - -___ - -
- - -
-Nuke: removing redundant workfile colorspace attributes #5580 - -Nuke root workfile colorspace data type knobs are long time configured automatically via config roles or the default values are also working well. Therefore there is no need for pipeline managed knobs. - - -___ - -
- - -
-Ftrack: Less verbose logs for Ftrack integration in artist facing logs #5596 - -- Reduce artist-facing logs for component integration for Ftrack -- Avoid "Comment is not set" log in artist facing report for Kitsu and Ftrack -- Remove info log about `ffprobe` inspecting a file (changed to debug log) -- interesting to see however that it ffprobes the same jpeg twice - but maybe once for thumbnail? - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Fix rig validators for new out_SET and controls_SET names #5595 - -Fix usage of `out_SET` and `controls_SET` since #5310 because they can now be prefixed by the subset name. - - -___ - -
- - -
-TrayPublisher: set default frame values to sequential data #5530 - -We are inheriting default frame handles and fps data either from project or setting them to 0. This is just for case a production will decide not to injest the sequential representations with asset based metadata. - - -___ - -
- - -
-Publisher: Screenshot opacity value fix #5576 - -Fix opacity value. - - -___ - -
- - -
-AfterEffects: fix imports of image sequences #5581 - -#4602 broke imports of image sequences. - - -___ - -
- - -
-AYON: Fix representation context conversion #5591 - -Do not fix `"folder"` key in representation context until it is needed. - - -___ - -
- - -
-ayon-nuke: default factory to lists #5594 - -Default factory were missing in settings schemas for complicated objects like lists and it was causing settings to be failing saving. - - -___ - -
- - -
-Maya: Fix look assigner showing no asset if 'not found' representations are present #5597 - -Fix Maya Look assigner failing to show any content if it finds an invalid container for which it can't find the asset in the current project. (This can happen when e.g. loading something from a library project).There was logic already to avoid this but there was a bug where it used variable `_id` which did not exist and likely had to be `asset_id`.I've fixed that and improved the logged message a bit, e.g.: -``` -// Warning: openpype.hosts.maya.tools.mayalookassigner.commands : Id found on 22 nodes for which no asset is found database, skipping '641d78ec85c3c5b102e836b0' -``` -Example not found representation in Loader:The issue isn't necessarily related to NOT FOUND representations but in essence boils down to finding nodes with asset ids that do not exist in the current project which could very well just be local meshes in your scene.**Note:**I've excluded logging the nodes themselves because that tends to be a very long list of nodes. Only downside to removing that is that it's unclear which nodes are related to that `id`. If there are any ideas on how to still provide a concise informational message about that that'd be great so I could add it. Things I had considered: -- Report the containers, issue here is that it's about asset ids on nodes which don't HAVE to be in containers - it could be local geometry -- Report the namespaces, issue here is that it could be nodes without namespaces (plus potentially not about ALL nodes in a namespace) -- Report the short names of the nodes; it's shorter and readable but still likely a lot of nodes.@tokejepsen @LiborBatek any other ideas? - - -___ - -
- - -
-Photoshop: fixed blank Flatten image #5600 - -Flatten image is simplified publishing approach where all visible layers are "flatten" and published together. This image could be used as a reference etc.This is implemented by auto creator which wasn't updated after first publish. This would result in missing newly created layers after `auto_image` instance was created. - - -___ - -
- - -
-Blender: Remove Hardcoded Subset Name for Reviews #5603 - -Fixes hardcoded subset name for Reviews in Blender. - - -___ - -
- - -
-TVPaint: Fix tool callbacks #5608 - -Do not wait for callback to finish. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Chore: Remove unused variables and cleanup #5588 - -Removing some unused variables. In some cases the unused variables _seemed like they should've been used - maybe?_ so please **double check the code whether it doesn't hint to an already existing bug**.Also tweaked some other small bugs in code + tweaked logging levels. - - -___ - -
- -### **Merged pull requests** - - -
-Chore: Loader log deprecation warning for 'fname' attribute #5587 - -Since https://github.com/ynput/OpenPype/pull/4602 the `fname` attribute on the `LoaderPlugin` should've been deprecated and set for removal over time. However, no deprecation warning was logged whatsoever and thus one usage appears to have sneaked in (fixed with this PR) and a new one tried to sneak in with a recent PR - - -___ - -
- - - - -## [3.16.5](https://github.com/ynput/OpenPype/tree/3.16.5) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.4...3.16.5) - -### **๐Ÿ†• New features** - - -
-Attribute Definitions: Multiselection enum def #5547 - -Added `multiselection` option to `EnumDef`. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Farm: adding target collector #5494 - -Enhancing farm publishing workflow. - - -___ - -
- - -
-Maya: Optimize validate plug-in path attributes #5522 - -- Optimize query (use `cmds.ls` once) -- Add Select Invalid action -- Improve validation report -- Avoid "Unknown object type" errors - - -___ - -
- - -
-Maya: Remove Validate Instance Attributes plug-in #5525 - -Remove Validate Instance Attributes plug-in. - - -___ - -
- - -
-Enhancement: Tweak logging for artist facing reports #5537 - -Tweak the logging of publishing for global, deadline, maya and a fusion plugin to have a cleaner artist-facing report. -- Fix context being reported correctly from CollectContext -- Fix ValidateMeshArnoldAttributes: fix when arnold is not loaded, fix applying settings, fix for when ai attributes do not exist - - -___ - -
- - -
-AYON: Update settings #5544 - -Updated settings in AYON addons and conversion of AYON settings in OpenPype. - - -___ - -
- - -
-Chore: Removed Ass export script #5560 - -Removed Arnold render script, which was obsolete and unused. - - -___ - -
- - -
-Nuke: Allow for knob values to be validated against multiple values. #5042 - -Knob values can now be validated against multiple values, so you can allow write nodes to be `exr` and `png`, or `16-bit` and `32-bit`. - - -___ - -
- - -
-Enhancement: Cosmetics for Higher version of publish already exists validation error #5190 - -Fix double spaces in message.Example output **after** the PR: - - -___ - -
- - -
-Nuke: publish existing frames on farm #5409 - -This PR proposes adding a fourth option in Nuke render publish called "Use Existing Frames - Farm". This would be useful when the farm is busy or when the artist lacks enough farm licenses. Additionally, some artists prefer rendering on the farm but still want to check frames before publishing.By adding the "Use Existing Frames - Farm" option, artists will have more flexibility and control over their render publishing process. This enhancement will streamline the workflow and improve efficiency for Nuke users. - - -___ - -
- - -
-Unreal: Create project in temp location and move to final when done #5476 - -Create Unreal project in local temporary folder and when done, move it to final destination. - - -___ - -
- - -
-TrayPublisher: adding audio product type into default presets #5489 - -Adding Audio product type into default presets so anybody can publish audio to their shots. - - -___ - -
- - -
-Global: avoiding cleanup of flagged representation #5502 - -Publishing folder can be flagged as persistent at representation level. - - -___ - -
- - -
-General: missing tag could raise error #5511 - -- avoiding potential situation where missing Tag key could raise error - - -___ - -
- - -
-Chore: Queued event system #5514 - -Implemented event system with more expected behavior of event system. If an event is triggered during other event callback, it is not processed immediately but waits until all callbacks of previous events are done. The event system also allows to not trigger events directly once `emit_event` is called which gives option to process events in custom loops. - - -___ - -
- - -
-Publisher: Tweak log message to provide plugin name after "Plugin" #5521 - -Fix logged message for settings automatically applied to plugin attributes - - -___ - -
- - -
-Houdini: Improve VDB Selection #5523 - -Improves VDB selection if selection is `SopNode`: return the selected sop nodeif selection is `ObjNode`: get the output node with the minimum 'outputidx' or the node with display flag - - -___ - -
- - -
-Maya: Refactor/tweak Validate Instance In same Context plug-in #5526 - -- Chore/Refactor: Re-use existing select invalid and repair actions -- Enhancement: provide more elaborate PublishValidationError report -- Bugfix: fix "optional" support by using `OptionalPyblishPluginMixin` base class. - - -___ - -
- - -
-Enhancement: Update houdini main menu #5527 - -This PR adds two updates: -- dynamic main menu -- dynamic asset name and task - - -___ - -
- - -
-Houdini: Reset FPS when clicking Set Frame Range #5528 - -_Similar to Maya,_ Make `Set Frame Range` resets FPS, issue https://github.com/ynput/OpenPype/issues/5516 - - -___ - -
- - -
-Enhancement: Deadline plugins optimize, cleanup and fix optional support for validate deadline pools #5531 - -- Fix optional support of validate deadline pools -- Query deadline webservice only once per URL for verification, and once for available deadline pools instead of for every instance -- Use `deadlineUrl` in `instance.data` when validating pools if it is set. -- Code cleanup: Re-use existing `requests_get` implementation - - -___ - -
- - -
-Chore: PowerShell script for docker build #5535 - -Added PowerShell script to run docker build. - - -___ - -
- - -
-AYON: Deadline expand userpaths in executables list #5540 - -Expande `~` paths in executables list. - - -___ - -
- - -
-Chore: Use correct git url #5542 - -Fixed github url in README.md. - - -___ - -
- - -
-Chore: Create plugin does not expect system settings #5553 - -System settings are not passed to initialization of create plugin initialization (and `apply_settings`). - - -___ - -
- - -
-Chore: Allow custom Qt scale factor rounding policy #5555 - -Do not force `PassThrough` rounding policy if different policy is defined via env variable. - - -___ - -
- - -
-Houdini: Fix outdated containers pop-up on opening last workfile on launch #5567 - -Fix Houdini not showing outdated containers pop-up on scene open when launching with last workfile argument - - -___ - -
- - -
-Houdini: Improve errors e.g. raise PublishValidationError or cosmetics #5568 - -Improve errors e.g. raise PublishValidationError or cosmeticsThis also fixes the Increment Current File plug-in since due to an invalid import it was previously broken - - -___ - -
- - -
-Fusion: Code updates #5569 - -Update fusion code which contains obsolete code. Removed `switch_ui.py` script from fusion with related script in scripts. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Validate Shape Zero fix repair action + provide informational artist-facing report #5524 - -Refactor to PublishValidationError to allow the RepairAction to work + provide informational report message - - -___ - -
- - -
-Maya: Fix attribute definitions for `CreateYetiCache` #5574 - -Fix attribute definitions for `CreateYetiCache` - - -___ - -
- - -
-Max: Optional Renderable Camera Validator for Render Instance #5286 - -Optional validation to check on renderable camera being set up correctly for deadline submission.If not being set up correctly, it wont pass the validation and user can perform repair actions. - - -___ - -
- - -
-Max: Adding custom modifiers back to the loaded objects #5378 - -The custom parameters OpenpypeData doesn't show in the loaded container when it is being loaded through the loader. - - -___ - -
- - -
-Houdini: Use default_variant to Houdini Node TAB Creator #5421 - -Use the default variant of the creator plugins on the interactive creator from the TAB node search instead of hard-coding it to `Main`. - - -___ - -
- - -
-Nuke: adding inherited colorspace from instance #5454 - -Thumbnails are extracted with inherited colorspace collected from rendering write node. - - -___ - -
- - -
-Add kitsu credentials to deadline publish job #5455 - -This PR hopefully fixes this issue #5440 - - -___ - -
- - -
-AYON: Fill entities during editorial #5475 - -Fill entities and update template data on instances during extract AYON hierarchy. - - -___ - -
- - -
-Ftrack: Fix version 0 when integrating to Ftrack - OP-6595 #5477 - -Fix publishing version 0 to Ftrack. - - -___ - -
- - -
-OCIO: windows unc path support in Nuke and Hiero #5479 - -Hiero and Nuke is not supporting windows unc path formatting in OCIO environment variable. - - -___ - -
- - -
-Deadline: Added super call to init #5480 - -DL 10.3 requires plugin inheriting from DeadlinePlugin to call super's **init** explicitly. - - -___ - -
- - -
-Nuke: fixing thumbnail and monitor out root attributes #5483 - -Nuke Root Colorspace settings for Thumbnail and Monitor Out schema was gradually changed between version 12, 13, 14 and we needed to address those changes individually for particular version. - - -___ - -
- - -
-Nuke: fixing missing `instance_id` error #5484 - -Workfiles with Instances created in old publisher workflow were rising error during converting method since they were missing `instance_id` key introduced in new publisher workflow. - - -___ - -
- - -
-Nuke: existing frames validator is repairing render target #5486 - -Nuke is now correctly repairing render target after the existing frames validator finds missing frames and repair action is used. - - -___ - -
- - -
-added UE to extract burnins families #5487 - -This PR fixes missing burnins in reviewables when rendering from UE. -___ - -
- - -
-Harmony: refresh code for current Deadline #5493 - -- Added support in Deadline Plug-in for new versions of Harmony, in particular version 21 and 22. -- Remove review=False flag on render instance -- Add farm=True flag on render instance -- Fix is_in_tests function call in Harmony Deadline submission plugin -- Force HarmonyOpenPype.py Deadline Python plug-in to py3 -- Fix cosmetics/hound in HarmonyOpenPype.py Deadline Python plug-in - - -___ - -
- - -
-Publisher: Fix multiselection value #5505 - -Selection of multiple instances in Publisher does not cause that all instances change all publish attributes to the same value. - - -___ - -
- - -
-Publisher: Avoid warnings on thumbnails if source image also has alpha channel #5510 - -Avoids the following warning from `ExtractThumbnailFromSource`: -``` -// pyblish.ExtractThumbnailFromSource : oiiotool WARNING: -o : Can't save 4 channels to jpeg... saving only R,G,B -``` - - - -___ - -
- - -
-Update ayon-python-api #5512 - -Update ayon python api and related callbacks. - - -___ - -
- - -
-Max: Fixing the bug of falling back to use workfile for Arnold or any renderers except Redshift #5520 - -Fix the bug of falling back to use workfile for Arnold - - -___ - -
- - -
-General: Fix Validate Publish Dir Validator #5534 - -Nonsensical "family" key was used instead of real value (as 'render' etc.) which would result in wrong translation of intermediate family names.Updated docstring. - - -___ - -
- - -
-have the addons loading respect a custom AYON_ADDONS_DIR #5539 - -When using a custom AYON_ADDONS_DIR environment variable that variable is used in the launcher correctly and downloads and extracts addons to there, however when running Ayon does not respect this environment variable - - -___ - -
- - -
-Deadline: files on representation cannot be single item list #5545 - -Further logic expects that single item files will be only 'string' not 'list' (eg. repre["files"] = "abc.exr" not repre["files"] = ["abc.exr"].This would cause an issue in ExtractReview later.This could happen if DL rendered single frame file with different frame value. - - -___ - -
- - -
-Webpublisher: better encode list values for click #5546 - -Targets could be a list, original implementation pushed it as a separate items, it must be added as `--targets webpulish --targets filepublish`.`wepublish_routes` handles triggering from UI, changes in `publish_functions` handle triggering from cmd (for tests, api access). - - -___ - -
- - -
-Houdini: Introduce imprint function for correct version in hda loader #5548 - -Resolve #5478 - - -___ - -
- - -
-AYON: Fill entities during editorial (2) #5549 - -Fix changes made in https://github.com/ynput/OpenPype/pull/5475. - - -___ - -
- - -
-Max: OP Data updates in Loaders #5563 - -Fix the bug on the loaders not being able to load the objects when iterating key and values with the dict.Max prefers list over the list in dict. - - -___ - -
- - -
-Create Plugins: Better check of overriden '__init__' method #5571 - -Create plugins do not log warning messages about each create plugin because of wrong `__init__` method check. - - -___ - -
- -### **Merged pull requests** - - -
-Tests: fix unit tests #5533 - -Fixed failing tests.Updated Unreal's validator to match removed general one which had a couple of issues fixed. - - -___ - -
- - - - -## [3.16.4](https://github.com/ynput/OpenPype/tree/3.16.4) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.3...3.16.4) - -### **๐Ÿ†• New features** - - -
-Feature: Download last published workfile specify version #4998 - -Setting `workfile_version` key to hook's `self.launch_context.data` allow you to specify the workfile version you want sync service to download if none is matched locally. This is helpful if the last version hasn't been correctly published/synchronized, and you want to recover the previous one (or some you'd like).Version could be set in two ways: -- OP's absolute version, matching the `version` index in DB. -- Relative version in reverse order from the last one: `-2`, `-3`...I don't know where I should write documentation about that. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: allow not creation of group for Import loaders #5427 - -This PR enhances previous one. All ReferenceLoaders could not wrap imported products into explicit group.Also `Import` Loaders have same options. Control for this is separate in Settings, eg. Reference might wrap loaded items in group, `Import` might not. - - -___ - -
- - -
-3dsMax: Settings for Ayon #5388 - -Max Addon Setting for Ayon - - -___ - -
- - -
-General: Navigation to Folder from Launcher #5404 - -Adds an action in launcher to open the directory of the asset. - - -___ - -
- - -
-Chore: Default variant in create plugin #5429 - -Attribute `default_variant` on create plugins always returns string and if default variant is not filled other ways how to get one are implemented. - - -___ - -
- - -
-Publisher: Thumbnail widget enhancements #5439 - -Thumbnails widget in Publisher has new 3 options to choose from: Paste (from clipboard), Take screenshot and Browse. Clear button and new options are not visible by default, user must expand options button to show them. - - -___ - -
- - -
-AYON: Update ayon api to '0.3.5' #5460 - -Updated ayon-python-api to 0.3.5. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-AYON: Apply unknown ayon settings first #5435 - -Settings of custom addons are available in converted settings. - - -___ - -
- - -
-Maya: Fix wrong subset name of render family in deadline #5442 - -New Publisher is creating different subset names than previously which resulted in duplication of `render` string in final subset name of `render` family published on Deadline.This PR solves that, it also fixes issues with legacy instances from old publisher, it matches the subset name as was before.This solves same issue in Max implementation. - - -___ - -
- - -
-Maya: Fix setting of version to workfile instance #5452 - -If there are multiple instances of renderlayer published, previous logic resulted in unpredictable rewrite of instance family to 'workfile' if `Sync render version with workfile` was on. - - -___ - -
- - -
-Maya: Context plugin shouldn't be tied to family #5464 - -`Maya Current File` collector was tied to `workfile` unnecessary. It should run even if `workile` instance is not being published. - - -___ - -
- - -
-Unreal: Fix loading hero version for static and skeletal meshes #5393 - -Fixed a problem with loading hero versions for static ans skeletal meshes. - - -___ - -
- - -
-TVPaint: Fix 'repeat' behavior #5412 - -Calculation of frames for repeat behavior is working correctly. - - -___ - -
- - -
-AYON: Thumbnails cache and api prep #5437 - -Moved thumbnails cache from ayon python api to OpenPype and prepare AYON thumbnail resolver for new api functions. Current implementation should work with old and new ayon-python-api. - - -___ - -
- - -
-Nuke: Name of the Read Node should be updated correctly when switching versions or assets. #5444 - -Bug fixing of the read node's name not being updated correctly when setting version or switching asset. - - -___ - -
- - -
-Farm publishing: asymmetric handles fixed #5446 - -Handles are now set correctly on farm published product version if asymmetric were set to shot attributes. - - -___ - -
- - -
-Scene Inventory: Provider icons fix #5450 - -Fix how provider icons are accessed in scene inventory. - - -___ - -
- - -
-Fix typo on Deadline OP plugin name #5453 - -Surprised that no one has hit this bug yet... but it seems like there was a typo on the name of the OP Deadline plugin when submitting jobs to it. - - -___ - -
- - -
-AYON: Fix version attributes update #5472 - -Fixed updates of attribs in AYON mode. - - -___ - -
- -### **Merged pull requests** - - -
-Added missing defaults for import_loader #5447 - - -___ - -
- - -
-Bug: Local settings don't open on 3.14.7 #5220 - -### Before posting a new ticket, have you looked through the documentation to find an answer? - -Yes I have - -### Have you looked through the existing tickets to find any related issues ? - -Not yet - -### Author of the bug - -@FadyFS - -### Version - -3.15.11-nightly.3 - -### What platform you are running OpenPype on? - -Linux / Centos - -### Current Behavior: - -the previous behavior (bug) : -![image](https://github.com/quadproduction/OpenPype/assets/135602303/09bff9d5-3f8b-4339-a1e5-30c04ade828c) - - -### Expected Behavior: - -![image](https://github.com/quadproduction/OpenPype/assets/135602303/c505a103-7965-4796-bcdf-73bcc48a469b) - - -### What type of bug is it ? - -Happened only once in a particular configuration - -### Which project / workfile / asset / ... - -open settings with 3.14.7 - -### Steps To Reproduce: - -1. Run openpype on the 3.15.11-nightly.3 version -2. Open settings in 3.14.7 version - -### Relevant log output: - -_No response_ - -### Additional context: - -_No response_ - -___ - -
- - -
-Tests: Add automated targets for tests #5443 - -Without it plugins with 'automated' targets won't be triggered (eg `CloseAE` etc.) - - -___ - -
- - - - -## [3.16.3](https://github.com/ynput/OpenPype/tree/3.16.3) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.2...3.16.3) - -### **๐Ÿ†• New features** - - -
-AYON: 3rd party addon usage #5300 - -Prepare OpenPype code to be able use `ayon-third-party` addon which supply ffmpeg and OpenImageIO executables. Because they both can support to define custom arguments (more than one) a new functions were needed to supply.New functions are `get_ffmpeg_tool_args` and `get_oiio_tool_args`. They work similar to previous but instead of string are returning list of strings. All places using previous functions `get_ffmpeg_tool_path` and `get_oiio_tool_path` are now using new ones. They should be backwards compatible and even with addon if returns single argument. - - -___ - -
- - -
-AYON: Addon settings in OpenPype #5347 - -Moved settings addons to OpenPype server addon. Modified create package to create zip files for server for each settings addon and for openpype addon. - - -___ - -
- - -
-AYON: Add folder to template data #5417 - -Added `folder` to template data, so `{folder[name]}` can be used in templates. - - -___ - -
- - -
-Option to start versioning from 0 #5262 - -This PR adds a settings option to start all versioning from 0.This PR will replace #4455. - - -___ - -
- - -
-Ayon: deadline implementation #5321 - -Quick implementation of deadline in Ayon. New Ayon plugin added for Deadline repository - - -___ - -
- - -
-AYON: Remove AYON launch logic from OpenPype #5348 - -Removed AYON launch logic from OpenPype. The logic is outdated at this moment and is replaced by `ayon-launcher`. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Bug: Error on multiple instance rig with maya #5310 - -I change endswith method by startswith method because the set are automacaly name out_SET, out_SET1, out_SET2 ... - - -___ - -
- - -
-Applications: Use prelaunch hooks to extract environments #5387 - -Environment variable preparation is based on prelaunch hooks. This should allow to pass OCIO environment variables to farm jobs. - - -___ - -
- - -
-Applications: Launch hooks cleanup #5395 - -Use `set` instead of `list` for filtering attributes in launch hooks. Celaction hooks dir does not contain `__init__.py`. Celaction prelaunch hook is reusing `CELACTION_ROOT_DIR`. Launch hooks are using full import from `openpype.lib.applications`. - - -___ - -
- - -
-Applications: Environment variables order #5245 - -Changed order of set environment variables. First are set context environment variables and then project environment overrides. Also asset and task environemnt variables are optional. - - -___ - -
- - -
-Autosave preferences can be read after Nuke opens the script #5295 - -Looks like I need to open the script in Nuke to be able to correctly load the autosave preferences.This PR reads the Nuke script in context, and offers owerwriting the current script with autosaved one if autosave exists. - - -___ - -
- - -
-Resolve: Update with compatible resolve version and latest docs #5317 - -Missing information about compatible Resolve version and latest docs from https://github.com/ynput/OpenPype/tree/develop/openpype/hosts/resolve - - -___ - -
- - -
-Chore: Remove deprecated functions #5323 - -Removed functions/classes that are deprecated and marked to be removed. - - -___ - -
- - -
-Nuke Render and Prerender nodes Process Order - OP-3555 #5332 - -This PR exposes control over the order of processing of the instances, by sorting the instances created. The sorting happens on the `render_order` and subset name. If the knob `render_order` is found on the instance, we'll sort by that first before sorting by subset name.`render_order` instances are processed before nodes without `render_order`. This could be extended in the future by querying other knobs but I dont know of a usecase for this.Hardcoded the creator `order` attribute of the `prerender` class to be before the `render`. Could be exposed to the user/studio but dont know of a use case for this. - - -___ - -
- - -
-Unreal: Python Environment Improvements #5344 - -Automatically set `UE_PYTHONPATH` as `PYTHONPATH` when launching Unreal. - - -___ - -
- - -
-Unreal: Custom location for Unreal Ayon Plugin #5346 - -Added a new environment variable `AYON_BUILT_UNREAL_PLUGIN` to set an already existing and built Ayon Plugin for Unreal. - - -___ - -
- - -
-Unreal: Better handling of Exceptions in UE Worker threads #5349 - -Implemented a new `UEWorker` base class to handle exception during the execution of UE Workers. - - -___ - -
- - -
-Houdini: Add farm toggle on creation menu #5350 - -Deadline Farm publishing and Rendering for Houdini was possible with this PR #4825 farm publishing is enabled by default some ROP nodes which may surprise new users (like me).I think adding a toggle (on by default) on creation UI is better so that users will be aware that there's a farm option for this publish instance.ROPs Modified : -- [x] Mantra ROP -- [x] Karma ROP -- [x] Arnold ROP -- [x] Redshift ROP -- [x] Vray ROP - - -___ - -
- - -
-Ftrack: Sync to avalon settings #5353 - -Added roles settings for sync to avalon action. - - -___ - -
- - -
-Chore: Schemas inside OpenPype #5354 - -Moved/copied schemas from repository root inside openpype/pipeline. - - -___ - -
- - -
-AYON: Addons creation enhancements #5356 - -Enhanced AYON addons creation. Fix issue with `Pattern` typehint. Zip filenames contain version. OpenPype package is skipping modules that are already separated in AYON. Updated settings of addons. - - -___ - -
- - -
-AYON: Update staging icons #5372 - -Updated staging icons for staging mode. - - -___ - -
- - -
-Enhancement: Houdini Update pointcache labels #5373 - -To me it's logical to find pointcaches types listed one after another, but they were named differentlySo, I made this PR to update their labels - - -___ - -
- - -
-nuke: split write node product instance features #5389 - -Improving Write node product instances by allowing precise activation of specific features. - - -___ - -
- - -
-Max: Use the empty modifiers in container to store AYON Parameter #5396 - -Instead of adding AYON/OP Parameter along with other attributes inside the container, empty modifiers would be created to store AYON/OP custom attributes - - -___ - -
- - -
-AfterEffects: Removed unused imports #5397 - -Removed unused import from extract local render plugin file. - - -___ - -
- - -
-Nuke: adding BBox knob type to settings #5405 - -Nuke knob types in settings having new `Box` type for reposition nodes like Crop or Reformat. - - -___ - -
- - -
-SyncServer: Existence of module is optional #5413 - -Existence of SyncServer module is optional and not required. Added `sync_server` module back to ignored modules when openpype addon is created for AYON. Command `syncserver` is marked as deprecated and redirected to sync server cli. - - -___ - -
- - -
-Webpublisher: Self contain test publish logic #5414 - -Moved test logic of publishing to webpublisher. Simplified `remote_publish` to remove webpublisher specific logic. - - -___ - -
- - -
-Webpublisher: Cleanup targets #5418 - -Removed `remote` target from webpublisher and replaced it with 2 targets `webpublisher` and `automated`. - - -___ - -
- - -
-nuke: update server addon settings with box #5419 - -updtaing nuke ayon server settings for Box option in knob types. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: fix validate frame range on review attached to other instances #5296 - -Fixes situation where frame range validator can't be turned off on models if they are attached to reviewable camera in Maya. - - -___ - -
- - -
-Maya: Apply project settings to creators #5303 - -Project settings were not applied to the creators. - - -___ - -
- - -
-Maya: Validate Model Content #5336 - -`assemblies` in `cmds.ls` does not seem to work; -```python - -from maya import cmds - - -content_instance = ['|group2|pSphere1_GEO', '|group2|pSphere1_GEO|pSphere1_GEOShape', '|group1|pSphere1_GEO', '|group1|pSphere1_GEO|pSphere1_GEOShape'] -assemblies = cmds.ls(content_instance, assemblies=True, long=True) -print(assemblies) -``` - -Fixing with string splitting instead. - - -___ - -
- - -
-Bugfix: Maya update defaults variable #5368 - -So, something was forgotten while moving out from `LegacyCreator` to `NewCreator``LegacyCreator` used `defaults` to list suggested subset names which was changed into `default_variants` in the the `NewCreator`and setting `defaults` to any values has no effect!This update affects: -- [x] Model -- [x] Set Dress - - -___ - -
- - -
-Chore: Python 2 support fix #5375 - -Fix Python 2 support by adding `click` into python 2 dependencies and removing f-string from maya. - - -___ - -
- - -
-Maya: do not create top level group on reference #5402 - -This PR allows to not wrapping loaded referenced assets in top level group either explicitly for artist or by configuration in Settings.Artists can control group creation in ReferenceLoader options.Default no group creation could be set by emptying `Group Name` in `project_settings/maya/load/reference_loader` - - -___ - -
- - -
-Settings: Houdini & Maya create plugin settings #5436 - -Fixes related to Maya and Houdini settings. Renamed `defaults` to `default_variants` in plugin settings to match attribute name on create plugin in both OpenPype and AYON settings. Fixed Houdini AYON settings where were missing settings for defautlt varaints and fixed Maya AYON settings where default factory had wrong assignment. - - -___ - -
- - -
-Maya: Hide CreateAnimation #5297 - -When converting `animation` family or loading a `rig` family, need to include the `animation` creator but hide it in creator context. - - -___ - -
- - -
-Nuke Anamorphic slate - Read pixel aspect from input #5304 - -When asset pixel aspect differs from rendered pixel aspect, Nuke slate pixel aspect is not longer taken from asset, but is readed via ffprobe. - - -___ - -
- - -
-Nuke - Allow ExtractReviewDataMov with no timecode knob #5305 - -ExtractReviewDataMov allows to specify file type. Trying to write some other extension than mov fails on generate_mov assuming that mov64_write_timecode knob exists. - - -___ - -
- - -
-Nuke: removing settings schema with defaults for OpenPype #5306 - -continuation of https://github.com/ynput/OpenPype/pull/5275 - - -___ - -
- - -
-Bugfix: Dependency without 'inputLinks' not downloaded #5337 - -Remove condition that avoids downloading dependency without `inputLinks`. - - -___ - -
- - -
-Bugfix: Houdini Creator use selection even if it was toggled off #5359 - -When creating many product types (families) one after another without refreshing the creator window manually if you toggled `Use selection` once, all the later product types will use selection even if it was toggled offHere's Before it will keep use selection even if it was toggled off, unless you refresh window manuallyhttps://github.com/ynput/OpenPype/assets/20871534/8b890122-5b53-4c6b-897d-6a2f3aa3388aHere's After it works as expectedhttps://github.com/ynput/OpenPype/assets/20871534/6b1db990-de1b-428e-8828-04ab59a44e28 - - -___ - -
- - -
-Houdini: Correct camera selection for karma renderer when using selected node #5360 - -When user creates the karma rop with selected camera by use selection, it will give the error message of "no render camera found in selection".This PR is to fix the bug of creating karma rop when using selected camera node in Houdini - - -___ - -
- - -
-AYON: Environment variables and functions #5361 - -Prepare code for ayon-launcher compatibility. Fix ayon launcher subprocess calls, added more checks for `AYON_SERVER_ENABLED`, use ayon launcher suitable environment variables in AYON mode and changed outputs of some functions. Replaced usages of `OPENPYPE_REPOS_ROOT` environment variable with `PACKAGE_DIR` variable -> correct paths are used. - - -___ - -
- - -
-Nuke: farm rendering of prerender ignore roots in nuke #5366 - -`prerender` family was using wrong subset, same as `render` which should be different. - - -___ - -
- - -
-Bugfix: Houdini update defaults variable #5367 - -So, something was forgotten while moving out from `LegacyCreator` to `NewCreator``LegacyCreator` used `defaults` to list suggested subset names which was changed into `default_variants` in the the `NewCreator`and setting `defaults` to any values has no effect!This update affects: -- [x] Arnold ASS -- [x] Arnold ROP -- [x] Karma ROP -- [x] Mantra ROP -- [x] Redshift ROP -- [x] VRay ROP - - -___ - -
- - -
-Publisher: Fix create/publish animation #5369 - -Use geometry movement instead of changing min/max width. - - -___ - -
- - -
-Unreal: Move unreal splash screen to unreal #5370 - -Moved splash screen code to unreal integration and removed import from Igniter. - - -___ - -
- - -
-Nuke: returned not cleaning of renders folder on the farm #5374 - -Previous PR enabled explicit cleanup of `renders` folder after farm publishing. This is not matching customer's workflows. Customer wants to have access to files in `renders` folder and potentially redo some frames for long frame sequences.This PR extends logic of marking rendered files for deletion only if instance doesn't have `stagingDir_persistent`.For backwards compatibility all Nuke instances have `stagingDir_persistent` set to True, eg. `renders` folder won't be cleaned after farm publish. - - -___ - -
- - -
-Nuke: loading sequences is working #5376 - -Loading image sequences was broken after the latest release, version 3.16. However, I am pleased to inform you that it is now functioning as expected. - - -___ - -
- - -
-AYON: Fix settings conversion for ayon addons #5377 - -AYON addon settings are available in system settings and does not have available the same values in `"modules"` subkey. - - -___ - -
- - -
-Nuke: OCIO env var workflow #5379 - -The OCIO environment variable needs to be consistently handled across all platforms. Nuke resolves the custom OCIO config path differently depending on the platform, so we included the ocio config path in the workfile with a partial replacement using an environment variable. Additionally, for Windows sessions, we replaced backward slashes with a TCL expression. - - -___ - -
- - -
-Unreal: Fix Unreal build script #5381 - -Define 'AYON_UNREAL_ROOT' environment variable in unreal addon. - - -___ - -
- - -
-3dsMax: Use relative path to MAX_HOST_DIR #5382 - -Use `MAX_HOST_DIR` to calculate startup script path instead of use relative path to `OPENPYPE_ROOT` environment variable. - - -___ - -
- - -
-Bugfix: Houdini abc validator error message #5386 - -When ABC path validator fails, it prints node objects not node paths or namesThis bug happened because of updating `get_invalid` method to return nodes instead of node pathsBeforeAfter - - -___ - -
- - -
-Nuke: node name influence product (subset) name #5392 - -Nuke now allows users to duplicate publishing instances, making the workflow easier. By duplicating a node and changing its name, users can set the product (subset) name in the publishing context.Users now have the ability to change the variant name in Publisher, which will automatically rename the associated instance node. - - -___ - -
- - -
-Houdini: delete redundant bgeo sop validator #5394 - -I found out that this `Validate BGEO SOP Path` validator is redundant, it catches two cases that are already implemented in "Validate Output Node". "Validate Output Node" works with `bgeo` as well as `abc` because `"pointcache"` is listed in its families - - -___ - -
- - -
-Nuke: workfile is not reopening after change of context #5399 - -Nuke no longer reopens the latest workfile when the context is changed to a different task using the Workfile tool. The issue also affected the Script Clean (from Nuke File menu) and Close feature, but it has now been fixed. - - -___ - -
- - -
-Bugfix: houdini hard coded project settings #5400 - -I made this PR to solve the issue with hard-coded settings in houdini - - -___ - -
- - -
-AYON: 3dsMax settings #5401 - -Keep `adsk_3dsmax` group in applications settings. - - -___ - -
- - -
-Bugfix: update defaults to default_variants in maya and houdini OP DCC settings #5407 - -On moving out to new creator in Maya and Houdini updating settings was missed. - - -___ - -
- - -
-Applications: Attributes creation #5408 - -Applications addon does not cause infinite server restart loop. - - -___ - -
- - -
-Max: fix the bug of handling Object deletion in OP Parameter #5410 - -If the object is added to the OP parameter and user delete it in the scene thereafter, it will error out the container with OP attributes. This PR resolves the bug.This PR also fixes the bug of not adding the attribute into OP parameter correctly when the user enables "use selections" to link the object into the OP parameter. - - -___ - -
- - -
-Colorspace: including environments from launcher process #5411 - -Fixed bug in GitHub PR where the OCIO config template was not properly formatting environment variables from System Settings `general/environment`. - - -___ - -
- - -
-Nuke: workfile template fixes #5428 - -Some bunch of small bugs needed to be fixed - - -___ - -
- - -
-Houdini, Max: Fix missed function interface change #5430 - -This PR https://github.com/ynput/OpenPype/pull/5321/files from @kalisp missed updating the `add_render_job_env_var` in Houdini and Max as they are passing an extra arg: -``` -TypeError: add_render_job_env_var() takes 1 positional argument but 2 were given -``` - - -___ - -
- - -
-Scene Inventory: Fix issue with 'sync_server' #5431 - -Fix accesss to `sync_server` attribute in scene inventory. - - -___ - -
- - -
-Unpack project: Fix import issue #5433 - -Added `load_json_file`, `replace_project_documents` and `store_project_documents` to mongo init. - - -___ - -
- - -
-Chore: Versions post fixes #5441 - -Fixed issues caused by my fault. Filled right version value to anatomy data. - - -___ - -
- -### **๐Ÿ“ƒ Testing** - - -
-Tests: Copy file_handler as it will be removed by purging ayon code #5357 - -Ayon code will get purged in the future from this repo/addon, therefore all `ayon_common` will be gone. `file_handler` gets internalized to tests as it is not used anywhere else. - - -___ - -
- - - - -## [3.16.2](https://github.com/ynput/OpenPype/tree/3.16.2) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.1...3.16.2) - -### **๐Ÿ†• New features** - - -
-Fusion - Set selected tool to active #5327 - -When you run the action to select a node, this PR makes the node-flow show the selected node + you'll see the nodes controls in the inspector. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: All base create plugins #5326 - -Prepared base classes for each creator type in Maya. Extended `MayaCreatorBase` to have default implementations of common logic with instances which is used in each type of plugin. - - -___ - -
- - -
-Windows: Support long paths on zip updates. #5265 - -Support long paths for version extract on Windows.Use case is when having long paths in for example an addon. You can install to the C drive but because the zip files are extracted in the local users folder, it'll add additional sub directories to the paths and quickly get too long paths for Windows to handle the zip updates. - - -___ - -
- - -
-Blender: Added setting to set resolution and start/end frames at startup #5338 - -This PR adds `set_resolution_startup`and `set_frames_startup` settings. They automatically set respectively the resolution and start/end frames and FPS in Blender when opening a file or creating a new one. - - -___ - -
- - -
-Blender: Support for ExtractBurnin #5339 - -This PR adds support for ExtractBurnin for Blender, when publishing a Review. - - -___ - -
- - -
-Blender: Extract Camera as Alembic #5343 - -Added support to extract Alembic Cameras in Blender. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Validate Instance In Context #5335 - -Missing new publisher error so the repair action shows up. - - -___ - -
- - -
-Settings: Fix default settings #5311 - -Fixed defautl settings for shotgrid. Renamed `FarmRootEnumEntity` to `DynamicEnumEntity` and removed doubled ABC metaclass definition (all settings entities have abstract metaclass). - - -___ - -
- - -
-Deadline: missing context argument #5312 - -Updated function arguments - - -___ - -
- - -
-Qt UI: Multiselection combobox PySide6 compatibility #5314 - -- The check states are replaced with the values for PySide6 -- `QtCore.Qt.ItemIsUserTristate` is used instead of `QtCore.Qt.ItemIsTristate` to avoid crashes on PySide6 - - -___ - -
- - -
-Docker: handle openssl 1.1.1 for centos 7 docker build #5319 - -Move to python 3.9 has added need to use openssl 1.1.x - but it is not by default available on centos 7 image. This is fixing it. - - -___ - -
- - -
-houdini: fix typo in redshift proxy #5320 - -I believe there's a typo in `create_redshift_proxy.py` ( extra ` ) in filename, and I made this PR to suggest a fix - - -___ - -
- - -
-Houdini: fix wrong creator identifier in pointCache workflow #5324 - -FIxing a bug in publishing alembics, were invalid creator identifier caused missing family association. - - -___ - -
- - -
-Fix colorspace compatibility check #5334 - -for some reason a user may have `PyOpenColorIO` installed to his machine, _in my case it came with renderman._it can trick the compatibility check as `import PyOpenColorIO` won't raise an error however it may be an old version _like my case_Beforecompatibility check was true and It used wrapper directly After Fix It will use wrapper via subprocess instead - - -___ - -
- -### **Merged pull requests** - - -
-Remove forgotten dev logging #5315 - - -___ - -
- - - - -## [3.16.1](https://github.com/ynput/OpenPype/tree/3.16.1) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.16.0...3.16.1) - -### **๐Ÿ†• New features** - - -
-Royal Render: Maya and Nuke support #5191 - -Basic working implementation of Royal Render support in Maya.It expects New publisher implemented in Maya. - - -___ - -
- - -
-Blender: Blend File Family #4321 - -Implementation of the Blend File family analogue to the Maya Scene one. - - -___ - -
- - -
-Houdini: simple bgeo publishing #4588 - -Support for simple publishing of bgeo files. - -This is adding basic support for bgeo publishing in Houdini. It will allow publishing bgeo in all supported formats (selectable in the creator options). If selected node has `output` on sop level, it will be used automatically as path in file node. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-General: delivery action add renamed frame number in Loader #5024 - -Frame Offset options for delivery in Openpype loader - - -___ - -
- - -
-Enhancement/houdini add path action for abc validator #5237 - -Add a default path attribute Action.it's a helper action more than a repair action, which used to add a default single value. - - -___ - -
- - -
-Nuke: auto apply all settings after template build #5277 - -Adding auto run of Apply All Settings after template is builder is finishing its process. This will apply Frame-range, Image size, Colorspace found in context of a task shot. - - -___ - -
- - -
-Harmony:Removed loader settings for Harmony #5289 - -It shouldn't be configurable, it is internal logic. By adding additional extension it wouldn't start to work magically. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-AYON: Make appdirs case sensitive #5298 - -Appdirs for AYON are case sensitive for linux and mac so we needed to change them to match ayon launcher. Changed 'ayon' to 'AYON' and 'ynput' to 'Ynput'. - - -___ - -
- - -
-Traypublisher: Fix plugin order #5299 - -Frame range collector for traypublisher was moved to traypublisher plugins and changed order to make sure `assetEntity` is filled in `instance.data`. - - -___ - -
- - -
-Deadline: removing OPENPYPE_VERSION from some host submitters #5302 - -Removing deprecated method of adding OPENPYPE_VERSION to job environment. It was leftover and other hosts have already been cleared. - - -___ - -
- - -
-AYON: Fix args for workfile conversion util #5308 - -Workfile update conversion util function have right expected arguments. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Maya: Refactor imports to `lib.get_reference_node` since the other functionโ€ฆ #5258 - -Refactor imports to `lib.get_reference_node` since the other function is deprecated. - - -___ - -
- - - - -## [3.16.0](https://github.com/ynput/OpenPype/tree/3.16.0) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/...3.16.0) - -### **๐Ÿ†• New features** - - -
-General: Reduce usage of legacy io #4723 - -Replace usages of `legacy_io` with getter methods or reuse already available information. Create plugins using CreateContext are using context from CreateContext object. Loaders are usign getter function from context tools. Publish plugin are using information instance.data or context.data. In some cases were pieces of code refactored a little e.g. fps getter in maya. - - -___ - -
- - -
-Documentation: API docs reborn - yet again #4419 - -## Feature - -Add functional base for API Documentation using Sphinx and AutoAPI. - -After unsuccessful #2512, #834 and #210 this is yet another try. But this time without ambition to solve the whole issue. This is making Shinx script to work and nothing else. Any changes and improvements in API docs should be made in subsequent PRs. - -## How to use it - -You can run: - -```sh -cd .\docs -make.bat html -``` - -or - -```sh -cd ./docs -make html -``` - -This will go over our code and generate **.rst** files in `/docs/source/autoapi` and from those it will generate full html documentation in `/docs/build/html`. - -During the build you'll see tons of red errors that are pointing to our issues: - -1) **Wrong imports** - Invalid import are usually wrong relative imports (too deep) or circular imports. - -2) **Invalid doc-strings** - Doc-strings to be processed into documentation needs to follow some syntax - this can be checked by running - `pydocstyle` that is already included with OpenPype -3) **Invalid markdown/rst files** - md/rst files can be included inside rst files using `.. include::` directive. But they have to be properly formatted. - - -## Editing rst templates - -Everything starts with `/docs/source/index.rst` - this file should be properly edited, Right now it just includes `readme.rst` that in turn include and parse main `README.md`. This is entrypoint to API documentation. All templates generated by AutoAPI are in `/docs/source/autoapi`. They should be eventually commited to repository and edited too. - -## Steps for enhancing API documentation - -1) Run `/docs/make.bat html` -2) Read the red errors/warnings - fix it in the code -3) Run `/docs/make.bat html` again until there are not red lines -4) Edit rst files and add some meaningfull content there - -> **Note** -> This can (should) be merged as is without doc-string fixes in the code or changes in templates. All additional improvements on API documentation should be made in new PRs. - -> **Warning** -> You need to add new dependencies to use it. Run `create_venv`. - -Connected to #2490 -___ - -
- - -
-Global: custom location for OP local versions #4673 - -This provides configurable location to unzip Openpype version zips. By default, it was hardcoded to artist's app data folder, which might be problematic/slow with roaming profiles.Location must be accessible by user running OP Tray with write permissions (so `Program Files` might be problematic) - - -___ - -
- - -
-AYON: Update settings conversion #4837 - -Updated conversion script of AYON settings to v3 settings. PR is related to changes in addons repository https://github.com/ynput/ayon-addons/pull/6 . Changed how the conversion happens -> conversion output does not start with openpype defaults but as empty dictionary. - - -___ - -
- - -
-AYON: Implement integrate links publish plugin #4842 - -Implemented entity links get/create functions. Added new integrator which replaces v3 integrator for links. - - -___ - -
- - -
-General: Version attributes integration #4991 - -Implemented unified integrate plugin to update version attributes after all integrations for AYON. The goal is to be able update attribute values in a unified way to a version when all addon integrators are done, so e.g. ftrack can add ftrack id to matching version in AYON server etc.The can be stored under `"versionAttributes"` key. - - -___ - -
- - -
-AYON: Staging versions can be used #4992 - -Added ability to use staging versions in AYON mode. - - -___ - -
- - -
-AYON: Preparation for products #5038 - -Prepare ayon settings conversion script for `product` settings conversion. - - -___ - -
- - -
-Loader: Hide inactive versions in UI #5101 - -Added support for `active` argument to hide versions with active set to False in Loader UI when in AYON mode. - - -___ - -
- - -
-General: CLI addon command #5109 - -Added `addon` alias for `module` in OpenPype cli commands. - - -___ - -
- - -
-AYON: OpenPype as server addon #5199 - -OpenPype repository can be converted to AYON addon for distribution. Addon has defined dependencies that are required to use it and are not in base ayon-launcher (desktop application). - - -___ - -
- - -
-General: Runtime dependencies #5206 - -Defined runtime dependencies in pyproject toml. Moved python ocio and otio modules there. - - -___ - -
- - -
-AYON: Bundle distribution #5209 - -Since AYON server 0.3.0 are addon versions defined by bundles which affects how addons, dependency packages and installers are handled. Only source of truth, about any version of anything that should be used, is server bundle. - - -___ - -
- - -
-Feature/blender handle q application #5264 - -This edit is to change the way the QApplication is run for Blender. It calls in the singleton (QApplication) during the register. This is made so that other Qt applications and addons are able to run on Blender. In its current implementation, if a QApplication is already running, all functionality of OpenPype becomes unavailable. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-General: Connect to AYON server (base) #3924 - -Initial implementation of being able use AYON server in current OpenPype client. Added ability to connect to AYON server and use base queries. - -AYON mode has it's own executable (and start script). To start in AYON mode just replace `start.py` with `ayon_start.py` (added tray start script to tools). Added constant `AYON_SERVER_ENABLED` to `openpype/__init__.py` to know if ayon mode is enabled. In that case Mongo is not used at all and any attempts will cause crashes.I had to modify `~/openpype/client` content to be able do this switch. Mongo implementation was moved to `mongo` subfolder and use "star imports" in files from where current imports are used. Logic of any tool or query in code was not changed at all. Since functions were based on mongo queries they don't use full potential of AYON server abilities.ATM implementation has login UI, distribution of files from server and replacement of mongo queries. For queries is used `ayon_api` module. Which is in live development so the versions may change from day to day. - - -___ - -
- - -
-Enhancement kitsu note with exceptions #4537 - -Adding a setting to choose some exceptions to IntegrateKitsuNote task status changes. - - -___ - -
- - -
-General: Environment variable for default OCIO configs #4670 - -Define environment variable which lead to root of builtin ocio configs to be able change the root without changing settings. For the path in settings was used `"{OPENPYPE_ROOT}/vendor/bin/ocioconfig/OpenColorIOConfig"` which disallow to change the root somewhere else. That will be needed in AYON where configs won't be part of desktop application but downloaded from server. - - -___ - -
- - -
-AYON: Editorial hierarchy creation #4699 - -Implemented extract hierarchy to AYON plugin which created entities in AYON using ayon api. - - -___ - -
- - -
-AYON: Vendorize ayon api #4753 - -Vendorize ayon api into openpype vendor directory. The reason is that `ayon-python-api` is in live development and will fix/add features often in next few weeks/months, and because update of dependency requires new release -> new build, we want to avoid the need of doing that as it would affect OpenPype development. - - -___ - -
- - -
-General: Update PySide 6 for MacOs #4764 - -New version of PySide6 does not have issues with settings UI. It is still breaking UI stylesheets so it is not changed for other plaforms but it is enhancement from previous state. - - -___ - -
- - -
-General: Removed unused cli commands #4902 - -Removed `texturecopy` and `launch` cli commands from cli commands. - - -___ - -
- - -
-AYON: Linux & MacOS launch script #4970 - -Added shell script to launch tray in AYON mode. - - -___ - -
- - -
-General: Qt scale enhancement #5059 - -Set ~~'QT_SCALE_FACTOR_ROUNDING_POLICY'~~ scale factor rounding policy of QApplication to `PassThrough` so the scaling can be 'float' number and not just 'int' (150% -> 1.5 scale). - - -___ - -
- - -
-CI: WPS linting instead of Hound (rebase) 2 #5115 - -Because Hound currently used to lint the code on GH ships with really old flake8 support, it fails miserably on any newer Python syntax. This PR is adding WPS linter to GitHub workflows that should step in. - - -___ - -
- - -
-Max: OP parameters only displays what is attached to the container #5229 - -The OP parameter in 3dsmax only displays what is currently attached to the container while deleting while you can see the items which is not added when you are adding to the container. - - -___ - -
- - -
-Testing: improving logging during testing #5271 - -Unit testing logging was crashing on more then one nested layers of inherited loggers. - - -___ - -
- - -
-Nuke: removing deprecated settings in baking #5275 - -Removing deprecated settings for baking with reformat. This option was only for single reformat node and it had been substituted with multiple reposition nodes. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-AYON: General fixes and updates #4975 - -Few smaller fixes related to AYON connection. Some of fixes were taken from this PR. - - -___ - -
- - -
-Start script: Change returncode on validate or list versions #4515 - -Change exit code from `1` to `0` when versions are printed or when version is validated. - -Return code `1` is indicating error but there didn't happen any error. - - -___ - -
- - -
-AYON: Change login UI works #4754 - -Fixed change of login UI. Logic change UI did show up, new login was successful, but after restart was used the previous login. This change fix the issue. - - -___ - -
- - -
-AYON: General issues #4763 - -Vendorized `ayon_api` from PR broke OpenPype launch, because `ayon_api` is not available. Moved `ayon_api` from ayon specific subforlder to `common` python vendor in OpenPype, and removed login in ayon start script (which was invalid anyway). Also made fixed compatibility with PySide6 by using `qtpy` instead of `Qt` and changing code which is not PySide6 compatible. - - -___ - -
- - -
-AYON: Small fixes #4841 - -Bugsfixes and enhancements related to AYON logic. Define `BUILTIN_OCIO_ROOT` environment variable so OCIO configs are working. Use constants from ayon api instead of hardcoding them in codebase. Change process name from "openpype" to "ayon". Don't execute login dialog when application is not yet running but use `open` method instead. Fixed missing modules settings which were not taken from openpype defaults. Updated ayon api to `0.1.17`. - - -___ - -
- - -
-Bugfix - Update gazu to 0.9.3 #4845 - -This updates Gazu to 0.9.3 to make sure Gazu works with Kitsu and Zou 0.16.x+ - - -___ - -
- - -
-Igniter: fix error reports in silent mode #4909 - -Some errors in silent mode commands in Igniter were suppressed and not visible for example in Deadline log. - - -___ - -
- - -
-General: Remove ayon api from poetry lock #4964 - -Remove AYON python api from pyproject.toml and poetry.lock again. - - -___ - -
- - -
-Ftrack: Fix AYON settings conversion #4967 - -Fix conversion of ftrack settings in AYON mode. - - -___ - -
- - -
-AYON: ISO date format conversion issues #4981 - -Function `datetime.fromisoformat` was replaced with `arrow.get` to be used instead. - - -___ - -
- - -
-AYON: Missing files on representations #4989 - -Fix integration of files into representation in server database. - - -___ - -
- - -
-General: Fix Python 2 vendor for arrow #4993 - -Moved remaining dependencies for arrow from ftrack to python 2 vendor. - - -___ - -
- - -
-General: Fix new load plugins for next minor relase #5000 - -Fix access to `fname` attribute which is not available on load plugin anymore. - - -___ - -
- - -
-General: Fix mongo secure connection #5031 - -Fix `ssl` and `tls` keys checks in mongo uri query string. - - -___ - -
- - -
-AYON: Fix site sync settings #5069 - -Fixed settings for AYON variant of sync server. - - -___ - -
- - -
-General: Replace deprecated keyword argument in PyMongo #5080 - -Use argument `tlsCAFile` instead of `ssl_ca_certs` to avoid deprecation warnings. - - -___ - -
- - -
-Igniter: QApplication is created #5081 - -Function `_get_qt_app` actually creates new `QApplication` if was not created yet. - - -___ - -
- - -
-General: Lower unidecode version #5090 - -Use older version of Unidecode module to support Python 2. - - -___ - -
- - -
-General: Lower cryptography to 39.0.0 #5099 - -Lower cryptography to 39.0.0 to avoid breaking of DCCs like Maya and Nuke. - - -___ - -
- - -
-AYON: Global environments key fix #5118 - -Seems that when converting ayon settings to OP settings the `environments` setting is put under the `environments` key in `general` however when populating the environment the `environment` key gets picked up, which does not contain the environment variables from the `core/environments` setting - - -___ - -
- - -
-Add collector to tray publisher for getting frame range data #5152 - -Add collector to tray publisher to get frame range data. User can choose to enable this collector if they need this in the publisher.Resolve #5136 - - -___ - -
- - -
-Unreal: get current project settings not using unreal project name #5170 - -There was a bug where Unreal project name was used to query project settings. But Unreal project name can differ from the "real" one because of naming convention rules set by Unreal. This is fixing it by asking for current project settings. - - -___ - -
- - -
-Substance Painter: Fix Collect Texture Set Images unable to copy.deepcopy due to QMenu #5238 - -Fix `copy.deepcopy` of `instance.data`. - - -___ - -
- - -
-Ayon: server returns different key #5251 - -Package returned from server has `filename` instead of `name`. - - -___ - -
- - -
-Substance Painter: Fix default color management settings #5259 - -The default settings for color management for Substance Painter were invalid, it was set to override the global config by default but specified no valid config paths of its own - and thus errored that the paths were not correct.This sets the defaults correctly to match other hosts._I quickly checked - this seems to be the only host with the wrong default settings_ - - -___ - -
- - -
-Nuke: fixing container data if windows path in value #5267 - -Windows path in container data are reformatted. Previously it was reported that Nuke was rising `utf8 0xc0` error if backward slashes were in data values. - - -___ - -
- - -
-Houdini: fix typo error in collect arnold rop #5281 - -Fixing a typo error in `collect_arnold_rop.py`Reference: #5280 - - -___ - -
- - -
-Slack - enhanced logging and protection against failure #5287 - -Covered issues found in production on customer site. SlackAPI exception doesn't need to have 'error', covered uncaught exception. - - -___ - -
- - -
-Maya: Removed unnecessary import of pyblish.cli #5292 - -This import resulted in adding additional logging handler which lead to duplication of logs in hosts with plugins containing `is_in_tests` method. Import is unnecessary for testing functionality. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Loader: Remove `context` argument from Loader.__init__() #4602 - -Remove the previously required `context` argument. - - -___ - -
- - -
-Global: Remove legacy integrator #4786 - -Remove the legacy integrator. - - -___ - -
- -### **๐Ÿ“ƒ Documentation** - - -
-Next Minor Release #5291 - - -___ - -
- -### **Merged pull requests** - - -
-Maya: Refactor to new publisher #4388 - -**Refactor Maya to use the new publisher with new creators.** - - -- [x] Legacy instance can be converted in UI using `SubsetConvertorPlugin` -- [x] Fix support for old style "render" and "vrayscene" instance to the new per layer format. -- [x] Context data is stored with scene -- [x] Workfile instance converted to AutoCreator -- [x] Converted Creator classes -- [x] Create animation -- [x] Create ass -- [x] Create assembly -- [x] Create camera -- [x] Create layout -- [x] Create look -- [x] Create mayascene -- [x] Create model -- [x] Create multiverse look -- [x] Create multiverse usd -- [x] Create multiverse usd comp -- [x] Create multiverse usd over -- [x] Create pointcache -- [x] Create proxy abc -- [x] Create redshift proxy -- [x] Create render -- [x] Create rendersetup -- [x] Create review -- [x] Create rig -- [x] Create setdress -- [x] Create unreal skeletalmesh -- [x] Create unreal staticmesh -- [x] Create vrayproxy -- [x] Create vrayscene -- [x] Create xgen -- [x] Create yeti cache -- [x] Create yeti rig -- [ ] Tested new Creator publishes -- [x] Publish animation -- [x] Publish ass -- [x] Publish assembly -- [x] Publish camera -- [x] Publish layout -- [x] Publish look -- [x] Publish mayascene -- [x] Publish model -- [ ] Publish multiverse look -- [ ] Publish multiverse usd -- [ ] Publish multiverse usd comp -- [ ] Publish multiverse usd over -- [x] Publish pointcache -- [x] Publish proxy abc -- [x] Publish redshift proxy -- [x] Publish render -- [x] Publish rendersetup -- [x] Publish review -- [x] Publish rig -- [x] Publish setdress -- [x] Publish unreal skeletalmesh -- [x] Publish unreal staticmesh -- [x] Publish vrayproxy -- [x] Publish vrayscene -- [x] Publish xgen -- [x] Publish yeti cache -- [x] Publish yeti rig -- [x] Publish workfile -- [x] Rig loader correctly generates a new style animation creator instance -- [ ] Validations / Error messages for common validation failures look nice and usable as a report. -- [ ] Make Create Animation hidden to the user (should not create manually?) -- [x] Correctly detect difference between **'creator_attributes'** and **'instance_data'** since both are "flattened" to the top node. - - -___ - -
- - -
-Start script: Fix possible issues with destination drive path #4478 - -Drive paths for windows are fixing possibly missing slash at the end of destination path. - -Windows `subst` command require to have destination path with slash if it's a drive (it should be `G:\` not `G:`). - - -___ - -
- - -
-Global: Move PyOpenColorIO to vendor/python #4946 - -So that DCCs don't conflict with their own. - -See https://github.com/ynput/OpenPype/pull/4267#issuecomment-1537153263 for the issue with Gaffer. - -I'm not sure if this is the correct approach, but I assume PySide/Shiboken is under `vendor/python` for this reason as well... -___ - -
- - -
-RuntimeError with Click on deadline publish #5065 - -I changed Click to version 8.0 instead of 7.1.2 to solve this error: -``` -2023-05-30 16:16:51: 0: STDOUT: Traceback (most recent call last): -2023-05-30 16:16:51: 0: STDOUT: File "start.py", line 1126, in boot -2023-05-30 16:16:51: 0: STDOUT: File "/prod/softprod/apps/openpype/LINUX/3.15/dependencies/click/core.py", line 829, in __call__ -2023-05-30 16:16:51: 0: STDOUT: return self.main(*args, **kwargs) -2023-05-30 16:16:51: 0: STDOUT: File "/prod/softprod/apps/openpype/LINUX/3.15/dependencies/click/core.py", line 760, in main -2023-05-30 16:16:51: 0: STDOUT: _verify_python3_env() -2023-05-30 16:16:51: 0: STDOUT: File "/prod/softprod/apps/openpype/LINUX/3.15/dependencies/click/_unicodefun.py", line 126, in _verify_python3_env -2023-05-30 16:16:51: 0: STDOUT: raise RuntimeError( -2023-05-30 16:16:51: 0: STDOUT: RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Consult https://click.palletsprojects.com/python3/ for mitigation steps. -``` - - -___ - -
- - - - -## [3.15.12](https://github.com/ynput/OpenPype/tree/3.15.12) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.11...3.15.12) - -### **๐Ÿ†• New features** - - -
-Tray Publisher: User can set colorspace per instance explicitly #4901 - -With this feature a user can set/override the colorspace for the representations of an instance explicitly instead of relying on the File Rules from project settings or alike. This way you can ingest any file and explicitly say "this file is colorspace X". - - -___ - -
- - -
-Review Family in Max #5001 - -Review Feature by creating preview animation in 3dsmax(The code is still cleaning up so there is going to be some updates until it is ready for review) - - -___ - -
- - -
-AfterEffects: support for workfile template builder #5163 - -This PR add functionality of templated workfile builder. It allows someone to prepare AE workfile with placeholders as for automatically loading particular representation of particular subset of particular asset from context where workfile is opened.Selection from multiple prepared workfiles is provided with usage of templates, specific type of tasks could use particular workfile template etc.Artists then can build workfile from template when opening new workfile. - - -___ - -
- - -
-CreatePlugin: Get next version helper #5242 - -Implemented helper functions to get next available versions for create instances. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Improve Templates #4854 - -Use library method for fetching reference node and support parent in hierarchy. - - -___ - -
- - -
-Bug: Maya - xgen sidecar files arent moved when saving workfile as an new asset workfile changing context - OP-6222 #5215 - -This PR manages the Xgen files when switching context in the Workfiles app. - - -___ - -
- - -
-node references to check for duplicates in Max #5192 - -No duplicates for node references in Max when users trying to select nodes before publishing - - -___ - -
- - -
-Tweak profiles logging to debug level #5194 - -Tweak profiles logging to debug level since they aren't artist facing logs. - - -___ - -
- - -
-Enhancement: Reduce more visual clutter for artists in new publisher reports #5208 - -Got this from one of our artists' reports - figured some of these logs were definitely not for the artist, reduced those logs to debug level. - - -___ - -
- - -
-Cosmetics: Tweak pyblish repair actions (icon, logs, docstring) #5213 - -- Add icon to RepairContextAction -- logs to debug level -- also add attempt repair for RepairAction for consistency -- fix RepairContextAction docstring to mention correct argument name - -#### Additional info - -We should not forget to remove this ["deprecated" actions.py file](https://github.com/ynput/OpenPype/blob/3501d0d23a78fbaef106da2fffe946cb49bef855/openpype/action.py) in 3.16 (next-minor) - -## Testing notes: - -1. Run some fabulous repairs! - -___ - -
- - -
-Maya: fix save file prompt on launch last workfile with color management enabled + restructure `set_colorspace` #5225 - -- Only set `configFilePath` when OCIO env var is not set since it doesn't do anything if OCIO var is set anyway. -- Set the Maya 2022+ default OCIO path using the resources path instead of "" to avoid Maya Save File on new file after launch -- **Bugfix: This is what fixes the Save prompt on open last workfile feature with Global color management enabled** -- Move all code related to applying the maya settings together after querying the settings -- Swap around the `if use_workfile_settings` since the check was reversed -- Use `get_current_project_name()` instead of environment vars - - -___ - -
- - -
-Enhancement: More descriptive error messages for Loaders #5227 - -Tweak raised errors and error messages for loader errors. - - -___ - -
- - -
-Houdini: add select invalid action for ValidateSopOutputNode #5231 - -This PR adds `SelectROPAction` action to `houdini\api\action.py`and it's used in `Validate Output Node``SelectROPAction` is used to select the associated ROPs with the errored instances. - - -___ - -
- - -
-Remove new lines from the delivery template string #5235 - -If the delivery template has a new line symbol at the end, say it was copied from the text editor, the delivery process will fail with `OSError` due to incorrect destination path. To avoid that I added `rstrip()` to the `delivery_path` processing. - - -___ - -
- - -
-Houdini: better selection on pointcache creation #5250 - -Houdini allows `ObjNode` path as `sop_path` in the `ROP` unlike OP/ Ayon require `sop_path` to be set to a sop node path explicitly In this code, better selection is used to filter out invalid selections from OP/ Ayon point of viewValid selections are -- `SopNode` that has parent of type `geo` or `subnet` -- `ObjNode` of type `geo` that has -- `SopNode` of type `output` -- `SopNode` with render flag `on` (if no `Sopnode` of type `output`)this effectively filter -- empty `ObjNode` -- `ObjNode`(s) of other types like `cam` and `dopnet` -- `SopNode`(s) that thier parents of other types like `cam` and `sop solver` - - -___ - -
- - -
-Update scene inventory even if any errors occurred during update #5252 - -When selecting many items in the scene inventory to update versions and one of the items would error out the updating stops. However, before this PR the scene inventory would also NOT refresh making you think it did nothing.Also implemented as method to allow some code deduplication. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Convert frame values to integers #5188 - -Convert frame values to integers. - - -___ - -
- - -
-Maya: fix the register_event_callback correctly collecting workfile save after #5214 - -fixing the bug of register_event_callback not being able to collect action of "workfile_save_after" for lock file action - - -___ - -
- - -
-Maya: aligning default settings to distributed aces 1.2 config #5233 - -Maya colorspace setttings defaults are set the way they align our distributed ACES 1.2 config file set in global colorspace configs. - - -___ - -
- - -
-RepairAction and SelectInvalidAction filter instances failed on the exact plugin #5240 - -RepairAction and SelectInvalidAction actually filter to instances that failed on the exact plugin - not on "any failure" - - -___ - -
- - -
-Maya: Bugfix look update nodes by id with non-unique shape names (query with `fullPath`) #5257 - -Fixes a bug where updating attributes on nodes with assigned shader if shape name existed more than once in the scene due to `cmds.listRelatives` call not being done with the `fullPath=True` flag.Original error: -```python -# Traceback (most recent call last): -# File "E:\openpype\OpenPype\openpype\tools\sceneinventory\view.py", line 264, in -# lambda: self._show_version_dialog(items)) -# File "E:\openpype\OpenPype\openpype\tools\sceneinventory\view.py", line 722, in _show_version_dialog -# self._update_containers(items, version) -# File "E:\openpype\OpenPype\openpype\tools\sceneinventory\view.py", line 849, in _update_containers -# update_container(item, item_version) -# File "E:\openpype\OpenPype\openpype\pipeline\load\utils.py", line 502, in update_container -# return loader.update(container, new_representation) -# File "E:\openpype\OpenPype\openpype\hosts\maya\plugins\load\load_look.py", line 119, in update -# nodes_by_id[lib.get_id(n)].append(n) -# File "E:\openpype\OpenPype\openpype\hosts\maya\api\lib.py", line 1420, in get_id -# sel.add(node) -``` - - -___ - -
- - -
-Nuke: Create nodes with inpanel=False #5051 - -This PR is meant to remove the annoyance of the UI changing focus to the properties window just for the property window of the newly created node to disappear. Instead of using node.hideControlPanel I'm implementing the concealment during the creation of the node which will not change the focus of the current window. -___ - -
- - -
-Fix the reset frame range not setting up the right timeline in Max #5187 - -Resolve #5181 - - -___ - -
- - -
-Resolve: after launch automatization fixes #5193 - -Workfile is no correctly created and aligned witch actual project. Also the launching mechanism is now fixed so even no workfile had been saved yet it will open OpenPype menu automatically. - - -___ - -
- - -
-General: Revert backward incompatible change of path to template to multiplatform #5197 - -Now platformity is still handed by usage of `work[root]` (or any other root that is accessible across platforms.) - - -___ - -
- - -
-Nuke: root set format updating in node graph #5198 - -Nuke root node needs to be reset on some values so any knobs could be updated in node graph. This works the same way as an user would change frame number so expressions would update its values in knobs. - - -___ - -
- - -
-Hiero: fixing otio current project and cosmetics #5200 - -Otio were not returning correct current project once additional Untitled project was open in project manager stack. - - -___ - -
- - -
-Max: Publisher instances dont hold its enabled disabled states when Publisher reopened again #5202 - -Resolve #5183, general maxscript conversion issue to python (e.g. bool conversion, true in maxscript while True in Python)(Also resolve the ValueError when you change the subset to publish into list view menu) - - -___ - -
- - -
-Burnins: Filter script is defined only for video streams #5205 - -Burnins are working for inputs with audio. - - -___ - -
- - -
-Colorspace lib fix compatible python version comparison #5212 - -Fix python version comparison. - - -___ - -
- - -
-Houdini: Fix `get_color_management_preferences` #5217 - -Fix the issue described here where the logic for retrieving the current OCIO display and view was incorrectly trying to apply a regex to it. - - -___ - -
- - -
-Houdini: Redshift ROP image format bug #5218 - -Problem : -"RS_outputFileFormat" parm value was missing -and there were more "image_format" than redshift rop supports - -Fix: -1) removed unnecessary formats from `image_format_enum` -2) add the selected format value to `RS_outputFileFormat` -___ - -
- - -
-Colorspace: check PyOpenColorIO rather then python version #5223 - -Fixing previously merged PR (https://github.com/ynput/OpenPype/pull/5212) And applying better way to check compatibility with PyOpenColorIO python api. - - -___ - -
- - -
-Validate delivery action representations status #5228 - -- disable delivery button if no representations checked -- fix macos combobox layout -- add error message if no delivery templates found - - -___ - -
- - -
- Houdini: Add geometry check for pointcache family #5230 - -When `sop_path` on ABC ROP node points to a non `SopNode`, these validators `validate_abc_primitive_to_detail.py`, `validate_primitive_hierarchy_paths.py` will error and crash when this line is executed `geo = output_node.geometryAtFrame(frame)` - - -___ - -
- - -
-Houdini: Add geometry check for VDB family #5232 - -When `sop_path` on Geometry ROP node points to a non SopNode, this validator `validate_vdb_output_node.py` will error and crash when this line is executed`sop_node.geometryAtFrame(frame)` - - -___ - -
- - -
-Substance Painter: Include the setting only in publish tab #5234 - -Instead of having two settings in both create and publish tab, there is solely one setting in the publish tab for users to set up the parameters.Resolve #5172 - - -___ - -
- - -
-Maya: Fix collecting arnold prefix when none #5243 - -When no prefix is specified in render settings, the renderlayer collector would error. - - -___ - -
- - -
-Deadline: OPENPYPE_VERSION should only be added when running from build #5244 - -When running from source the environment variable `OPENPYPE_VERSION` should not be added. This is a bugfix for the feature #4489 - - -___ - -
- - -
-Fix no prompt for "unsaved changes" showing when opening workfile in Houdini #5246 - -Fix no prompt for "unsaved changes" showing when opening workfile in Houdini. - - -___ - -
- - -
-Fix no prompt for "unsaved changes" showing when opening workfile in Substance Painter #5248 - -Fix no prompt for "unsaved changes" showing when opening workfile in Substance Painter. - - -___ - -
- - -
-General: add the os library before os.environ.get #5249 - -Adding os library into `creator_plugins.py` due to `os.environ.get` in line 667 - - -___ - -
- - -
-Maya: Fix set_attribute for enum attributes #5261 - -Fix for #5260 - - -___ - -
- - -
-Unreal: Move Qt imports away from module init #5268 - -Importing `Window` creates errors in headless mode. -``` -*** WRN: >>> { ModulesLoader }: [ FAILED to import host folder unreal ] -============================= -No Qt bindings could be found -============================= -Traceback (most recent call last): - File "C:\Users\tokejepsen\OpenPype\.venv\lib\site-packages\qtpy\__init__.py", line 252, in - from PySide6 import __version__ as PYSIDE_VERSION # analysis:ignore -ModuleNotFoundERROR: No module named 'PySide6' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "C:\Users\tokejepsen\OpenPype\openpype\modules\base.py", line 385, in _load_modules - default_module = __import__( - File "C:\Users\tokejepsen\OpenPype\openpype\hosts\unreal\__init__.py", line 1, in - from .addon import UnrealAddon - File "C:\Users\tokejepsen\OpenPype\openpype\hosts\unreal\addon.py", line 4, in - from openpype.widgets.message_window import Window - File "C:\Users\tokejepsen\OpenPype\openpype\widgets\__init__.py", line 1, in - from .password_dialog import PasswordDialog - File "C:\Users\tokejepsen\OpenPype\openpype\widgets\password_dialog.py", line 1, in - from qtpy import QtWidgets, QtCore, QtGui - File "C:\Users\tokejepsen\OpenPype\.venv\lib\site-packages\qtpy\__init__.py", line 259, in - raise QtBindingsNotFoundERROR() -qtpy.QtBindingsNotFoundERROR: No Qt bindings could be found -``` - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Maya: Minor refactoring and code cleanup #5226 - -Some small cleanup and refactoring of logic. Removing old comments, unused imports and some minor optimization. Also removed the prints of the loader names of each container the scene in `fix_incompatible_containers` + optimizing by using `set` and defining only once. Moved some UI related code/tweaks to run `on_init` only if not in headless mode. Removed an empty `obj.py` file.Each commit message kind of describes why the change was made. - - -___ - -
- -### **Merged pull requests** - - -
-Bug: Template builder fails when loading data without outliner representation #5222 - -I add an assertion management in case the container does not have a represention in outliner. - - -___ - -
- - -
-AfterEffects - add container check validator to AE settings #5203 - -Adds check if scene contains only latest version of loaded containers. - - -___ - -
- - - - -## [3.15.11](https://github.com/ynput/OpenPype/tree/3.15.11) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.10...3.15.11) - -### **๐Ÿ†• New features** - - -
-Ftrack: Task status during publishing #5123 - -Added option to change task status during publishing for 3 possible cases: "sending to farm", "local integration" and "on farm integration". - - -___ - -
- - -
-Nuke: Allow for more complex temp rendering paths #5132 - -When changing the temporary rendering template (i.e., add `{asset}` to the path) to something a bit more complex the formatting was erroring due to missing keys. - - -___ - -
- - -
-Blender: Add support for custom path for app templates #5137 - -This PR adds support for a custom App Templates path in Blender by setting the `BLENDER_USER_SCRIPTS` environment variable to the path specified in `OPENPYPE_APP_TEMPLATES_PATH`. This allows users to use their own custom app templates in Blender. - - -___ - -
- - -
-TrayPublisher & StandalonePublisher: Specify version #5142 - -Simple creators in TrayPublisher can affect which version will be integrated. Standalone publisher respects the version change from UI. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Workfile Builder UI: Workfile builder window is not modal #5131 - -Workfile Templates Builder: -- Create dialog is not a modal dialog -- Create dialog remains open after create, so you can directly create a new placeholder with similar settings -- In Maya allow to create root level placeholders (no selection during create) - **this felt more like a bugfix than anything else.** - - -___ - -
- - -
-3dsmax: Use custom modifiers to hold instance members #4931 - -Moving logic to handle members of publishing instance from children/parent relationship on Container to tracking via custom attribute on modifier. This eliminates limitations where you couldn't have one node multiple times under one Container and because it stores those relationships as weak references, they are easily transferable even when original nodes are renamed. - - -___ - -
- - -
-Add height, width and fps setup to project manager #5075 - -Add Width, Height, FPS, Pixel Aspect and Frame Start/End to the Project creation dialogue in the Project Manager.I understand that the Project manager will be replaced in the upcoming Ayon, but for the time being I believe setting new project with these options available would be more fun. - - -___ - -
- - -
-Nuke: connect custom write node script to the OP setting #5113 - -Allows user to customize the values of knobs attribute in the OP setting and use it in custom write node - - -___ - -
- - -
-Keep `publisher.create_widget` variant when creating subsets #5119 - -Whenever a person is creating a subset to publish, the "creator" widget resets (where you choose the variant, product, etc.) so if the person is publishing several images of the a variant which is not the default one, they have to keep selecting the correct one after every "create". - -This commit resets the original variant upon successful creation of a subset for publishing. - -Demo: -[Screencast from 2023-06-08 10-46-40.webm](https://github.com/ynput/OpenPype/assets/1800151/ca1c91d4-b8f3-43d2-a7b7-35987f5b6a3f) - -## Testing notes: -1. Launch AYON/OP -2. Launch the publisher (select a project, shot, etc.) -3. Crete a publish type (any works) -4. Choose a variant for the publish that is not the default -5. "Create >>" - -The Variant fields should still have the variant you choose. - - - -___ - -
- - -
-Color Management- added color management support for simple expected files on Deadline #5122 - -Running of `ExtractOIIOTranscode` during Deadline publish was previously implemented only on DCCs with AOVs (Maya, Max).This PR extends this for other DCCs with flat structure of expected files. - - -___ - -
- - -
-hide macos dock icon on build #5133 - -Set `LSUIElement` to `1` in the `Info.plist` to hide OP icon from the macos dock by default. - - -___ - -
- - -
-Pack project: Raise exception with reasonable message #5145 - -Pack project crashes with relevant message when destination directory is not set. - - -___ - -
- - -
-Allow "inventory" actions to be supplied by a Module/Addon. #5146 - -Adds "inventory" as a possible key to the plugin paths to be returned from a module. - - -___ - -
- - -
-3dsmax: make code compatible with 3dsmax 2022 #5164 - -Python 3.7 in 3dsmax 2022 is not supporting walrus operator. This is removing it from the code for the sake of compatibility - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Support same attribute names on different node types. #5054 - -When validating render settings attributes, support same attribute names on different node types. - - -___ - -
- - -
-Maya: bug fix the standin being not loaded when they are first loaded #5143 - -fix the bug of raising error when the first two standins are loaded through the loaderThe bug mentioned in the related issue: https://github.com/ynput/OpenPype/issues/5129For some reason, `defaultArnoldRenderOptions.operator` is not listed in the connection node attribute even if `cmds.loadPlugin("mtoa", quiet=True)` executed before loading the object as standins for the first time.But if you manually turn on mtoa through plugin preference and load the standins for the first time, it won't raise the related `defaultArnoldRenderOptions.operator` error. - - -___ - -
- - -
-Maya: bug fix arnoldExportAss unable to export selected set members #5150 - -See #5108 fix the bug arnoldExportAss being not able to export and error out during extraction. - - -___ - -
- - -
-Maya: Xgen multiple descriptions on single shape - OP-6039 #5160 - -When having multiple descriptions on the same geometry, the extraction would produce redundant duplicate geometries. - - -___ - -
- - -
-Maya: Xgen export of Abc's during Render Publishing - OP-6206 #5167 - -Shading assignments was missing duplicating the setup for Xgen publishing and the exporting of patches was getting the end frame incorrectly. - - -___ - -
- - -
-Maya: Include handles - OP-6236 #5175 - -Render range was missing the handles. - - -___ - -
- - -
-OCIO: Support working with single frame renders #5053 - -When there is only 1 file, the datamember `files` on the representation should be a string. - - -___ - -
- - -
-Burnins: Refactored burnins script #5094 - -Refactored list value for burnins and fixed command length limit by using temp file for filters string. - - -___ - -
- - -
-Nuke: open_file function can open autosave script #5107 - -Fix the bug of the workfile dialog being unable to open autosave nuke script - - -___ - -
- - -
-ImageIO: Minor fixes #5147 - -Resolve few minor fixes related to latest image io changes from PR. - - -___ - -
- - -
-Publisher: Fix save shortcut #5148 - -Save shortcut should work for both PySide2 and PySide6. - - -___ - -
- - -
-Pack Project: Fix files packing #5154 - -Packing of project with files does work again. - - -___ - -
- - -
-Maya: Xgen version mismatch after publish - OP-6204 #5161 - -Xgen was not updating correctly when for example adding or removing descriptions. This resolve the issue by overwritting the workspace xgen file. - - -___ - -
- - -
-Publisher: Edge case fixes #5165 - -Fix few edge case issues that may cause issues in Publisher UI. - - -___ - -
- - -
-Colorspace: host config path backward compatibility #5166 - -Old project settings overrides are now fully backward compatible. The issue with host config paths overrides were solved and now once a project used to be set to ocio_config **enabled** with found filepaths - this is now considered as activated host ocio_config paths overrides.Nuke is having an popup dialogue which is letting know to a user that settings for config path were changed. - - -___ - -
- - -
-Maya: import workfile missing - OP-6233 #5174 - -Missing `workfile` family to import. - - -___ - -
- - -
-Ftrack: Fix ignore sync filter #5176 - -Ftrack ignore filter does not crash because of dictionary modifications during it's iteration. - - -___ - -
- - -
-Webpublisher - headless publish shouldn't be blocking operation #5177 - -`subprocess.call` was blocking, which resulted in UI non responsiveness as it was waiting for publish to finish. - - -___ - -
- - -
-Publisher: Fix disappearing actions #5184 - -Pyblish plugin actions are visible as expected. - - -___ - -
- -### **Merged pull requests** - - -
-Enhancement:animation family loaded as standing (abc) uses "use file sequence" #5110 - -The changes are the following. We started by updating the the is_sequence(files) function allowing it to return True for a list of files which has only one file, since our animation in this provides just one alembic file. For the correct FPS number, we got the fps from the published ass/abc from the version data. - - -___ - -
- - -
-add label to matching family #5128 - -I added the possibility to filter the `family smart select` with the label in addition to the family. - - -___ - -
- - - - -## [3.15.10](https://github.com/ynput/OpenPype/tree/3.15.10) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.9...3.15.10) - -### **๐Ÿ†• New features** - - -
-ImageIO: Adding ImageIO activation toggle to all hosts #4700 - -Colorspace management can now be enabled at the project level, although it is disabled by default. Once enabled, all hosts will use the OCIO config file defined in the settings. If settings are disabled, the system switches to DCC's native color space management, and we do not store colorspace information at the representative level. - - -___ - -
- - -
-Redshift Proxy Support in 3dsMax #4625 - -Redshift Proxy Support for 3dsMax. -- [x] Creator -- [x] Loader -- [x] Extractor -- [x] Validator -- [x] Add documentation - - -___ - -
- - -
-Houdini farm publishing and rendering #4825 - -Deadline Farm publishing and Rendering for Houdini -- [x] Mantra -- [x] Karma(including usd renders) -- [x] Arnold -- [x] Elaborate Redshift ROP for deadline submission -- [x] fix the existing bug in Redshift ROP -- [x] Vray -- [x] add docs - - -___ - -
- - -
-Feature: Blender hook to execute python scripts at launch #4905 - -Hook to allow hooks to add path to a python script that will be executed when Blender starts. - - -___ - -
- - -
-Feature: Resolve: Open last workfile on launch through .scriptlib #5047 - -Added implementation to Resolve integration to open last workfile on launch. - - -___ - -
- - -
-General: Remove default windowFlags from publisher #5089 - -The default windowFlags is making the publisher window (in Linux at least) only show the close button and it's frustrating as many times you just want to minimize the window and get back to the validation after. Removing that line I get what I'd expect.**Before:****After:** - - -___ - -
- - -
-General: Show user who created the workfile on the details pane of workfile manager #5093 - -New PR for https://github.com/ynput/OpenPype/pull/5087, which was closed after merging `next-minor` branch and then realizing we don't need to target it as it was decided it's not required to support windows. More info on that PR discussion.Small addition to add name of the `user` who created the workfile on the details pane of the workfile manager: - - -___ - -
- - -
-Loader: Hide inactive versions in UI #5100 - -Hide versions with `active` set to `False` in Loader UI. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Repair RenderPass token when merging AOVs. #5055 - -Validator was flagging that `` was in the image prefix, but did not repair the issue. - - -___ - -
- - -
-Maya: Improve error feedback when no renderable cameras exist for ASS family. #5092 - -When collecting cameras for `ass` family, this improves the error message when no cameras are renderable. - - -___ - -
- - -
-Nuke: Custom script to set frame range of read nodes #5039 - -Adding option to set frame range specifically for the read nodes in Openpype Panel. User can set up their preferred frame range with the frame range dialog, which can be showed after clicking `Set Frame Range (Read Node)` in Openpype Tools - - -___ - -
- - -
-Update extract review letterbox docs #5074 - -Update Extract Review - Letter Box section in Docs. Letterbox type description is removed. - - -___ - -
- - -
-Project pack: Documents only skips roots validation #5082 - -Single roots validation is skipped if only documents are extracted. - - -___ - -
- - -
-Nuke: custom settings for write node without publish #5084 - -Set Render Output and other settings to write nodes for non-publish purposes. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Deadline servers #5052 - -Fix working with multiple Deadline servers in Maya. -- Pools (primary and secondary) attributes were not recreated correctly. -- Order of collector plugins were wrong, so collected data was not injected into render instances. -- Server attribute was not converted to string so comparing with settings was incorrect. -- Improve debug logging for where the webservice url is getting fetched from. - - -___ - -
- - -
-Maya: Fix Load Reference. #5091 - -Fix bug introduced with https://github.com/ynput/OpenPype/pull/4751 where `cmds.ls` returns a list. - - -___ - -
- - -
-3dsmax: Publishing Deadline jobs from RedShift #4960 - -Fix the bug of being uable to publish deadline jobs from RedshiftUse Current File instead of Published Scene for just Redshift. -- add save scene before rendering to ensure the scene is saved after the modification. -- add separated aov files option to allow users to choose to have aovs in render output -- add validator for render publish to aovid overriding the previous renders - - -___ - -
- - -
-Houdini: Fix missing frame range for pointcache and camera exports #5026 - -Fix missing frame range for pointcache and camera exports on published version. - - -___ - -
- - -
-Global: collect_frame_fix plugin fix and cleanup #5064 - -Previous implementation https://github.com/ynput/OpenPype/pull/5036 was broken this is fixing the issue where attribute is found in instance data although the settings were disabled for the plugin. - - -___ - -
- - -
-Hiero: Fix apply settings Clip Load #5073 - -Changed `apply_settings` to classmethod which fixes the issue with settings. - - -___ - -
- - -
-Resolve: Make sure scripts dir exists #5078 - -Make sure the scripts directory exists before looping over it's content. - - -___ - -
- - -
-removing info knob from nuke creators #5083 - -- removing instance node if removed via publisher -- removing info knob since it is not needed any more (was there only for the transition phase) - - -___ - -
- - -
-Tray: Fix restart arguments on update #5085 - -Fix arguments on restart. - - -___ - -
- - -
-Maya: bug fix on repair action in Arnold Scene Source CBID Validator #5096 - -Fix the bug of not being able to use repair action in Arnold Scene Source CBID Validator - - -___ - -
- - -
-Nuke: batch of small fixes #5103 - -- default settings for `imageio.requiredNodes` **CreateWriteImage** -- default settings for **LoadImage** representations -- **Create** and **Publish** menu items with `parent=main_window` (version > 14) - - -___ - -
- - -
-Deadline: make prerender check safer #5104 - -Prerender wasn't correctly recognized and was replaced with just 'render' family.In Nuke it is correctly `prerender.farm` in families, which wasn't handled here. It resulted into using `render` in templates even if `render` and `prerender` templates were split. - - -___ - -
- - -
-General: Sort launcher actions alphabetically #5106 - -The launcher actions weren't being sorted by its label but its name (which on the case of the apps it's the version number) and thus the order wasn't consistent and we kept getting a different order on every launch. From my debugging session, this was the result of what the `actions` variable held after the `filter_compatible_actions` function before these changes: -``` -(Pdb) for p in actions: print(p.order, p.name) -0 14-02 -0 14-02 -0 14-02 -0 14-02 -0 14-02 -0 19-5-493 -0 2023 -0 3-41 -0 6-01 -```This caused already a couple bugs from our artists thinking they had launched Nuke X and instead launched Nuke and telling us their Nuke was missing nodes**Before:****After:** - - -___ - -
- - -
-TrayPublisher: Editorial video stream discovery #5120 - -Editorial create plugin in traypublisher does not expect that first stream in input is video. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-3dsmax: Move from deprecated interface #5117 - -`INewPublisher` interface is deprecated, this PR is changing the use to `IPublishHost` instead. - - -___ - -
- -### **Merged pull requests** - - -
-add movalex as a contributor for code #5076 - -Adds @movalex as a contributor for code. - -This was requested by mkolar [in this comment](https://github.com/ynput/OpenPype/pull/4916#issuecomment-1571498425) - -[skip ci] -___ - -
- - -
-3dsmax: refactor load plugins #5079 - - -___ - -
- - - - -## [3.15.9](https://github.com/ynput/OpenPype/tree/3.15.9) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.8...3.15.9) - -### **๐Ÿ†• New features** - - -
-Blender: Implemented Loading of Alembic Camera #4990 - -Implemented loading of Alembic cameras in Blender. - - -___ - -
- - -
-Unreal: Implemented Creator, Loader and Extractor for Levels #5008 - -Creator, Loader and Extractor for Unreal Levels have been implemented. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Blender: Added setting for base unit scale #4987 - -A setting for the base unit scale has been added for Blender.The unit scale is automatically applied when opening a file or creating a new one. - - -___ - -
- - -
-Unreal: Changed naming and path of Camera Levels #5010 - -The levels created for the camera in Unreal now include `_camera` in the name, to be better identifiable, and are placed in the camera folder. - - -___ - -
- - -
-Settings: Added option to nest settings templates #5022 - -It is possible to nest settings templates in another templates. - - -___ - -
- - -
-Enhancement/publisher: Remove "hit play to continue" label on continue #5029 - -Remove "hit play to continue" message on continue so that it doesn't show anymore when play was clicked. - - -___ - -
- - -
-Ftrack: Limit number of ftrack events to query at once #5033 - -Limit the amount of ftrack events received from mongo at once to 100. - - -___ - -
- - -
-General: Small code cleanups #5034 - -Small code cleanup and updates. - - -___ - -
- - -
-Global: collect frames to fix with settings #5036 - -Settings for `Collect Frames to Fix` will allow disable per project the plugin. Also `Rewriting latest version` attribute is hiddable from settings. - - -___ - -
- - -
-General: Publish plugin apply settings can expect only project settings #5037 - -Only project settings are passed to optional `apply_settings` method, if the method expects only one argument. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Load Assembly fix invalid imports #4859 - -Refactors imports so they are now correct. - - -___ - -
- - -
-Maya: Skipping rendersetup for members. #4973 - -When publishing a `rendersetup`, the objectset is and should be empty. - - -___ - -
- - -
-Maya: Validate Rig Output IDs #5016 - -Absolute names of node were not used, so plugin did not fetch the nodes properly.Also missed pymel command. - - -___ - -
- - -
-Deadline: escape rootless path in publish job #4910 - -If the publish path on Deadline job contains spaces or other characters, command was failing because the path wasn't properly escaped. This is fixing it. - - -___ - -
- - -
-General: Company name and URL changed #4974 - -The current records were obsolete in inno_setup, changed to the up-to-date. -___ - -
- - -
-Unreal: Fix usage of 'get_full_path' function #5014 - -This PR changes all the occurrences of `get_full_path` functions to alternatives to get the path of the objects. - - -___ - -
- - -
-Unreal: Fix sequence frames validator to use correct data #5021 - -Fix sequence frames validator to use clipIn and clipOut data instead of frameStart and frameEnd. - - -___ - -
- - -
-Unreal: Fix render instances collection to use correct data #5023 - -Fix render instances collection to use `frameStart` and `frameEnd` from the Project Manager, instead of the sequence's ones. - - -___ - -
- - -
-Resolve: loader is opening even if no timeline in project #5025 - -Loader is opening now even no timeline is available in a project. - - -___ - -
- - -
-nuke: callback for dirmapping is on demand #5030 - -Nuke was slowed down on processing due this callback. Since it is disabled by default it made sense to add it only on demand. - - -___ - -
- - -
-Publisher: UI works with instances without label #5032 - -Publisher UI does not crash if instance don't have filled 'label' key in instance data. - - -___ - -
- - -
-Publisher: Call explicitly prepared tab methods #5044 - -It is not possible to go to Create tab during publishing from OpenPype menu. - - -___ - -
- - -
-Ftrack: Role names are not case sensitive in ftrack event server status action #5058 - -Event server status action is not case sensitive for role names of user. - - -___ - -
- - -
-Publisher: Fix border widget #5063 - -Fixed border lines in Publisher UI to be painted correctly with correct indentation and size. - - -___ - -
- - -
-Unreal: Fix Commandlet Project and Permissions #5066 - -Fix problem when creating an Unreal Project when Commandlet Project is in a protected location. - - -___ - -
- - -
-Unreal: Added verification for Unreal app name format #5070 - -The Unreal app name is used to determine the Unreal version folder, so it is necessary that if follows the format `x-x`, where `x` is any integer. This PR adds a verification that the app name follows that format. - - -___ - -
- -### **๐Ÿ“ƒ Documentation** - - -
-Docs: Display wrong image in ExtractOIIOTranscode #5045 - -Wrong image display in `https://openpype.io/docs/project_settings/settings_project_global#extract-oiio-transcode`. - - -___ - -
- -### **Merged pull requests** - - -
-Drop-down menu to list all families in create placeholder #4928 - -Currently in the create placeholder window, we need to write the family manually. This replace the text field by an enum field with all families for the current software. - - -___ - -
- - -
-add sync to specific projects or listen only #4919 - -Extend kitsu sync service with additional arguments to sync specific projects. - - -___ - -
- - - - -## [3.15.8](https://github.com/ynput/OpenPype/tree/3.15.8) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.7...3.15.8) - -### **๐Ÿ†• New features** - - -
-Publisher: Show instances in report page #4915 - -Show publish instances in report page. Also added basic log view with logs grouped by instance. Validation error detail now have 2 colums, one with erro details second with logs. Crashed state shows fast access to report action buttons. Success will show only logs. Publish frame is shrunked automatically on publish stop. - - -___ - -
- - -
-Fusion - Loader plugins updates #4920 - -Update to some Fusion loader plugins:The sequence loader can now load footage from the image and online family.The FBX loader can now import all formats Fusions FBX node can read.You can now import the content of another workfile into your current comp with the workfile loader. - - -___ - -
- - -
-Fusion: deadline farm rendering #4955 - -Enabling Fusion for deadline farm rendering. - - -___ - -
- - -
-AfterEffects: set frame range and resolution #4983 - -Frame information (frame start, duration, fps) and resolution (width and height) is applied to selected composition from Asset Management System (Ftrack or DB) automatically when published instance is created.It is also possible explicitly propagate both values from DB to selected composition by newly added menu buttons. - - -___ - -
- - -
-Publish: Enhance automated publish plugin settings #4986 - -Added plugins option to define settings category where to look for settings of a plugin and added public helper functions to apply settings `get_plugin_settings` and `apply_plugin_settings_automatically`. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Load Rig References - Change Rig to Animation in Animation instance #4877 - -We are using the template builder to build an animation scene. All the rig placeholders are imported correctly, but the automatically created animation instances retain the rig family in their names and subsets. In our example, we need animationMain instead of rigMain, because this name will be used in the following steps like lighting.Here is the result we need. I checked, and it's not a template builder problem, because even if I load a rig as a reference, the result is the same. For me, since we are in the animation instance, it makes more sense to have animation instead of rig in the name. The naming is just fine if we use create from the Openpype menu. - - -___ - -
- - -
-Enhancement: Resolve prelaunch code refactoring and update defaults #4916 - -The main reason of this PR is wrong default settings in `openpype/settings/defaults/system_settings/applications.json` for Resolve host. The `bin` folder should not be a part of the macos and Linux `RESOLVE_PYTHON3_PATH` variable.The rest of this PR is some code cleanups for Resolve prelaunch hook to simplify further development.Also added a .gitignore for vscode workspace files. - - -___ - -
- - -
-Unreal: ๐Ÿšš move Unreal plugin to separate repository #4980 - -To support Epic Marketplace have to move AYON Unreal integration plugins to separate repository. This is replacing current files with git submodule, so the change should be functionally without impact.New repository lives here: https://github.com/ynput/ayon-unreal-plugin - - -___ - -
- - -
-General: Lib code cleanup #5003 - -Small cleanup in lib files in openpype. - - -___ - -
- - -
-Allow to open with djv by extension instead of representation name #5004 - -Filter open in djv action by extension instead of representation. - - -___ - -
- - -
-DJV open action `extensions` as `set` #5005 - -Change `extensions` attribute to `set`. - - -___ - -
- - -
-Nuke: extract thumbnail with multiple reposition nodes #5011 - -Added support for multiple reposition nodes. - - -___ - -
- - -
-Enhancement: Improve logging levels and messages for artist facing publish reports #5018 - -Tweak the logging levels and messages to try and only show those logs that an artist should see and could understand. Move anything that's slightly more involved into a "debug" message instead. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Bugfix/frame variable fix #4978 - -Renamed variables to match OpenPype terminology to reduce confusion and add consistency. -___ - -
- - -
-Global: plugins cleanup plugin will leave beauty rendered files #4790 - -Attempt to mark more files to be cleaned up explicitly in intermediate `renders` folder in work area for farm jobs. - - -___ - -
- - -
-Fix: Download last workfile doesn't work if not already downloaded #4942 - -Some optimization condition is messing with the feature: if the published workfile is not already downloaded, it won't download it... - - -___ - -
- - -
-Unreal: Fix transform when loading layout to match existing assets #4972 - -Fixed transform when loading layout to match existing assets. - - -___ - -
- - -
-fix the bug of fbx loaders in Max #4977 - -bug fix of fbx loaders for not being able to parent to the CON instances while importing cameras(and models) which is published from other DCCs such as Maya. - - -___ - -
- - -
-AfterEffects: allow returning stub with not saved workfile #4984 - -Allows to use Workfile app to Save first empty workfile. - - -___ - -
- - -
-Blender: Fix Alembic loading #4985 - -Fixed problem occurring when trying to load an Alembic model in Blender. - - -___ - -
- - -
-Unreal: Addon Py2 compatibility #4994 - -Fixed Python 2 compatibility of unreal addon. - - -___ - -
- - -
-Nuke: fixed missing files key in representation #4999 - -Issue with missing keys once rendering target set to existing frames is fixed. Instance has to be evaluated in validation for missing files. - - -___ - -
- - -
-Unreal: Fix the frame range when loading camera #5002 - -The keyframes of the camera, when loaded, were not using the correct frame range. - - -___ - -
- - -
-Fusion: fixing frame range targeting #5013 - -Frame range targeting at Rendering instances is now following configured options. - - -___ - -
- - -
-Deadline: fix selection from multiple webservices #5015 - -Multiple different DL webservice could be configured. First they must by configured in System Settings., then they could be configured per project in `project_settings/deadline/deadline_servers`.Only single webservice could be a target of publish though. - - -___ - -
- -### **Merged pull requests** - - -
-3dsmax: Refactored publish plugins to use proper implementation of pymxs #4988 - - -___ - -
- - - - -## [3.15.7](https://github.com/ynput/OpenPype/tree/3.15.7) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.6...3.15.7) - -### **๐Ÿ†• New features** - - -
-Addons directory #4893 - -This adds a directory for Addons, for easier distribution of studio specific code. - - -___ - -
- - -
-Kitsu - Add "image", "online" and "plate" to review families #4923 - -This PR adds "image", "online" and "plate" to the review families so they also can be uploaded to Kitsu.It also adds the `Add review to Kitsu` tag to the default png review. Without it the user would manually need to add it for single image uploads to Kitsu and might confuse users (it confused me first for a while as movies did work). - - -___ - -
- - -
-Feature/remove and load inv action #4930 - -Added the ability to remove and load a container, as a way to reset it.This can be useful in cases where a container breaks in a way that can be fixed by removing it, then reloading it.Also added the ability to add `InventoryAction` plugins by placing them in `openpype/plugins/inventory`. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Load Rig References - Change Rig to Animation in Animation instance #4877 - -We are using the template builder to build an animation scene. All the rig placeholders are imported correctly, but the automatically created animation instances retain the rig family in their names and subsets. In our example, we need animationMain instead of rigMain, because this name will be used in the following steps like lighting.Here is the result we need. I checked, and it's not a template builder problem, because even if I load a rig as a reference, the result is the same. For me, since we are in the animation instance, it makes more sense to have animation instead of rig in the name. The naming is just fine if we use create from the Openpype menu. - - -___ - -
- - -
-Maya template builder - preserve all references when importing a template #4797 - -When building a template with Maya template builder, we import the template and also the references inside the template file. This causes some problems: -- We cannot use the references to version assets imported by the template. -- When we import the file, the internal reference files are also imported. As a side effect, Maya complains about a reference that no longer exists.`// Error: file: /xxx/maya/2023.3/linux/scripts/AETemplates/AEtransformRelated.mel line 58: Reference node 'turntable_mayaSceneMain_01_RN' is not associated with a reference file.` - - -___ - -
- - -
-Unreal: Renaming the integration plugin to Ayon. #4646 - -Renamed the .h, and .cpp files to Ayon. Also renamed the classes to with the Ayon keyword. - - -___ - -
- - -
-3dsMax: render dialogue needs to be closed #4729 - -Make sure the render setup dialog is in a closed state for the update of resolution and other render settings - - -___ - -
- - -
-Maya Template Builder - Remove default cameras from renderable cameras #4815 - -When we build an asset workfile with build workfile from template inside Maya, we load our turntable camera. But then we end up with 2 renderables camera : **persp** the one imported from the template.We need to remove the **persp** camera (or any other default camera) from renderable cameras when building the work file. - - -___ - -
- - -
-Validators for Frame Range in Max #4914 - -Switch Render Frame Range Type to 3 for specific ranges (initial setup for the range type is 4)Reset Frame Range will also set the frame range for render settingsRender Collector won't take the frame range from context data but take the range directly from render settingAdd validators for render frame range type and frame range respectively with repair action - - -___ - -
- - -
-Fusion: Saver creator settings #4943 - -Adding Saver creator settings and enhanced rendering path with template. - - -___ - -
- - -
-General: Project Anatomy on creators #4962 - -Anatomy object of current project is available on `CreateContext` and create plugins. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Validate shader name - OP-5903 #4971 - -Running the plugin would error with: -``` -// TypeError: 'str' object cannot be interpreted as an integer -```Fixed and added setting `active`. - - -___ - -
- - -
-Houdini: Fix slow Houdini launch due to shelves generation #4829 - -Shelf generation during Houdini startup would add an insane amount of delay for the Houdini UI to launch correctly. By deferring the shelf generation this takes away the 5+ minutes of delay for the Houdini UI to launch. - - -___ - -
- - -
-Fusion - Fixed "optional validation" #4912 - -Added OptionalPyblishPluginMixin and is_active checks for all publish tools that should be optional - - -___ - -
- - -
-Bug: add missing `pyblish.util` import #4937 - -remote publishing was missing import of `remote_publish`. This is adding it back. - - -___ - -
- - -
-Unreal: Fix missing 'object_path' property #4938 - -Epic removed the `object_path` property from `AssetData`. This PR fixes usages of that property.Fixes #4936 - - -___ - -
- - -
-Remove obsolete global validator #4939 - -Removing `Validate Sequence Frames` validator from global plugins as it wasn't handling correctly many things and was by mistake enabled, breaking functionality on Deadline. - - -___ - -
- - -
-General: fix build_workfile get_linked_assets missing project_name arg #4940 - -Linked assets collection don't work within `build_workfile` because `get_linked_assets` function call has a missing `project_name`argument. -- Added the `project_name` arg to the `get_linked_assets` function call. - - -___ - -
- - -
-General: fix Scene Inventory switch version error dialog missing parent arg on init #4941 - -QuickFix for the switch version error dialog to set inventory widget as parent. - - -___ - -
- - -
-Unreal: Fix camera frame range #4956 - -Fix the frame range of the level sequence for the Camera in Unreal. - - -___ - -
- - -
-Unreal: Fix missing parameter when updating Alembic StaticMesh #4957 - -Fix an error when updating an Alembic StaticMesh in Unreal, due to a missing parameter in a function call. - - -___ - -
- - -
-Unreal: Fix render extraction #4963 - -Fix a problem with the extraction of renders in Unreal. - - -___ - -
- - -
-Unreal: Remove Python 3.8 syntax from addon #4965 - -Removed Python 3.8 syntax from addon. - - -___ - -
- - -
-Ftrack: Fix editorial task creation #4966 - -Fix key assignment on instance data during editorial publishing in ftrack hierarchy integration. - - -___ - -
- -### **Merged pull requests** - - -
-Add "shortcut" to Scripts Menu Definition #4927 - -Add the possibility to associate a shorcut for an entry in the script menu definition with the key "shortcut" - - -___ - -
- - - - -## [3.15.6](https://github.com/ynput/OpenPype/tree/3.15.6) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.5...3.15.6) - -### **๐Ÿ†• New features** - - -
-Substance Painter Integration #4283 - -This implements a part of #4205 by implementing a Substance Painter integration - -Status: -- [x] Implement Host -- [x] start substance with last workfile using `AddLastWorkfileToLaunchArgs` prelaunch hook -- [x] Implement Qt tools -- [x] Implement loaders -- [x] Implemented a Set project mesh loader (this is relatively special case because a Project will always have exactly one mesh - a Substance Painter project cannot exist without a mesh). -- [x] Implement project open callback -- [x] On project open it notifies the user if the loaded model is outdated -- [x] Implement publishing logic -- [x] Workfile publishing -- [x] Export Texture Sets -- [x] Support OCIO using #4195 (draft brach is set up - see comment) -- [ ] Likely needs more testing on the OCIO front -- [x] Validate all outputs of the Export template are exported/generated -- [x] Allow validation to be optional **(issue: there's no API method to detect what maps will be exported without doing an actual export to disk)** -- [x] Support extracting/integration if not all outputs are generated -- [x] Support multiple materials/texture sets per instance -- [ ] Add validator that can enforce only a single texture set output if studio prefers that. -- [ ] Implement Export File Format (extensions) override in Creator -- [ ] Add settings so Admin can choose which extensions are available. - - -___ - -
- - -
-Data Exchange: Geometry in 3dsMax #4555 - -Introduces and updates a creator, extractors and loaders for model family - -Introduces new creator, extractors and loaders for model family while adding model families into the existing max scene loader and extractor -- [x] creators -- [x] adding model family into max scene loader and extractor -- [x] fbx loader -- [x] fbx extractor -- [x] usd loader -- [x] usd extractor -- [x] validator for model family -- [x] obj loader(update function) -- [x] fix the update function of the loader as #4675 -- [x] Add documentation - - -___ - -
- - -
-AfterEffects: add review flag to each instance #4884 - -Adds `mark_for_review` flag to the Creator to allow artists to disable review if necessary.Exposed this flag in Settings, by default set to True (eg. same behavior as previously). - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Houdini: Fix Validate Output Node (VDB) #4819 - -- Removes plug-in that was a duplicate of this plug-in. -- Optimize logging of many prims slightly -- Fix error reporting like https://github.com/ynput/OpenPype/pull/4818 did - - -___ - -
- - -
-Houdini: Add null node as output indicator when using TAB search #4834 - - -___ - -
- - -
-Houdini: Don't error in collect review if camera is not set correctly #4874 - -Do not raise an error in collector when invalid path is set as camera path. Allow camera path to not be set correctly in review instance until validation so it's nicely shown in a validation report. - - -___ - -
- - -
-Project packager: Backup and restore can store only database #4879 - -Pack project functionality have option to zip only project database without project files. Unpack project can skip project copy if the folder is not found.Added helper functions to `openpype.client.mongo` that can be also used for tests as replacement of mongo dump. - - -___ - -
- - -
-Houdini: ExtractOpenGL for Review instance not optional #4881 - -Don't make ExtractOpenGL optional for review instance optional. - - -___ - -
- - -
-Publisher: Small style changes #4894 - -Small changes in styles and form of publisher UI. - - -___ - -
- - -
-Houdini: Workfile icon in new publisher #4898 - -Fix icon for the workfile instance in new publisher - - -___ - -
- - -
-Fusion: Simplify creator icons code #4899 - -Simplify code for setting the icons for the Fusion creators - - -___ - -
- - -
-Enhancement: Fix PySide 6.5 support for loader #4900 - -Fixes PySide 6.5 support in Loader. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Validate Attributes #4917 - -This plugin was broken due to bad fetching of data and wrong repair action. - - -___ - -
- - -
-Fix: Locally copied version of last published workfile is not incremented #4722 - -### Fix 1 -When copied, the local workfile version keeps the published version number, when it must be +1 to follow OP's naming convention. - -### Fix 2 -Local workfile version's name is built from anatomy. This avoids to get workfiles with their publish template naming. - -### Fix 3 -In the case a subset has at least two tasks with published workfiles, for example `Modeling` and `Rigging`, launching `Rigging` was getting the first one with the `next` and trying to find representations, therefore `workfileModeling` and trying to match the current `task_name` (`Rigging`) with the `representation["context"]["task"]["name"]` of a Modeling representation, which was ending up to a `workfile_representation` to `None`, and exiting the process. - -Trying to find the `task_name` in the `subset['name']` fixes it. - -### Fix 4 -Fetch input dependencies of workfile. - -Replacing https://github.com/ynput/OpenPype/pull/4102 for changes to bring this home. -___ - -
- - -
-Maya: soft-fail when pan/zoom locked on camera when playblasting #4929 - -When pan/zoom enabled attribute on camera is locked, playblasting with pan/zoom fails because it is trying to restore it. This is fixing it by skipping over with warning. - - -___ - -
- -### **Merged pull requests** - - -
-Maya Load References - Add Display Handle Setting #4904 - -When we load a reference in Maya using OpenPype loader, display handle is checked by default and prevent us to select easily the object in the viewport. I understand that some productions like to keep this option, so I propose to add display handle to the reference loader settings. - - -___ - -
- - -
-Photoshop: add autocreators for review and flat image #4871 - -Review and flatten image (produced when no instance of `image` family was created) were created somehow magically. This PRintroduces two new auto creators which allow artists to disable review or flatten image.For all `image` instances `Review` flag was added to provide functionality to create separate review per `image` instance. Previously was possible only to have separate instance of `review` family.Review is not enabled on `image` family by default. (Eg. follows original behavior)Review auto creator is enabled by default as it was before.Flatten image creator must be set in Settings in `project_settings/photoshop/create/AutoImageCreator`. - - -___ - -
- - - - -## [3.15.5](https://github.com/ynput/OpenPype/tree/3.15.5) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.4...3.15.5) - -### **๐Ÿš€ Enhancements** - - -
-Maya: Playblast profiles #4777 - -Support playblast profiles.This enables studios to customize what playblast settings should be on a per task and/or subset basis. For example `modeling` should have `Wireframe On Shaded` enabled, while all other tasks should have it disabled. - - -___ - -
- - -
-Maya: Support .abc files directly for Arnold standin look assignment #4856 - -If `.abc` file is loaded into arnold standin support look assignment through the `cbId` attributes in the alembic file. - - -___ - -
- - -
-Maya: Hide animation instance in creator #4872 - -- Hide animation instance in creator -- Add inventory action to recreate animation publish instance for loaded rigs - - -___ - -
- - -
-Unreal: Render Creator enhancements #4477 - -Improvements to the creator for render family - -This PR introduces some enhancements to the creator for the render family in Unreal Engine: -- Added the option to create a new, empty sequence for the render. -- Added the option to not include the whole hierarchy for the selected sequence. -- Improvements of the error messages. - - -___ - -
- - -
-Unreal: Added settings for rendering #4575 - -Added settings for rendering in Unreal Engine. - -Two settings has been added: -- Pre roll frames, to set how many frames are used to load the scene before starting the actual rendering. -- Configuration path, to allow to save a preset of settings from Unreal, and use it for rendering. - - -___ - -
- - -
-Global: Optimize anatomy formatting by only formatting used templates instead #4784 - -Optimization to not format full anatomy when only a single template is used. Instead format only the single template instead. - - -___ - -
- - -
-Patchelf version locked #4853 - -For Centos dockerfile it is necessary to lock the patchelf version to the older, otherwise the build process fails. - -___ - -
- - -
-Houdini: Implement `switch` method on loaders #4866 - -Implement `switch` method on loaders - - -___ - -
- - -
-Code: Tweak docstrings and return type hints #4875 - -Tweak docstrings and return type hints for functions in `openpype.client.entities`. - - -___ - -
- - -
-Publisher: Clear comment on successful publish and on window close #4885 - -Clear comment text field on successful publish and on window close. - - -___ - -
- - -
-Publisher: Make sure to reset asset widget when hidden and reshown #4886 - -Make sure to reset asset widget when hidden and reshown. Without this the asset list would never refresh in the set asset widget when changing context on an existing instance and thus would not show new assets from after the first time launching that widget. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Fix nested model instances. #4852 - -Fix nested model instance under review instance, where data collection was not including "Display Lights" and "Focal Length". - - -___ - -
- - -
-Maya: Make default namespace naming backwards compatible #4873 - -Namespaces of loaded references are now _by default_ back to what they were before #4511 - - -___ - -
- - -
-Nuke: Legacy convertor skips deprecation warnings #4846 - -Nuke legacy convertor was triggering deprecated function which is causing a lot of logs which slows down whole process. Changed the convertor to skip all nodes without `AVALON_TAB` to avoid the warnings. - - -___ - -
- - -
-3dsmax: move startup script logic to hook #4849 - -Startup script for OpenPype was interfering with Open Last Workfile feature. Moving this loggic from simple command line argument in the Settings to pre-launch hook is solving the order of command line arguments and making both features work. - - -___ - -
- - -
-Maya: Don't change time slider ranges in `get_frame_range` #4858 - -Don't change time slider ranges in `get_frame_range` - - -___ - -
- - -
-Maya: Looks - calculate hash for tx texture #4878 - -Texture hash is calculated for textures used in published look and it is used as key in dictionary. In recent changes, this hash is not calculated for TX files, resulting in `None` value as key in dictionary, crashing publishing. This PR is adding texture hash for TX files to solve that issue. - - -___ - -
- - -
-Houdini: Collect `currentFile` context data separate from workfile instance #4883 - -Fix publishing without an active workfile instance due to missing `currentFile` data.Now collect `currentFile` into context in houdini through context plugin no matter the active instances. - - -___ - -
- - -
-Nuke: fixed broken slate workflow once published on deadline #4887 - -Slate workflow is now working as expected and Validate Sequence Frames is not raising the once slate frame is included. - - -___ - -
- - -
-Add fps as instance.data in collect review in Houdini. #4888 - -fix the bug of failing to publish extract review in HoudiniOriginal error: -```python - File "OpenPype\build\exe.win-amd64-3.9\openpype\plugins\publish\extract_review.py", line 516, in prepare_temp_data - "fps": float(instance.data["fps"]), -KeyError: 'fps' -``` - - -___ - -
- - -
-TrayPublisher: Fill missing data for instances with review #4891 - -Fill required data to instance in traypublisher if instance has review family. The data are required by ExtractReview and it would be complicated to do proper fix at this moment! The collector does for review instances what did https://github.com/ynput/OpenPype/pull/4383 - - -___ - -
- - -
-Publisher: Keep track about current context and fix context selection widget #4892 - -Change selected context to current context on reset. Fix bug when context widget is re-enabled. - - -___ - -
- - -
-Scene inventory: Model refresh fix with cherry picking #4895 - -Fix cherry pick issue in scene inventory. - - -___ - -
- - -
-Nuke: Pre-render and missing review flag on instance causing crash #4897 - -If instance created in nuke was missing `review` flag, collector crashed. - - -___ - -
- -### **Merged pull requests** - - -
-After Effects: fix handles KeyError #4727 - -Sometimes when publishing with AE (we only saw this error on AE 2023), we got a KeyError for the handles in the "Collect Workfile" step. So I did get the handles from the context if ther's no handles in the asset entity. - - -___ - -
- - - - -## [3.15.4](https://github.com/ynput/OpenPype/tree/3.15.4) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.3...3.15.4) - -### **๐Ÿ†• New features** - - -
-Maya: Cant assign shaders to the ass file - OP-4859 #4460 - -Support AiStandIn nodes for look assignment. - -Using operators we assign shaders and attribute/parameters to nodes within standins. Initially there is only support for a limited mount of attributes but we can add support as needed; -``` -primaryVisibility -castsShadows -receiveShadows -aiSelfShadows -aiOpaque -aiMatte -aiVisibleInDiffuseTransmission -aiVisibleInSpecularTransmission -aiVisibleInVolume -aiVisibleInDiffuseReflection -aiVisibleInSpecularReflection -aiSubdivUvSmoothing -aiDispHeight -aiDispPadding -aiDispZeroValue -aiStepSize -aiVolumePadding -aiSubdivType -aiSubdivIterations -``` - - -___ - -
- - -
-Maya: GPU cache representation #4649 - -Implement GPU cache for model, animation and pointcache. - - -___ - -
- - -
-Houdini: Implement review family with opengl node #3839 - -Implements a first pass for Reviews publishing in Houdini. Resolves #2720 - -Uses the `opengl` ROP node to produce PNG images. - - -___ - -
- - -
-Maya: Camera focal length visible in review - OP-3278 #4531 - -Camera focal length visible in review. - -Support camera focal length in review; static and dynamic.Resolves #3220 - - -___ - -
- - -
-Maya: Defining plugins to load on Maya start - OP-4994 #4714 - -Feature to define plugins to load on Maya launch. - - -___ - -
- - -
-Nuke, DL: Returning Suspended Publishing attribute #4715 - -Old Nuke Publisher's feature for suspended publishing job on render farm was added back to the current Publisher. - - -___ - -
- - -
-Settings UI: Allow setting a size hint for text fields #4821 - -Text entity have `minimum_lines_count` which allows to change minimum size hint of UI input. - - -___ - -
- - -
-TrayPublisher: Move 'BatchMovieCreator' settings to 'create' subcategory #4827 - -Moved settings for `BatchMoviewCreator` into subcategory `create` in settings. Changes are made to match other hosts settings chema and structure. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya looks: support for native Redshift texture format #2971 - -Add support for native Redshift textures handling. Closes #2599 - -Uses Redshift's Texture Processor executable to convert textures being used in renders to the Redshift ".rstexbin" format. - - -___ - -
- - -
-Maya: custom namespace for references #4511 - -Adding an option in Project Settings > Maya > Loader plugins to set custom namespace. If no namespace is set, the default one is used. - - -___ - -
- - -
-Maya: Set correct framerange with handles on file opening #4664 - -Set the range of playback from the asset data, counting handles, to get the correct data when calling the "collect_animation_data" function. - - -___ - -
- - -
-Maya: Fix camera update #4751 - -Fix resetting any modelPanel to a different camera when loading a camera and updating. - - -___ - -
- - -
-Maya: Remove single assembly validation for animation instances #4840 - -Rig groups may now be parented to others groups when `includeParentHierarchy` attribute on the instance is "off". - - -___ - -
- - -
-Maya: Optional control of display lights on playblast. #4145 - -Optional control of display lights on playblast. - -Giving control to what display lights are on the playblasts. - - -___ - -
- - -
-Kitsu: note family requirements #4551 - -Allowing to add family requirements to `IntegrateKitsuNote` task status change. - -Adds a `Family requirements` setting to `Integrate Kitsu Note`, so you can add requirements to determine if kitsu task status should be changed based on which families are published or not. For instance you could have the status change only if another subset than workfile is published (but workfile can still be included) by adding an item set to `Not equal` and `workfile`. - - -___ - -
- - -
-Deactivate closed Kitsu projects on OP #4619 - -Deactivate project on OP when the project is closed on Kitsu. - - -___ - -
- - -
-Maya: Suggestion to change capture labels. #4691 - -Change capture labels. - - -___ - -
- - -
-Houdini: Change node type for OpenPypeContext `null` -> `subnet` #4745 - -Change the node type for OpenPype's hidden context node in Houdini from `null` to `subnet`. This fixes #4734 - - -___ - -
- - -
-General: Extract burnin hosts filters #4749 - -Removed hosts filter from ExtractBurnin plugin. Instance without representations won't cause crash but just skip the instance. We've discovered because Blender already has review but did not create burnins. - - -___ - -
- - -
-Global: Improve speed of Collect Custom Staging Directory #4768 - -Improve speed of Collect Custom Staging Directory. - - -___ - -
- - -
-General: Anatomy templates formatting #4773 - -Added option to format only single template from anatomy instead of formatting all of them all the time. Formatting of all templates is causing slowdowns e.g. during publishing of hundreds of instances. - - -___ - -
- - -
-Harmony: Handle zip files with deeper structure #4782 - -External Harmony zip files might contain one additional level with scene name. - - -___ - -
- - -
-Unreal: Use common logic to configure executable #4788 - -Unreal Editor location and version was autodetected. This easied configuration in some cases but was not flexible enought. This PR is changing the way Unreal Editor location is set, unifying it with the logic other hosts are using. - - -___ - -
- - -
-Github: Grammar tweaks + uppercase issue title #4813 - -Tweak some of the grammar in the issue form templates. - - -___ - -
- - -
-Houdini: Allow creation of publish instances via Houdini TAB menu #4831 - -Register the available Creator's as houdini tools so an artist can add publish instances via the Houdini TAB node search menu from within the network editor. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Fix Collect Render for V-Ray, Redshift and Renderman for missing colorspace #4650 - -Fix Collect Render not working for Redshift, V-Ray and Renderman due to missing `colorspace` argument to `RenderProduct` dataclass. - - -___ - -
- - -
-Maya: Xgen fixes #4707 - -Fix for Xgen extraction of world parented nodes and validation for required namespace. - - -___ - -
- - -
-Maya: Fix extract review and thumbnail for Maya 2020 #4744 - -Fix playblasting in Maya 2020 with override viewport options enabled. Fixes #4730. - - -___ - -
- - -
-Maya: local variable 'arnold_standins' referenced before assignment - OP-5542 #4778 - -MayaLookAssigner erroring when MTOA is not loaded: -``` -# Traceback (most recent call last): -# File "\openpype\hosts\maya\tools\mayalookassigner\app.py", line 272, in on_process_selected -# nodes = list(set(item["nodes"]).difference(arnold_standins)) -# UnboundLocalError: local variable 'arnold_standins' referenced before assignment -``` - - -___ - -
- - -
-Maya: Fix getting view and display in Maya 2020 - OP-5035 #4795 - -The `view_transform` returns a different format in Maya 2020. Fixes #4540 (hopefully). - - -___ - -
- - -
-Maya: Fix Look Maya 2020 Py2 support for Extract Look #4808 - -Fix Extract Look supporting python 2.7 for Maya 2020. - - -___ - -
- - -
-Maya: Fix Validate Mesh Overlapping UVs plugin #4816 - -Fix typo in the code where a maya command returns a `list` instead of `str`. - - -___ - -
- - -
-Maya: Fix tile rendering with Vray - OP-5566 #4832 - -Fixes tile rendering with Vray. - - -___ - -
- - -
-Deadline: checking existing frames fails when there is number in file name #4698 - -Previous implementation of validator failed on files with any other number in rendered file names.Used regular expression pattern now handles numbers in the file names (eg "Main_beauty.v001.1001.exr", "Main_beauty_v001.1001.exr", "Main_beauty.1001.1001.exr") but not numbers behind frames (eg. "Main_beauty.1001.v001.exr") - - -___ - -
- - -
-Maya: Validate Render Settings. #4735 - -Fixes error message when using attribute validation. - - -___ - -
- - -
-General: Hero version sites recalculation #4737 - -Sites recalculation in integrate hero version did expect that it is integrated exactly same amount of files as in previous integration. This is not the case in many cases, so the sites recalculation happens in a different way, first are prepared all sites from previous representation files, and all of them are added to each file in new representation. - - -___ - -
- - -
-Houdini: Fix collect current file #4739 - -Fixes the Workfile publishing getting added into every instance being published from Houdini - - -___ - -
- - -
-Global: Fix Extract Burnin + Colorspace functions for conflicting python environments with PYTHONHOME #4740 - -This fixes the running of openpype processes from e.g. a host with conflicting python versions that had `PYTHONHOME` said additionally to `PYTHONPATH`, like e.g. Houdini Py3.7 together with OpenPype Py3.9 when using Extract Burnin for a review in #3839This fix applies to Extract Burnin and some of the colorspace functions that use `run_openpype_process` - - -___ - -
- - -
-Harmony: render what is in timeline in Harmony locally #4741 - -Previously it wasn't possible to render according to what was set in Timeline in scene start/end, just by what it was set in whole timeline.This allows artist to override what is in DB with what they require (with disabled `Validate Scene Settings`). Now artist can extend scene by additional frames, that shouldn't be rendered, but which might be desired.Removed explicit set scene settings (eg. applying frames and resolution directly to the scene after launch), added separate menu item to allow artist to do it themselves. - - -___ - -
- - -
-Maya: Extract Review settings add Use Background Gradient #4747 - -Add Display Gradient Background toggle in settings to fix support for setting flat background color for reviews. - - -___ - -
- - -
-Nuke: publisher is offering review on write families on demand #4755 - -Original idea where reviewable toggle will be offered in publisher on demand is fixed and now `review` attribute can be disabled in settings. - - -___ - -
- - -
-Workfiles: keep Browse always enabled #4766 - -Browse might make sense even if there are no workfiles present, actually in that case it makes the most sense (eg. I want to locate workfile from outside - from Desktop for example). - - -___ - -
- - -
-Global: label key in instance data is optional #4779 - -Collect OTIO review plugin is not crashing if `label` key is missing in instance data. - - -___ - -
- - -
-Loader: Fix missing variable #4781 - -There is missing variable `handles` in loader tool after https://github.com/ynput/OpenPype/pull/4746. The variable was renamed to `handles_label` and is initialized to `None` if handles are not available. - - -___ - -
- - -
-Nuke: Workfile Template builder fixes #4783 - -Popup window after Nuke start is not showing. Knobs with X/Y coordination on nodes where were converted from placeholders are not added if `keepPlaceholders` is witched off. - - -___ - -
- - -
-Maya: Add family filter 'review' to burnin profile with focal length #4791 - -Avoid profile burnin with `focalLength` key for renders, but use only for playblast reviews. - - -___ - -
- - -
-add farm instance to the render collector in 3dsMax #4794 - -bug fix for the failure of submitting publish job in 3dsmax - - -___ - -
- - -
-Publisher: Plugin active attribute is respected #4798 - -Publisher consider plugin's `active` attribute, so the plugin is not processed when `active` is set to `False`. But we use the attribute in `OptionalPyblishPluginMixin` for different purposes, so I've added hack bypass of the active state validation when plugin inherit from the mixin. This is temporary solution which cannot be changed until all hosts use Publisher otherwise global plugins would be broken. Also plugins which have `enabled` set to `False` are filtered out -> this happened only when automated settings were applied and the settings contained `"enabled"` key se to `False`. - - -___ - -
- - -
-Nuke: settings and optional attribute in publisher for some validators #4811 - -New publisher is supporting optional switch for plugins which is offered in Publisher in Right panel. Some plugins were missing this switch and also settings which would offer the optionality. - - -___ - -
- - -
-Settings: Version settings popup fix #4822 - -Version completer popup have issues on some platforms, this should fix those edge cases. Also fixed issue when completer stayed shown fater reset (save). - - -___ - -
- - -
-Hiero/Nuke: adding monitorOut key to settings #4826 - -New versions of Hiero were introduced with new colorspace property for Monitor Out. It have been added into project settings. Also added new config names into settings enumerator option. - - -___ - -
- - -
-Nuke: removed default workfile template builder preset #4835 - -Default for workfile template builder should have been empty. - - -___ - -
- - -
-TVPaint: Review can be made from any instance #4843 - -Add `"review"` tag to output of extract sequence if instance is marked for review. At this moment only instances with family `"review"` were able to define input for `ExtractReview` plugin which is not right. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Deadline: Remove unused FramesPerTask job info submission #4657 - -Remove unused `FramesPerTask` job info submission to Deadline. - - -___ - -
- - -
-Maya: Remove pymel dependency #4724 - -Refactors code written using `pymel` to use standard maya python libraries instead like `maya.cmds` or `maya.api.OpenMaya` - - -___ - -
- - -
-Remove "preview" data from representation #4759 - -Remove "preview" data from representation - - -___ - -
- - -
-Maya: Collect Review cleanup code for attached subsets #4720 - -Refactor some code for Maya: Collect Review for attached subsets. - - -___ - -
- - -
-Refactor: Remove `handles`, `edit_in` and `edit_out` backwards compatibility #4746 - -Removes backward compatibiliy fallback for data called `handles`, `edit_in` and `edit_out`. - - -___ - -
- -### **๐Ÿ“ƒ Documentation** - - -
-Bump webpack from 5.69.1 to 5.76.1 in /website #4624 - -Bumps [webpack](https://github.com/webpack/webpack) from 5.69.1 to 5.76.1. -
-Release notes -

Sourced from webpack's releases.

-
-

v5.76.1

-

Fixed

-
    -
  • Added assert/strict built-in to NodeTargetPlugin
  • -
-

Revert

- -

v5.76.0

-

Bugfixes

- -

Features

- -

Security

- -

Repo Changes

- -

New Contributors

- -

Full Changelog: https://github.com/webpack/webpack/compare/v5.75.0...v5.76.0

-

v5.75.0

-

Bugfixes

-
    -
  • experiments.* normalize to false when opt-out
  • -
  • avoid NaN%
  • -
  • show the correct error when using a conflicting chunk name in code
  • -
  • HMR code tests existance of window before trying to access it
  • -
  • fix eval-nosources-* actually exclude sources
  • -
  • fix race condition where no module is returned from processing module
  • -
  • fix position of standalong semicolon in runtime code
  • -
-

Features

-
    -
  • add support for @import to extenal CSS when using experimental CSS in node
  • -
- -
-

... (truncated)

-
-
-Commits - -
-
-Maintainer changes -

This version was pushed to npm by evilebottnawi, a new releaser for webpack since your current version.

-
-
- - -[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=webpack&package-manager=npm_and_yarn&previous-version=5.69.1&new-version=5.76.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) - -Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. - -[//]: # (dependabot-automerge-start) -[//]: # (dependabot-automerge-end) - ---- - -
-Dependabot commands and options -
- -You can trigger Dependabot actions by commenting on this PR: -- `@dependabot rebase` will rebase this PR -- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it -- `@dependabot merge` will merge this PR after your CI passes on it -- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it -- `@dependabot cancel merge` will cancel a previously requested merge and block automerging -- `@dependabot reopen` will reopen this PR if it is closed -- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually -- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) -- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language -- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language -- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language -- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language - -You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/ynput/OpenPype/network/alerts). - -
-___ - -
- - -
-Documentation: Add Extract Burnin documentation #4765 - -Add documentation for Extract Burnin global plugin settings. - - -___ - -
- - -
-Documentation: Move publisher related tips to publisher area #4772 - -Move publisher related tips for After Effects artist documentation to the correct position. - - -___ - -
- - -
-Documentation: Add extra terminology to the key concepts glossary #4838 - -Tweak some of the key concepts in the documentation. - - -___ - -
- -### **Merged pull requests** - - -
-Maya: Refactor Extract Look with dedicated processors for maketx #4711 - -Refactor Maya extract look to fix some issues: -- [x] Allow Extraction with maketx with OCIO Color Management enabled in Maya. -- [x] Fix file hashing so it includes arguments to maketx, so that when arguments change it correctly generates a new hash -- [x] Fix maketx destination colorspace when OCIO is enabled -- [x] Use pre-collected colorspaces of the resources instead of trying to retrieve again in Extract Look -- [x] Fix colorspace attributes being reinterpreted by maya on export (fix remapping) - goal is to resolve #2337 -- [x] Fix support for checking config path of maya default OCIO config (due to using `lib.get_color_management_preferences` which remaps that path) -- [x] Merged in #2971 to refactor MakeTX into TextureProcessor and also support generating Redshift `.rstexbin` files. - goal is to resolve #2599 -- [x] Allow custom arguments to `maketx` from OpenPype Settings like mentioned here by @fabiaserra for arguments like: `--monochrome-detect`, `--opaque-detect`, `--checknan`. -- [x] Actually fix the code and make it work. :) (I'll try to keep below checkboxes in sync with my code changes) -- [x] Publishing without texture processor should work (no maketx + no rstexbin) -- [x] Publishing with maketx should work -- [x] Publishing with rstexbin should work -- [x] Test it. (This is just me doing some test-runs, please still test the PR!) - - -___ - -
- - -
-Maya template builder load all assets linked to the shot #4761 - -Problem -All the assets of the ftrack project are loaded and not those linked to the shot - -How get error -Open maya in the context of shot, then build a new scene with the "Build Workfile from template" button in "OpenPype" menu. -![image](https://user-images.githubusercontent.com/7068597/229124652-573a23d7-a2b2-4d50-81bf-7592c00d24dc.png) - - -___ - -
- - -
-Global: Do not force instance data with frame ranges of the asset #4383 - -This aims to resolve #4317 - - -___ - -
- - -
-Cosmetics: Fix some grammar in docstrings and messages (and some code) #4752 - -Tweak some grammar in codebase - - -___ - -
- - -
-Deadline: Submit publish job fails due root work hardcode - OP-5528 #4775 - -Generating config templates was hardcoded to `root[work]`. This PR fixes that. - - -___ - -
- - -
-CreateContext: Added option to remove Unknown attributes #4776 - -Added option to remove attributes with UnkownAttrDef on instances. Pop of key will also remove the attribute definition from attribute values, so they're not recreated again. - - -___ - -
- - - -## [3.15.3](https://github.com/ynput/OpenPype/tree/3.15.3) - - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.2...3.15.3) - -### **๐Ÿ†• New features** - - -
-Blender: Extract Review #3616 - -Added Review to Blender. - -This implementation is based on #3508 but made compatible for the current implementation of OpenPype for Blender. - - -___ - -
- - -
-Data Exchanges: Point Cloud for 3dsMax #4532 - -Publish PRT format with tyFlow in 3dsmax - -Publish PRT format with tyFlow in 3dsmax and possibly set up loader to load the format too. -- [x] creator -- [x] extractor -- [x] validator -- [x] loader - - -___ - -
- - -
-Global: persistent staging directory for renders #4583 - -Allows configure if staging directory (`stagingDir`) should be persistent with use of profiles. - -With this feature, users can specify a transient data folder path based on presets, which can be used during the creation and publishing stages. In some cases, these DCCs automatically add a rendering path during the creation stage, which is then used in publishing.One of the key advantages of this feature is that it allows users to take advantage of faster storages for rendering, which can help improve workflow efficiency. Additionally, this feature allows users to keep their rendered data persistent, and use their own infrastructure for regular cleaning.However, it should be noted that some productions may want to use this feature without persistency. Furthermore, there may be a need for retargeting the rendering folder to faster storages, which is also not supported at the moment.It is studio responsibility to clean up obsolete folders with data.Location of the folder is configured in `project_anatomy/templates/others`. ('transient' key is expected, with 'folder' key, could be more templates)Which family/task type/subset is applicable is configured in:`project_settings/global/tools/publish/transient_dir_profiles` - - -___ - -
- - -
-Kitsu custom comment template #4599 - -Kitsu allows to write markdown in its comment field. This can be something very powerful to deliver dynamic comments with the help the data from the instance.This feature is defaults to off so the admin have to manually set up the comment field the way they want.I have added a basic example on how the comment can look like as the comment-fields default value.To this I want to add some documentation also but that's on its way when the code itself looks good for the reviewers. - - -___ - -
- - -
-MaxScene Family #4615 - -Introduction of the Max Scene Family - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: Multiple values on single render attribute - OP-4131 #4631 - -When validating render attributes, this adds support for multiple values. When repairing first value in list is used. - - -___ - -
- - -
-Maya: enable 2D Pan/Zoom for playblasts - OP-5213 #4687 - -Setting for enabling 2D Pan/Zoom on reviews. - - -___ - -
- - -
-Copy existing or generate new Fusion profile on prelaunch #4572 - -Fusion preferences will be copied to the predefined `~/.openpype/hosts/fusion/prefs` folder (or any other folder set in system settings) on launch. - -The idea is to create a copy of existing Fusion profile, adding an OpenPype menu to the Fusion instance.By default the copy setting is turned off, so no file copying is performed. Instead the clean Fusion profile is created by Fusion in the predefined folder. The default locaion is set to `~/.openpype/hosts/fusion/prefs`, to better comply with the other os platforms. After creating the default profile, some modifications are applied: -- forced Python3 -- forced English interface -- setup Openpype specific path maps.If the `copy_prefs` checkbox is toggled, a copy of existing Fusion profile folder will be placed in the mentioned location. Then they are altered the same way as described above. The operation is run only once, on the first launch, unless the `force_sync [Resync profile on each launch]` is toggled.English interface is forced because the `FUSION16_PROFILE_DIR` environment variable is not read otherwise (seems to be a Fusion bug). - - -___ - -
- - -
-Houdini: Create button open new publisher's "create" tab #4601 - -During a talk with @maxpareschi he mentioned that the new publisher in Houdini felt super confusing due to "Create" going to the older creator but now being completely empty and the publish button directly went to the publish tab.This resolves that by fixing the Create button to now open the new publisher but on the Create tab.Also made publish button enforce going to the "publish" tab for consistency in usage.@antirotor I think changing the Create button's callback was just missed in this commit or was there a specific reason to not change that around yet? - - -___ - -
- - -
-Clockify: refresh and fix the integration #4607 - -Due to recent API changes, Clockify requires `user_id` to operate with the timers. I updated this part and currently it is a WIP for making it fully functional. Most functions, such as start and stop timer, and projects sync are currently working. For the rate limiting task new dependency is added: https://pypi.org/project/ratelimiter/ - - -___ - -
- - -
-Fusion publish existing frames #4611 - -This PR adds the function to publish existing frames instead of having to re-render all of them for each new publish.I have split the render_locally plugin so the review-part is its own plugin now.I also change the saver-creator-plugin's label from Saver to Render (saver) as I intend to add a Prerender creator like in Nuke. - - -___ - -
- - -
-Resolution settings referenced from DB record for 3dsMax #4652 - -- Add Callback for setting the resolution according to DB after the new scene is created. -- Add a new Action into openpype menu which allows the user to reset the resolution in 3dsMax - - -___ - -
- - -
-3dsmax: render instance settings in Publish tab #4658 - -Allows user preset the pools, group and use_published settings in Render Creator in the Max Hosts.User can set the settings before or after creating instance in the new publisher - - -___ - -
- - -
-scene length setting referenced from DB record for 3dsMax #4665 - -Setting the timeline length based on DB record in 3dsMax Hosts - - -___ - -
- - -
-Publisher: Windows reduce command window pop-ups during Publishing #4672 - -Reduce the command line pop-ups that show on Windows during publishing. - - -___ - -
- - -
-Publisher: Explicit save #4676 - -Publisher have explicit button to save changes, so reset can happen without saving any changes. Save still happens automatically when publishing is started or on publisher window close. But a popup is shown if context of host has changed. Important context was enhanced by workfile path (if host integration supports it) so workfile changes are captured too. In that case a dialog with confirmation is shown to user. All callbacks that may require save of context were moved to main window to be able handle dialog show at one place. Save changes now returns success so the rest of logic is skipped -> publishing won't start, when save of instances fails.Save and reset buttons have shortcuts (Ctrl + s and Ctrls + r). - - -___ - -
- - -
-CelAction: conditional workfile parameters from settings #4677 - -Since some productions were requesting excluding some workfile parameters from publishing submission, we needed to move them to settings so those could be altered per project. - - -___ - -
- - -
-Improve logging of used app + tool envs on application launch #4682 - -Improve logging of what apps + tool environments got loaded for an application launch. - - -___ - -
- - -
-Fix name and docstring for Create Workdir Extra Folders prelaunch hook #4683 - -Fix class name and docstring for Create Workdir Extra Folders prelaunch hookThe class name and docstring were originally copied from another plug-in and didn't match the plug-in logic.This also fixes potentially seeing this twice in your logs. Before:After:Where it was actually running both this prelaunch hook and the actual `AddLastWorkfileToLaunchArgs` plugin. - - -___ - -
- - -
-Application launch context: Include app group name in logger #4684 - -Clarify in logs better what app group the ApplicationLaunchContext belongs to and what application is being launched.Before:After: - - -___ - -
- - -
-increment workfile version 3dsmax #4685 - -increment workfile version in 3dsmax as if in blender and maya hosts. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-Maya: Fix getting non-active model panel. #2968 - -When capturing multiple cameras with image planes that have file sequences playing, only the active (first) camera will play through the file sequence. - - -___ - -
- - -
-Maya: Fix broken review publishing. #4549 - -Resolves #4547 - - -___ - -
- - -
-Maya: Avoid error on right click in Loader if `mtoa` is not loaded #4616 - -Fix an error on right clicking in the Loader when `mtoa` is not a loaded plug-in.Additionally if `mtoa` isn't loaded the loader will now load the plug-in before trying to create the arnold standin. - - -___ - -
- - -
-Maya: Fix extract look colorspace detection #4618 - -Fix the logic which guesses the colorspace using `arnold` python library. -- Previously it'd error if `mtoa` was not available on path so it still required `mtoa` to be available. -- The guessing colorspace logic doesn't actually require `mtoa` to be loaded, but just the `arnold` python library to be available. This changes the logic so it doesn't require the `mtoa` plugin to get loaded to guess the colorspace. -- The if/else branch was likely not doing what was intended `cmds.loadPlugin("mtoa", quiet=True)` returns None if the plug-in was already loaded. So this would only ever be true if it ends up loading the `mtoa` plugin the first time. -```python -# Tested in Maya 2022.1 -print(cmds.loadPlugin("mtoa", quiet=True)) -# ['mtoa'] -print(cmds.loadPlugin("mtoa", quiet=True)) -# None -``` - - -___ - -
- - -
-Maya: Maya Playblast Options overrides - OP-3847 #4634 - -When publishing a review in Maya, the extractor would fail due to wrong (long) panel name. - - -___ - -
- - -
-Bugfix/op 2834 fix extract playblast #4701 - -Paragraphs contain detailed information on the changes made to the product or service, providing an in-depth description of the updates and enhancements. They can be used to explain the reasoning behind the changes, or to highlight the importance of the new features. Paragraphs can often include links to further information or support documentation. - - -___ - -
- - -
-Bugfix/op 2834 fix extract playblast #4704 - -Paragraphs contain detailed information on the changes made to the product or service, providing an in-depth description of the updates and enhancements. They can be used to explain the reasoning behind the changes, or to highlight the importance of the new features. Paragraphs can often include links to further information or support documentation. - - -___ - -
- - -
-Maya: bug fix for passing zoom settings if review is attached to subset #4716 - -Fix for attaching review to subset with pan/zoom option. - - -___ - -
- - -
-Maya: tile assembly fail in draft - OP-4820 #4416 - -Tile assembly in Deadline was broken. - -Initial bug report revealed other areas of the tile assembly that needed fixing. - - -___ - -
- - -
-Maya: Yeti Validate Rig Input - OP-3454 #4554 - -Fix Yeti Validate Rig Input - -Existing workflow was broken due to this #3297. - - -___ - -
- - -
-Scene inventory: Fix code errors when "not found" entries are found #4594 - -Whenever a "NOT FOUND" entry is present a lot of errors happened in the Scene Inventory: -- It started spamming a lot of errors for the VersionDelegate since it had no numeric version (no version at all).Error reported on Discord: -```python -Traceback (most recent call last): - File "C:\Users\videopro\Documents\github\OpenPype\openpype\tools\utils\delegates.py", line 65, in paint - text = self.displayText( - File "C:\Users\videopro\Documents\github\OpenPype\openpype\tools\utils\delegates.py", line 33, in displayText - assert isinstance(value, numbers.Integral), ( -AssertionError: Version is not integer. "None" -``` -- Right click menu would error on NOT FOUND entries, and thus not show. With this PR it will now _disregard_ not found items for "Set version" and "Remove" but still allow actions.This PR resolves those. - - -___ - -
- - -
-Kitsu: Sync OP with zou, make sure value-data is int or float #4596 - -Currently the data zou pulls is a string and not a value causing some bugs in the pipe where a value is expected (like `Set frame range` in Fusion). - - - -This PR makes sure each value is set with int() or float() so these bugs can't happen later on. - - - -_(A request to cgwire has also bin sent to allow force values only for some metadata columns, but currently the user can enter what ever they want in there)_ - - -___ - -
- - -
-Max: fix the bug of removing an instance #4617 - -fix the bug of removing an instance in 3dsMax - - -___ - -
- - -
-Global | Nuke: fixing farm publishing workflow #4623 - -After Nuke had adopted new publisher with new creators new issues were introduced. Those issues were addressed with this PR. Those are for example broken reviewable video files publishing if published via farm. Also fixed local publishing. - - -___ - -
- - -
-Ftrack: Ftrack additional families filtering #4633 - -Ftrack family collector makes sure the subset family is also in instance families for additional families filtering. - - -___ - -
- - -
-Ftrack: Hierarchical <> Non-Hierarchical attributes sync fix #4635 - -Sync between hierarchical and non-hierarchical attributes should be fixed and work as expected. Action should sync the values as expected and event handler should do it too and only on newly created entities. - - -___ - -
- - -
-bugfix for 3dsmax publishing error #4637 - -fix the bug of failing publishing job in 3dsMax - - -___ - -
- - -
-General: Use right validation for ffmpeg executable #4640 - -Use ffmpeg exec validation for ffmpeg executables instead of oiio exec validation. The validation is used as last possible source of ffmpeg from `PATH` environment variables, which is an edge case but can cause issues. - - -___ - -
- - -
-3dsmax: opening last workfile #4644 - -Supports opening last saved workfile in 3dsmax host. - - -___ - -
- - -
-Fixed a bug where a QThread in the splash screen could be destroyed before finishing execution #4647 - -This should fix the occasional behavior of the QThread being destroyed before even its worker returns from the `run()` function.After quiting, it should wait for the QThread object to properly close itself. - - -___ - -
- - -
-General: Use right plugin class for Collect Comment #4653 - -Collect Comment plugin is instance plugin so should inherit from `InstancePlugin` instead of `ContextPlugin`. - - -___ - -
- - -
-Global: add tags field to thumbnail representation #4660 - -Thumbnail representation might be missing tags field. - - -___ - -
- - -
-Integrator: Enforce unique destination transfers, disallow overwrites in queued transfers #4662 - -Fix #4656 by enforcing unique destination transfers in the Integrator. It's now disallowed to a destination in the file transaction queue with a new source path during the publish. - - -___ - -
- - -
-Hiero: Creator with correct workfile numeric padding input #4666 - -Creator was showing 99 in workfile input for long time, even if users set default value to 1001 in studio settings. This has been fixed now. - - -___ - -
- - -
-Nuke: Nukenodes family instance without frame range #4669 - -No need to add frame range data into `nukenodes` (backdrop) family publishes - since those are timeless. - - -___ - -
- - -
-TVPaint: Optional Validation plugins can be de/activated by user #4674 - -Added `OptionalPyblishPluginMixin` to TVpaint plugins that can be optional. - - -___ - -
- - -
-Kitsu: Slightly less strict with instance data #4678 - -- Allow to take task name from context if asset doesn't have any. Fixes an issue with Photoshop's review instance not having `task` in data. -- Allow to match "review" against both `instance.data["family"]` and `instance.data["families"]` because some instances don't have the primary family in families, e.g. in Photoshop and TVPaint. -- Do not error on Integrate Kitsu Review whenever for whatever reason Integrate Kitsu Note did not created a comment but just log the message that it was unable to connect a review. - - -___ - -
- - -
-Publisher: Fix reset shortcut sequence #4694 - -Fix bug created in https://github.com/ynput/OpenPype/pull/4676 where key sequence is checked using unsupported method. The check was changed to convert event into `QKeySequence` object which can be compared to prepared sequence. - - -___ - -
- - -
-Refactor _capture #4702 - -Paragraphs contain detailed information on the changes made to the product or service, providing an in-depth description of the updates and enhancements. They can be used to explain the reasoning behind the changes, or to highlight the importance of the new features. Paragraphs can often include links to further information or support documentation. - - -___ - -
- - -
-Hiero: correct container colors if UpToDate #4708 - -Colors on loaded containers are now correctly identifying real state of version. `Red` for out of date and `green` for up to date. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Look Assigner: Move Look Assigner tool since it's Maya only #4604 - -Fix #4357: Move Look Assigner tool to maya since it's Maya only - - -___ - -
- - -
-Maya: Remove unused functions from Extract Look #4671 - -Remove unused functions from Maya Extract Look plug-in - - -___ - -
- - -
-Extract Review code refactor #3930 - -Trying to reduce complexity of Extract Review plug-in -- Re-use profile filtering from lib -- Remove "combination families" additional filtering which supposedly was from OP v2 -- Simplify 'formatting' for filling gaps -- Use `legacy_io.Session` over `os.environ` - - -___ - -
- - -
-Maya: Replace last usages of Qt module #4610 - -Replace last usage of `Qt` module with `qtpy`. This change is needed for `PySide6` support. All changes happened in Maya loader plugins. - - -___ - -
- - -
-Update tests and documentation for `ColormanagedPyblishPluginMixin` #4612 - -Refactor `ExtractorColormanaged` to `ColormanagedPyblishPluginMixin` in tests and documentation. - - -___ - -
- - -
-Improve logging of used app + tool envs on application launch (minor tweak) #4686 - -Use `app.full_name` for change done in #4682 - - -___ - -
- -### **๐Ÿ“ƒ Documentation** - - -
-Docs/add architecture document #4344 - -Add `ARCHITECTURE.md` document. - -his document attemps to give a quick overview of the project to help onboarding, it's not an extensive documentation but more of a elevator pitch one-line descriptions of files/directories and what the attempt to do. - - -___ - -
- - -
-Documentation: Tweak grammar and fix some typos #4613 - -This resolves some grammar and typos in the documentation.Also fixes the extension of some images in after effects docs which used uppercase extension even though files were lowercase extension. - - -___ - -
- - -
-Docs: Fix some minor grammar/typos #4680 - -Typo/grammar fixes in documentation. - - -___ - -
- -### **Merged pull requests** - - -
-Maya: Implement image file node loader #4313 - -Implements a loader for loading texture image into a `file` node in Maya. - -Similar to Maya's hypershade creation of textures on load you have the option to choose for three modes of creating: -- Texture -- Projection -- StencilThese should match what Maya generates if you create those in Maya. -- [x] Load and manage file nodes -- [x] Apply color spaces after #4195 -- [x] Support for _either_ UDIM or image sequence - currently it seems to always load sequences as UDIM automatically. -- [ ] Add support for animation sequences of UDIM textures using the `..exr` path format? - - -___ - -
- - -
-Maya Look Assigner: Don't rely on containers for get all assets #4600 - -This resolves #4044 by not actually relying on containers in the scene but instead just rely on finding nodes with `cbId` attributes. As such, imported nodes would also be found and a shader can be assigned (similar to when using get from selection).**Please take into consideration the potential downsides below**Potential downsides would be: -- IF an already loaded look has any dagNodes, say a 3D Projection node - then that will also show up as a loaded asset where previously nodes from loaded looks were ignored. -- If any dag nodes were created locally - they would have gotten `cbId` attributes on scene save and thus the current asset would almost always show? - - -___ - -
- - -
-Maya: Unify menu labels for "Set Frame Range" and "Set Resolution" #4605 - -Fix #4109: Unify menu labels for "Set Frame Range" and "Set Resolution"This also tweaks it in Houdini from Reset Frame Range to Set Frame Range. - - -___ - -
- - -
-Resolve missing OPENPYPE_MONGO in deadline global job preload #4484 - -In the GlobalJobPreLoad plugin, we propose to replace the SpawnProcess by a sub-process and to pass the environment variables in the parameters, since the SpawnProcess under Centos Linux does not pass the environment variables. - -In the GlobalJobPreLoad plugin, the Deadline SpawnProcess is used to start the OpenPype process. The problem is that the SpawnProcess does not pass environment variables, including OPENPYPE_MONGO, to the process when it is under Centos7 linux, and the process gets stuck. We propose to replace it by a subprocess and to pass the variable in the parameters. - - -___ - -
- - -
-Tests: Added setup_only to tests #4591 - -Allows to download test zip, unzip and restore DB in preparation for new test. - - -___ - -
- - -
-Maya: Arnold don't reset maya timeline frame range on render creation (or setting render settings) #4603 - -Fix #4429: Do not reset fps or playback timeline on applying or creating render settings - - -___ - -
- - -
-Bump @sideway/formula from 3.0.0 to 3.0.1 in /website #4609 - -Bumps [@sideway/formula](https://github.com/sideway/formula) from 3.0.0 to 3.0.1. -
-Commits - -
-
-Maintainer changes -

This version was pushed to npm by marsup, a new releaser for @โ€‹sideway/formula since your current version.

-
-
- - -[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@sideway/formula&package-manager=npm_and_yarn&previous-version=3.0.0&new-version=3.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) - -Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. - -[//]: # (dependabot-automerge-start) -[//]: # (dependabot-automerge-end) - ---- - -
-Dependabot commands and options -
- -You can trigger Dependabot actions by commenting on this PR: -- `@dependabot rebase` will rebase this PR -- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it -- `@dependabot merge` will merge this PR after your CI passes on it -- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it -- `@dependabot cancel merge` will cancel a previously requested merge and block automerging -- `@dependabot reopen` will reopen this PR if it is closed -- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually -- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) -- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language -- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language -- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language -- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language - -You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/ynput/OpenPype/network/alerts). - -
-___ - -
- - -
-Update artist_hosts_maya_arnold.md #4626 - -Correct Arnold docs. -___ - -
- - -
-Maya: Add "Include Parent Hierarchy" option in animation creator plugin #4645 - -Add an option in Project Settings > Maya > Creator Plugins > Create Animation to include (or not) parent hierarchy. This is to avoid artists to check manually the option for all create animation. - - -___ - -
- - -
-General: Filter available applications #4667 - -Added option to filter applications that don't have valid executable available in settings in launcher and ftrack actions. This option can be disabled in new settings category `Applications`. The filtering is by default disabled. - - -___ - -
- - -
-3dsmax: make sure that startup script executes #4695 - -Fixing reliability of OpenPype startup in 3dsmax. - - -___ - -
- - -
-Project Manager: Change minimum frame start/end to '0' #4719 - -Project manager can have frame start/end set to `0`. - - -___ - -
- - - -## [3.15.2](https://github.com/ynput/OpenPype/tree/3.15.2) - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.1...3.15.2) - -### **๐Ÿ†• New features** - - -
-maya gltf texture convertor and validator #4261 - -Continuity of the gltf extractor implementation - -Continuity of the gltf extractor https://github.com/pypeclub/OpenPype/pull/4192UPDATE:**Validator for GLSL Shader**: Validate whether the mesh uses GLSL Shader. If not it will error out. The user can choose to perform the repair action and it will help to assign glsl shader. If the mesh with Stringray PBS, the repair action will also check to see if there is any linked texture such as Color, Occulsion, and Normal Map. If yes, it will help to relink the related textures to the glsl shader.*****If the mesh uses the PBS Shader, - - -___ - -
- - -
-Unreal: New Publisher #4370 - -Implementation of the new publisher for Unreal. - -The implementation of the new publisher for Unreal. This PR includes the changes for all the existing creators to be compatible with the new publisher.The basic creator has been split in two distinct creators: -- `UnrealAssetCreator`, works with assets in the Content Browser. -- `UnrealActorCreator` that works with actors in the scene. - - -___ - -
- - -
-Implementation of a new splash screen #4592 - -Implemented a new splash screen widget to reflect a process running in the background. This widget can be used for other tasks than UE. **Also fixed the compilation error of the AssetContainer.cpp when trying to build the plugin in UE 5.0** - - -___ - -
- - -
-Deadline for 3dsMax #4439 - -Setting up deadline for 3dsmax - -Setting up deadline for 3dsmax by setting render outputs and viewport camera - - -___ - -
- - -
-Nuke: adding nukeassist #4494 - -Adding support for NukeAssist - -For support of NukeAssist we had to limit some Nuke features since NukeAssist itself Nuke with limitations. We do not support Creator and Publisher. User can only Load versions with version control. User can also set Framerange and Colorspace. - - -___ - -
- -### **๐Ÿš€ Enhancements** - - -
-Maya: OP-2630 acescg maya #4340 - -Resolves #2712 - - -___ - -
- - -
-Default Ftrack Family on RenderLayer #4458 - -With default settings, renderlayers in Maya were not being tagged with the Ftrack family leading to confusion when doing reviews. - - -___ - -
- - -
-Maya: Maya Playblast Options - OP-3783 #4487 - -Replacement PR for #3912. Adds more options for playblasts to preferences/settings. - -Adds the following as options in generating playblasts, matching viewport settings. -- Use default material -- Wireframe on shaded -- X-ray -- X-ray Joints -- X-ray active component - - -___ - -
- - -
-Maya: Passing custom attributes to alembic - OP-4111 #4516 - -Passing custom attributes to alembic - -This PR makes it possible to pass all user defined attributes along to the alembic representation. - - -___ - -
- - -
-Maya: Options for VrayProxy output - OP-2010 #4525 - -Options for output of VrayProxy. - -Client requested more granular control of output from VrayProxy instance. Exposed options on the instance and settings for vrmesh and alembic. - - -___ - -
- - -
-Maya: Validate missing instance attributes #4559 - -Validate missing instance attributes. - -New attributes can be introduced as new features come in. Old instances will need to be updated with these attributes for the documentation to make sense, and users do not have to recreate the instances. - - -___ - -
- - -
-Refactored Generation of UE Projects, installation of plugins moved to the engine #4369 - -Improved the way how OpenPype works with generation of UE projects. Also the installation of the plugin has been altered to install into the engine - -OpenPype now uses the appropriate tools to generate UE projects. Unreal Build Tool (UBT) and a "Commandlet Project" is needed to properly generate a BP project, or C++ code in case that `dev_mode = True`, folders, the .uproject file and many other resources.On the plugin's side, it is built seperately with the UnrealAutomationTool (UAT) and then it's contents are moved under the `Engine/Plugins/Marketplace/OpenPype` directory. - - -___ - -
- - -
-Unreal: Use client functions in Layout loader #4578 - -Use 'get_representations' instead of 'legacy_io' query in layout loader. - -This is removing usage of `find_one` called on `legacy_io` and use rather client functions as preparation for AYON connection. Also all representations are queried at once instead of one by one. - - -___ - -
- - -
-General: Support for extensions filtering in loaders #4492 - -Added extensions filtering support to loader plugins. - -To avoid possible backwards compatibility break is filtering exactly the same and filtering by extensions is enabled only if class attribute 'extensions' is set. - - -___ - -
- - -
-Nuke: multiple reformat in baking review profiles #4514 - -Added support for multiple reformat nodes in baking profiles. - -Old settings for single reformat node is supported and prioritised just in case studios are using it and backward compatibility is needed. Warnings in Nuke terminal are notifying users to switch settings to new workflow. Settings are also explaining the migration way. - - -___ - -
- - -
-Nuke: Add option to use new creating system in workfile template builder #4545 - -Nuke workfile template builder can use new creators instead of legacy creators. - -Modified workfile template builder to have option to say if legacy creators should be used or new creators. Legacy creators are disabled by default, so Maya has changed the value. - - -___ - -
- - -
-Global, Nuke: Workfile first version with template processing #4579 - -Supporting new template workfile builder with toggle for creation of first version of workfile in case there is none yet. - - -___ - -
- - -
-Fusion: New Publisher #4523 - -This is an updated PR for @BigRoy 's old PR (https://github.com/ynput/OpenPype/pull/3892).I have merged it with code from OP 3.15.1-nightly.6 and made sure it works as expected.This converts the old publishing system to the new one. It implements Fusion as a new host addon. - - -- Create button removed in OpenPype menu in favor of the new Publisher -- Draft refactor validations to raise PublishValidationError -- Implement Creator for New Publisher -- Implement Fusion as Host addon - - -___ - -
- - -
-TVPaint: Use Publisher tool #4471 - -Use Publisher tool and new creation system in TVPaint integration. - -Using new creation system makes TVPaint integration a little bit easier to maintain for artists. Removed unneeded tools Creator and Subset Manager tools. Goal is to keep the integration work as close as possible to previous integration. Some changes were made but primarilly because they were not right using previous system.All creators create instance with final family instead of changing the family during extraction. Render passes are not related to group id but to render layer instance. Render layer is still related to group. Workfile, review and scene render instances are created using autocreators instead of auto-collection during publishing. Subset names are fully filled during publishing but instance labels are filled on refresh with the last known right value. Implemented basic of legacy convertor which should convert render layers and render passes. - - -___ - -
- - -
-TVPaint: Auto-detect render creation #4496 - -Create plugin which will create Render Layer and Render Pass instances based on information in the scene. - -Added new creator that must be triggered by artist. The create plugin will first create Render Layer instances if were not created yet. For variant is used color group name. The creator has option to rename color groups by template defined in settings -> Template may use index of group by it's usage in scene (from bottom to top). After Render Layers will create Render Passes. Render Pass is created for each individual TVPaint layer in any group that had created Render Layer. It's name is used as variant (pass). - - -___ - -
- - -
-TVPaint: Small enhancements #4501 - -Small enhancements in TVPaint integration which did not get to https://github.com/ynput/OpenPype/pull/4471. - -It was found out that `opacity` returned from `tv_layerinfo` is always empty and is dangerous to add it to layer information. Added information about "current" layer to layers information. Disable review of Render Layer and Render Pass instances by default. In most of productions is used only "scene review". Skip usage of `"enabled"` key from settings in automated layer/pass creation. - - -___ - -
- - -
-Global: color v3 global oiio transcoder plugin #4291 - -Implements possibility to use `oiiotool` to transcode image sequences from one color space to another(s). - -Uses collected `colorspaceData` information about source color spaces, these information needs to be collected previously in each DCC interested in color management.Uses profiles configured in Settings to create single or multiple new representations (and file extensions) with different color spaces.New representations might replace existing one, each new representation might contain different tags and custom tags to control its integration step. - - -___ - -
- - -
-Deadline: Added support for multiple install dirs in Deadline #4451 - -SearchDirectoryList returns FIRST existing so if you would have multiple OP install dirs, it won't search for appropriate version in later ones. - - -___ - -
- - -
-Ftrack: Upload reviewables with original name #4483 - -Ftrack can integrate reviewables with original filenames. - -As ftrack have restrictions about names of components the only way how to achieve the result was to upload the same file twice, one with required name and one with origin name. - - -___ - -
- - -
-TVPaint: Ignore transparency in Render Pass #4499 - -It is possible to ignore layers transparency during Render Pass extraction. - -Render pass extraction does not respect opacity of TVPaint layers set in scene during extraction. It can be enabled/disabled in settings. - - -___ - -
- - -
-Anatomy: Preparation for different root overrides #4521 - -Prepare Anatomy to handle only 'studio' site override on it's own. - -Change how Anatomy fill root overrides based on requested site name. The logic which decide what is active site was moved to sync server addon and the same for receiving root overrides of local site. The Anatomy resolve only studio site overrides anything else is handled by sync server. BaseAnatomy only expect root overrides value and does not need site name. Validation of site name happens in sync server same as resolving if site name is local or not. - - -___ - -
- - -
-Nuke | Global: colormanaged plugin in collection #4556 - -Colormanaged extractor had changed to Mixin class so it can be added to any stage of publishing rather then just to Exctracting.Nuke is no collecting colorspaceData to representation collected on already rendered images. - -Mixin class can no be used as secondary parent in publishing plugins. - - -___ - -
- -### **๐Ÿ› Bug fixes** - - -
-look publishing and srgb colorspace in maya #4276 - -Check the OCIO color management is enabled before doing linearize colorspace for converting the texture maps into tx files. - -Check whether the OCIO color management is enabled before the condition of converting the texture to tx extension. - - -___ - -
- - -
-Maya: extract Thumbnail "No active model panel found" - OP-3849 #4421 - -Error when extracting playblast with no model panel. - -If `project_settings/maya/publish/ExtractPlayblast/capture_preset/Viewport Options/override_viewport_options` were off and publishing without showing any model panel, the extraction would fail. - - -___ - -
- - -
-Maya: Fix setting scene fps with float input #4488 - -Returned value of float fps on integer values would return float. - -This PR fixes the case when switching between integer fps values for example 24 > 25. Issue was when setting the scene fps, the original float value was used which makes it unpredictable whether the value is float or integer when mapping the fps values. - - -___ - -
- - -
-Maya: Multipart fix #4497 - -Fix multipart logic in render products. - -Each renderer has a different way of defining whether output images is multipart, so we need to define it for each renderer. Also before the `multipart` class variable was defined multiple times in several places, which made it tricky to debug where `multipart` was defined. Now its created on initialization and referenced as `self.multipart` - - -___ - -
- - -
-Maya: Set pool on tile assembly - OP-2012 #4520 - -Set pool on tile assembly - -Pool for publishing and tiling jobs, need to use the settings (`project_settings/deadline/publish/ProcessSubmittedJobOnFarm/deadline_pool`) else fallback on primary pool (`project_settings/deadline/publish/CollectDeadlinePools/primary_pool`) - - -___ - -
- - -
-Maya: Extract review with handles #4527 - -Review was not extracting properly with/without handles. - -Review instance was not created properly resulting in the frame range on the instance including handles. - - -___ - -
- - -
-Maya: Fix broken lib. #4529 - -Fix broken lib. - -This commit from this PR broke the Maya lib module. - - -___ - -
- - -
-Maya: Validate model name - OP-4983 #4539 - -Validate model name issues. - -Couple of issues with validate model name; -- missing platform extraction from settings -- map function should be list comprehension -- code cosmetics - - -___ - -
- - -
-Maya: SkeletalMesh family loadable as reference #4573 - -In Maya, fix the SkeletalMesh family not loadable as reference. - - -___ - -
- - -
-Unreal: fix loaders because of missing AssetContainer #4536 - -Fixing Unreal loaders, where changes in OpenPype Unreal integration plugin deleted AssetContainer. - -`AssetContainer` and `AssetContainerFactory` are still used to mark loaded instances. Because of optimizations in Integration plugin we've accidentally removed them but that broke loader. - - -___ - -
- - -
-3dsmax unable to delete loaded asset in the scene inventory #4507 - -Fix the bug of being unable to delete loaded asset in the Scene Inventory - -Fix the bug of being unable to delete loaded asset in the Scene Inventory - - -___ - -
- - -
-Hiero/Nuke: originalBasename editorial publishing and loading #4453 - -Publishing and loading `originalBasename` is working as expected - -Frame-ranges on version document is now correctly defined to fit original media frame range which is published. It means loading is now correctly identifying frame start and end on clip loader in Nuke. - - -___ - -
- - -
-Nuke: Fix workfile template placeholder creation #4512 - -Template placeholder creation was erroring out in Nuke due to the Workfile template builder not being able to find any of the plugins for the Nuke host. - -Move `get_workfile_build_placeholder_plugins` function to NukeHost class as workfile template builder expects. - - -___ - -
- - -
-Nuke: creator farm attributes from deadline submit plugin settings #4519 - -Defaults in farm attributes are sourced from settings. - -Settings for deadline nuke submitter are now used during nuke render and prerender creator plugins. - - -___ - -
- - -
-Nuke: fix clip sequence loading #4574 - -Nuke is loading correctly clip from image sequence created without "{originalBasename}" token in anatomy template. - - -___ - -
- - -
-Fusion: Fix files collection and small bug-fixes #4423 - -Fixed Fusion review-representation and small bug-fixes - -This fixes the problem with review-file generation that stopped the publishing on second publish before the fix.The problem was that Fusion simply looked at all the files in the render-folder instead of only gathering the needed frames for the review.Also includes a fix to get the handle start/end that before throw an error if the data didn't exist (like from a kitsu sync). - - -___ - -
- - -
-Fusion: Updated render_local.py to not only process the first instance #4522 - -Moved the `__hasRun` to `render_once()` so the check only happens with the rendering. Currently only the first render node gets the representations added.Critical PR - - -___ - -
- - -
-Fusion: Load sequence fix filepath resolving from representation #4580 - -Resolves issue mentioned on discord by @movalex:The loader was incorrectly trying to find the file in the publish folder which resulted in just picking 'any first file'. - -This gets the filepath from representation instead of taking the first file from listing files from publish folder. - - -___ - -
- - -
-Fusion: Fix review burnin start and end frame #4590 - -Fix the burnin start and end frame for reviews. Without this the asset document's start and end handle would've been added to the _burnin_ frame range even though that would've been incorrect since the handles are based on the comp saver's render range instead. - - -___ - -
- - -
-Harmony: missing set of frame range when opening scene #4485 - -Frame range gets set from DB everytime scene is opened. - -Added also check for not up-to-date loaded containers. - - -___ - -
- - -
-Photoshop: context is not changed in publisher #4570 - -When PS is already open and artists launch new task, it should keep only opened PS open, but change context. - -Problem were occurring in Workfile app where under new task files from old task were shown. This fixes this and adds opening of last workfile for new context if workfile exists. - - -___ - -
- - -
-hiero: fix effect item node class #4543 - -Collected effect name after renaming is saving correct class name. - - -___ - -
- - -
-Bugfix/OP-4616 vray multipart #4297 - -This fixes a bug where multipart vray renders would not make a review in Ftrack. - - -___ - -
- - -
-Maya: Fix changed location of reset_frame_range #4491 - -Location in commands caused cyclic import - - -___ - -
- - -
-global: source template fixed frame duplication #4503 - -Duplication is not happening. - -Template is using `originalBasename` which already assume all necessary elements are part of the file name so there was no need for additional optional name elements. - - -___ - -
- - -
-Deadline: Hint to use Python 3 #4518 - -Added shebank to give deadline hint which python should be used. - -Deadline has issues with Python 2 (especially with `os.scandir`). When a shebank is added to file header deadline will use python 3 mode instead of python 2 which fix the issue. - - -___ - -
- - -
-Publisher: Prevent access to create tab after publish start #4528 - -Prevent access to create tab after publish start. - -Disable create button in instance view on publish start and enable it again on reset. Even with that make sure that it is not possible to go to create tab if the tab is disabled. - - -___ - -
- - -
-Color Transcoding: store target_colorspace as new colorspace #4544 - -When transcoding into new colorspace, representation must carry this information instead original color space. - - -___ - -
- - -
-Deadline: fix submit_publish_job #4552 - -Fix submit_publish_job - -Resolves #4541 - - -___ - -
- - -
-Kitsu: Fix task itteration in update-op-with-zou #4577 - -From the last PR (https://github.com/ynput/OpenPype/pull/4425) a comment-commit last second messed up the code and resulted in two lines being the same, crashing the script. This PR fixes that. -___ - -
- - -
-AttrDefs: Fix type for PySide6 #4584 - -Use right type in signal emit for value change of attribute definitions. - -Changed `UUID` type to `str`. This is not an issue with PySide2 but it is with PySide6. - - -___ - -
- -### **๐Ÿ”€ Refactored code** - - -
-Scene Inventory: Avoid using ObjectId #4524 - -Avoid using conversion to ObjectId type in scene inventory tool. - -Preparation for AYON compatibility where ObjectId won't be used for ids. Representation ids from loaded containers are not converted to ObjectId but kept as strings which also required some changes when working with representation documents. - - -___ - -
- -### **Merged pull requests** - - -
-SiteSync: host dirmap is not working properly #4563 - -If artists uses SiteSync with real remote (gdrive, dropbox, sftp) drive, Local Settings were throwing error `string indices must be integers`. - -Logic was reworked to provide only `local_drive` values to be overrriden by Local Settings. If remote site is `gdrive` etc. mapping to `studio` is provided as it is expected that workfiles will have imported from `studio` location and not from `gdrive` folder.Also Nuke dirmap was reworked to be less verbose and much faster. - - -___ - -
- - -
-General: Input representation ids are not ObjectIds #4576 - -Don't use `ObjectId` as representation ids during publishing. - -Representation ids are kept as strings during publishing instead of converting them to `ObjectId`. This change is pre-requirement for AYON connection.Inputs are used for integration of links and for farm publishing (or at least it looks like). - - -___ - -
- - -
-Shotgrid: Fixes on Deadline submissions #4498 - -A few other bug fixes for getting Nuke submission to Deadline work smoothly using Shotgrid integration. - -Continuing on the work done on this other PR this fixes a few other bugs I came across with further tests. - - -___ - -
- - -
-Fusion: New Publisher #3892 - -This converts the old publishing system to the new one. It implements Fusion as a new host addon. - - -- Create button removed in OpenPype menu in favor of the new Publisher -- Draft refactor validations to raise `PublishValidationError` -- Implement Creator for New Publisher -- Implement Fusion as Host addon - - -___ - -
- - -
-Make Kitsu work with Tray Publisher, added kitsureview tag, fixed sync-problems. #4425 - -Make Kitsu work with Tray Publisher, added kitsureview tag, fixed sync-problems. - -This PR updates the way the module gather info for the current publish so it now works with Tray Publisher.It fixes the data that gets synced from Kitsu to OP so all needed data gets registered even if it doesn't exist on Kitsus side.It also adds the tag "Add review to Kitsu" and adds it to Burn In so previews gets generated by default to Kitsu. - - -___ - -
- - -
-Maya: V-Ray Set Image Format from settings #4566 - -Resolves #4565 - -Set V-Ray Image Format using settings. - - -___ - -
- - - - -## [3.15.1](https://github.com/ynput/OpenPype/tree/3.15.1) - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.0...3.15.1) - -### **๐Ÿ†• New features** - - - - -
-Maya: Xgen (3d / maya ) - #4256 - -___ - -#### Brief description - -Initial Xgen implementation. - - - -#### Description - -Client request of Xgen pipeline. - - - - -___ - -
- - - -
-Data exchange cameras for 3d Studio Max (3d / 3dsmax ) - #4376 - -___ - -#### Brief description - -Add Camera Family into the 3d Studio Max - - - -#### Description - -Adding Camera Extractors(extract abc camera and extract fbx camera) and validators(for camera contents) into 3dMaxAlso add the extractor for exporting 3d max raw scene (which is also related to 3dMax Scene Family) for camera family - - - - -___ - -
- - -### **๐Ÿš€ Enhancements** - - - - -
-Adding path validator for non-maya nodes (3d / maya ) - #4271 - -___ - -#### Brief description - -Adding a path validator for filepaths from non-maya nodes, which are created by plugins such as Renderman, Yeti and abcImport. - - - -#### Description - -As File Path Editor cannot catch the wrong filenpaths from non-maya nodes such as AlembicNodes, It is neccessary to have a new validator to ensure the existence of the filepaths from the nodes. - - - - -___ - -
- - - -
-Deadline: Allow disabling strict error check in Maya submissions (3d / maya / deadline ) - #4420 - -___ - -#### Brief description - -DL by default has Strict error checking, but some errors are not fatal. - - - -#### Description - -This allows to set profile based on Task and Subset values to temporarily disable Strict Error Checks.Subset and task names should support regular expressions. (not wildcard notation though). - - - - -___ - -
- - - -
-Houdini: New publisher code tweak (3d / houdini ) - #4374 - -___ - -#### Brief description - -This is cosmetics only - the previous code to me felt quite unreadable due to the lengthy strings being used. - - - -#### Description - -Code should do roughly the same, but just be reformatted. - - - - -___ - -
- - - -
-3dsmax: enhance alembic loader update function (3d / 3dsmax ) - #4387 - -___ - -## Enhancement - - - -This PR is adding update/switch ability to pointcache/alembic loader in 3dsmax and fixing wrong tool shown when clicking on "Manage" item on OpenPype menu, that is now correctly Scene Inventory (but was Subset Manager). - - - -Alembic update has still one caveat - it doesn't cope with changed number of object inside alembic, since loading alembic in max involves creating all those objects as first class nodes. So it will keep the objects in scene, just update path to alembic file on them. -___ - -
- - - -
-Global: supporting `OPENPYPE_TMPDIR` in staging dir maker (editorial / hiero ) - #4398 - -___ - -#### Brief description - -Productions can use OPENPYPE_TMPDIR for staging temp publishing directory - - - -#### Description - -Studios were demanding to be able to configure their own shared storages as temporary staging directories. Template formatting is also supported with optional keys formatting and following anatomy keys: - root[work | ] - project[name | code] - - - - -___ - -
- - - -
-General: Functions for current context (other ) - #4324 - -___ - -#### Brief description - -Defined more functions to receive current context information and added the methods to host integration so host can affect the result. - - - -#### Description - -This is one of steps to reduce usage of `legacy_io.Session`. This change define how to receive current context information -> call functions instead of accessing `legacy_io.Session` or `os.environ` directly. Plus, direct access on session or environments is unfortunatelly not enough for some DCCs where multiple workfiles can be opened at one time which can heavily affect the context but host integration sometimes can't affect that at all.`HostBase` already had implemented `get_current_context`, that was enhanced by adding more specific methods `get_current_project_name`, `get_current_asset_name` and `get_current_task_name`. The same functions were added to `~/openpype/pipeline/cotext_tools.py`. The functions in context tools are calling host integration methods (if are available) otherwise are using environent variables as default implementation does. Also was added `get_current_host_name` to receive host name from registered host if is available or from environment variable. - - - - -___ - -
- - - -
-Houdini: Do not visualize the hidden OpenPypeContext node (other / houdini ) - #4382 - -___ - -#### Brief description - -Using the new publisher UI would generate a visible 'null' locator at the origin. It's confusing to the user since it's supposed to be 'hidden'. - - - -#### Description - -Before this PR the user would see a locator/null at the origin which was the 'hidden' `/obj/OpenPypeContext` node. This null would suddenly appear if the user would've ever opened the Publisher UI once.After this PR it will not show:Nice and tidy. - - - - -___ - -
- - - -
-Maya + Blender: Pyblish plugins removed unused `version` and `category` attributes (other ) - #4402 - -___ - -#### Brief description - -Once upon a time in a land far far away there lived a few plug-ins who felt like they didn't belong in generic boxes and felt they needed to be versioned well above others. They tried, but with no success. - - - -#### Description - -Even though they now lived in a universe with elaborate `version` and `category` attributes embedded into their tiny little plug-in DNA this particular deviation has been greatly unused. There is nothing special about the version, nothing special about the category.It does nothing. - - - - -___ - -
- - - -
-General: Fix original basename frame issues (other ) - #4452 - -___ - -#### Brief description - -Treat `{originalBasename}` in different way then standard files processing. In case template should use `{originalBasename}` the transfers will use them as they are without any changes or handling of frames. - - - -#### Description - -Frames handling is problematic with original basename because their padding can't be defined to match padding in source filenames. Also it limits the usage of functionality to "must have frame at end of fiename". This is proposal how that could be solved by simply ignoring frame handling and using filenames as are on representation. First frame is still stored to representation context but is not used in formatting part. This way we don't have to care about padding of frames at all. - - - - -___ - -
- - - -
-Publisher: Report also crashed creators and convertors (other ) - #4473 - -___ - -#### Brief description - -Added crashes of creators and convertos discovery (lazy solution). - - - -#### Description - -Report in Publisher also contains information about crashed files caused during creator plugin discovery and convertor plugin discovery. They're not separated into categroies and there is no other information in the report about them, but this helps a lot during development. This change does not need to change format/schema of the report nor UI logic. - - - - -___ - -
- - -### **๐Ÿ› Bug fixes** - - - - -
-Maya: Fix Validate Attributes plugin (3d / maya ) - #4401 - -___ - -#### Brief description - -Code was broken. So either plug-in was unused or it had gone unnoticed. - - - -#### Description - -Looking at the commit history of the plug-in itself it seems this might have been broken somewhere between two to three years. I think it's broken since two years since this commit.Should this plug-in be removed completely?@tokejepsen Is there still a use case where we should have this plug-in? (You created the original one) - - - - -___ - -
- - - -
-Maya: Ignore workfile lock in Untitled scene (3d / maya ) - #4414 - -___ - -#### Brief description - -Skip workfile lock check if current scene is 'Untitled'. - - - - -___ - -
- - - -
-Maya: fps rounding - OP-2549 (3d / maya ) - #4424 - -___ - -#### Brief description - -When FPS is registered in for example Ftrack and round either down or up (floor/ceil), comparing to Maya FPS can fail. Example:23.97 (Ftrack/Mongo) != 23.976023976023978 (Maya) - - - -#### Description - -Since Maya only has a select number of supported framerates, I've taken the approach of converting any fps to supported framerates in Maya. We validate the input fps to make sure they are supported in Maya in two ways:Whole Numbers - are validated straight against the supported framerates in Maya.Demical Numbers - we find the closest supported framerate in Maya. If the difference to the closest supported framerate, is more than 0.5 we'll throw an error.If Maya ever supports arbitrary framerates, then we might have a problem but I'm not holding my breath... - - - - -___ - -
- - - -
-Strict Error Checking Default (3d / maya ) - #4457 - -___ - -#### Brief description - -Provide default of strict error checking for instances created prior to PR. - - - - -___ - -
- - - -
-Create: Enhance instance & context changes (3d / houdini,after effects,3dsmax ) - #4375 - -___ - -#### Brief description - -Changes of instances and context have complex, hard to get structure. The structure did not change but instead of complex dictionaries are used objected data. - - - -#### Description - -This is poposal of changes data improvement for creators. Implemented `TrackChangesItem` which handles the changes for us. The item is creating changes based on old and new value and can provide information about changed keys or access to full old or new value. Can give the values on any "sub-dictionary".Used this new approach to fix change in houdini and 3ds max and also modified one aftereffects plugin using changes. - - - - -___ - -
- - - -
-Houdini: hotfix condition (3d / houdini ) - #4391 - -___ - -## Hotfix - - - -This is fixing bug introduced int #4374 -___ - -
- - - -
-Houdini: Houdini shelf tools fixes (3d / houdini ) - #4428 - -___ - -#### Brief description - -Fix Houdini shelf tools. - - - -#### Description - -Use `label` as mandatory key instead of `name`. Changed how shelves are created. If the script is empty it is gracefully skipping it instead of crashing. - - - - -___ - -
- - - -
-3dsmax: startup fixes (3d / 3dsmax ) - #4412 - -___ - -#### Brief description - -This is fixing various issues that can occur on some of the 3dsmax versions. - - - -#### Description - -On displays with +4K resolution UI was broken, some 3dsmax versions couldn't process `PYTHONPATH` correctly. This PR is forcing `sys.path` and disabling `QT_AUTO_SCREEN_SCALE_FACTOR` - - - - -___ - -
- - - -
-Fix features for gizmo menu (2d / nuke ) - #4280 - -___ - -#### Brief description - -Fix features for the Gizmo Menu project settings (shortcut for python type of usage and file type of usage functionality) - - - - -___ - -
- - - -
-Photoshop: fix missing legacy io for legacy instances (2d / photoshop,after effects ) - #4467 - -___ - -#### Brief description - -`legacy_io` import was removed, but usage stayed. - - - -#### Description - -Usage of `legacy_io` should be eradicated, in creators it should be replaced by `self.create_context.get_current_project_name/asset_name/task_name`. - - - - -___ - -
- - - -
-Fix - addSite loader handles hero version (other / sitesync ) - #4359 - -___ - -#### Brief description - -If adding site to representation presence of hero version is checked, if found hero version is marked to be donwloaded too.Replacing https://github.com/ynput/OpenPype/pull/4191 - - - - -___ - -
- - - -
-Remove OIIO build for macos (other ) - #4381 - -___ - -## Fix - - - -Since we are not able to provide OpenImageIO tools binaries for macos, we should remove the item from th `pyproject.toml`. This PR is taking care of it. - - - -It is also changing the way `fetch_thirdparty_libs` script works in that it doesn't crash when lib cannot be processed, it only issue warning. - - - - - -Resolves #3858 -___ - -
- - - -
-General: Attribute definitions fixes (other ) - #4392 - -___ - -#### Brief description - -Fix possible issues with attribute definitions in publisher if there is unknown attribute on an instance. - - - -#### Description - -Source of the issue is that attribute definitions from creator plugin could be "expanded" during `CreatedInstance` initialization. Which would affect all other instances using the same list of attributes -> literally object of list. If the same list object is used in "BaseClass" for other creators it would affect all instances (because of 1 instance). There had to be implemented other changes to fix the issue and keep behavior the same.Object of `CreatedInstance` can be created without reference to creator object. `CreatedInstance` is responsible to give UI attribute definitions (technically is prepared for cases when each instance may have different attribute definitions -> not yet).Attribute definition has added more conditions for `__eq__` method and have implemented `__ne__` method (which is required for Py 2 compatibility). Renamed `AbtractAttrDef` to `AbstractAttrDef` (fix typo). - - - - -___ - -
- - - -
-Ftrack: Don't force ftrackapp endpoint (other / ftrack ) - #4411 - -___ - -#### Brief description - -Auto-fill of ftrack url don't break custom urls. Custom urls couldn't be used as `ftrackapp.com` is added if is not in the url. - - - -#### Description - -The code was changed in a way that auto-fill is still supported but before `ftrackapp` is added it will try to use url as is. If the connection works as is it is used. - - - - -___ - -
- - - -
-Fix: DL on MacOS (other ) - #4418 - -___ - -#### Brief description - -This works if DL Openpype plugin Installation Directories is set to level of app bundle (eg. '/Applications/OpenPype 3.15.0.app') - - - - -___ - -
- - - -
-Photoshop: make usage of layer name in subset name more controllable (other ) - #4432 - -___ - -#### Brief description - -Layer name was previously used in subset name only if multiple instances were being created in single step. This adds explicit toggle. - - - -#### Description - -Toggling this button allows to use layer name in created subset name even if single instance is being created.This follows more closely implementation if AE. - - - - -___ - -
- - - -
-SiteSync: fix dirmap (other ) - #4436 - -___ - -#### Brief description - -Fixed issue in dirmap in Maya and Nuke - - - -#### Description - -Loads of error were thrown in Nuke console about dictionary value.`AttributeError: 'dict' object has no attribute 'lower'` - - - - -___ - -
- - - -
-General: Ignore decode error of stdout/stderr in run_subprocess (other ) - #4446 - -___ - -#### Brief description - -Ignore decode errors and replace invalid character (byte) with escaped byte character. - - - -#### Description - -Calling of `run_subprocess` may cause crashes if output contains some unicode character which (for example Polish name of encoder handler). - - - - -___ - -
- - - -
-Publisher: Fix reopen bug (other ) - #4463 - -___ - -#### Brief description - -Use right name of constant 'ActiveWindow' -> 'WindowActive'. - - - - -___ - -
- - - -
-Publisher: Fix compatibility of QAction in Publisher (other ) - #4474 - -___ - -#### Brief description - -Fix `QAction` for older version of Qt bindings where QAction requires a parent on initialization. - - - -#### Description - -This bug was discovered in Nuke 11. Fixed by creating QAction when QMenu is already available and can be used as parent. - - - - -___ - -
- - -### **๐Ÿ”€ Refactored code** - - - - -
-General: Remove 'openpype.api' (other ) - #4413 - -___ - -#### Brief description - -PR is removing `openpype/api.py` file which is causing a lot of troubles and cross-imports. - - - -#### Description - -I wanted to remove the file slowly function by function but it always reappear somewhere in codebase even if most of the functionality imported from there is triggering deprecation warnings. This is small change which may have huge impact.There shouldn't be anything in openpype codebase which is using `openpype.api` anymore so only possible issues are in customized repositories or custom addons. - - - - -___ - -
- - -### **๐Ÿ“ƒ Documentation** - - - - -
-docs-user-Getting Started adjustments (other ) - #4365 - -___ - -#### Brief description - -Small typo fixes here and there, additional info on install/ running OP. - - - - -___ - -
- - -### **Merged pull requests** - - - - -
-Renderman support for sample and display filters (3d / maya ) - #4003 - -___ - -#### Brief description - -User can set up both sample and display filters in Openpype settings if they are using Renderman as renderer. - - - -#### Description - -You can preset which sample and display filters for renderman , including the cryptomatte renderpass, in Openpype settings. Once you select which filters to be included in openpype settings and then create render instance for your camera in maya, it would automatically tell the system to generate your selected filters in render settings.The place you can find for setting up the filters: _Maya > Render Settings > Renderman Renderer > Display Filters/ Sample Filters_ - - - - -___ - -
- - - -
-Maya: Create Arnold options on repair. (3d / maya ) - #4448 - -___ - -#### Brief description - -When validating/repairing we previously required users to open render settings to create the Arnold options. This is done through code now. - - - - -___ - -
- - - -
-Update Asset field of creator Instances in Maya Template Builder (3d / maya ) - #4470 - -___ - -#### Brief description - -When we build a template with Maya Template Builder, it will update the asset field of the sets (creator instances) that are imported from the template. - - - -#### Description - -When building a template, we also want to define the publishable content in advance: create an instance of a model, or look, etc., to speed up the workflow and reduce the number of questions we are asked. After building a work file from a saved template that contains pre-created instances, the template builder should update the asset field to the current asset. - - - - -___ - -
- - - -
-Blender: fix import workfile all families (3d / blender ) - #4405 - -___ - -#### Brief description - -Having this feature related to workfile available for any family is absurd. - - - - -___ - -
- - - -
-Nuke: update rendered frames in latest version (2d / nuke ) - #4362 - -___ - -#### Brief description - -Introduced new field to insert frame(s) to rerender only. - - - -#### Description - -Rendering is expensive, sometimes it is helpful only to re-render changed frames and reuse existing.Artists can in Publisher fill which frame(s) should be re-rendered.If there is already published version of currently publishing subset, all representation files are collected (currently for `render` family only) and then when Nuke is rendering (locally only for now), old published files are copied into into temporary render folder where will be rewritten only by frames explicitly set in new field.That way review/burnin process could also reuse old files and recreate reviews/burnins.New version is produced during this process! - - - - -___ - -
- - - -
-Feature: Keep synced hero representations up-to-date. (other ) - #4343 - -___ - -#### Brief description - -Keep previously synchronized sites up-to-date by comparing old and new sites and adding old sites if missing in new ones.Fix #4331 - - - - -___ - -
- - - -
-Maya: Fix template builder bug where assets are not put in the right hierarchy (other ) - #4367 - -___ - -#### Brief description - -When buiding scene from template, the assets loaded from the placeholders are not put in the hierarchy. Plus, the assets are loaded in double. - - - - -___ - -
- - - -
-Bump ua-parser-js from 0.7.31 to 0.7.33 in /website (other ) - #4371 - -___ - -Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.31 to 0.7.33. -
-Changelog -

Sourced from ua-parser-js's changelog.

-
-

Version 0.7.31 / 1.0.2

-
    -
  • Fix OPPO Reno A5 incorrect detection
  • -
  • Fix TypeError Bug
  • -
  • Use AST to extract regexes and verify them with safe-regex
  • -
-

Version 0.7.32 / 1.0.32

-
    -
  • Add new browser : DuckDuckGo, Huawei Browser, LinkedIn
  • -
  • Add new OS : HarmonyOS
  • -
  • Add some Huawei models
  • -
  • Add Sharp Aquos TV
  • -
  • Improve detection Xiaomi Mi CC9
  • -
  • Fix Sony Xperia 1 III misidentified as Acer tablet
  • -
  • Fix Detect Sony BRAVIA as SmartTV
  • -
  • Fix Detect Xiaomi Mi TV as SmartTV
  • -
  • Fix Detect Galaxy Tab S8 as tablet
  • -
  • Fix WeGame mistakenly identified as WeChat
  • -
  • Fix included commas in Safari / Mobile Safari version
  • -
  • Increase UA_MAX_LENGTH to 350
  • -
-

Version 0.7.33 / 1.0.33

-
    -
  • Add new browser : Cobalt
  • -
  • Identify Macintosh as an Apple device
  • -
  • Fix ReDoS vulnerability
  • -
-

Version 0.8

-

Version 0.8 was created by accident. This version is now deprecated and no longer maintained, please update to version 0.7 / 1.0.

-
-
-
-Commits - -
-
- - -[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ua-parser-js&package-manager=npm_and_yarn&previous-version=0.7.31&new-version=0.7.33)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) - -Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. - -[//]: # (dependabot-automerge-start) -[//]: # (dependabot-automerge-end) - ---- - -
-Dependabot commands and options -
- -You can trigger Dependabot actions by commenting on this PR: -- `@dependabot rebase` will rebase this PR -- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it -- `@dependabot merge` will merge this PR after your CI passes on it -- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it -- `@dependabot cancel merge` will cancel a previously requested merge and block automerging -- `@dependabot reopen` will reopen this PR if it is closed -- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually -- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) -- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) -- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language -- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language -- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language -- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language - -You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/ynput/OpenPype/network/alerts). - -
-___ - -
- - - -
-Docs: Question about renaming in Kitsu (other ) - #4384 - -___ - -#### Brief description - -To keep memory of this discussion: https://discord.com/channels/517362899170230292/563751989075378201/1068112668491255818 - - - - -___ - -
- - - -
-New Publisher: Fix Creator error typo (other ) - #4396 - -___ - -#### Brief description - -Fixes typo in error message. - - - - -___ - -
- - - -
-Chore: pyproject.toml version because of Poetry (other ) - #4408 - -___ - -#### Brief description - -Automatization injects wrong format - - - - -___ - -
- - - -
-Fix - remove minor part in toml (other ) - #4437 - -___ - -#### Brief description - -Causes issue in create_env and new Poetry - - - - -___ - -
- - - -
-General: Add project code to anatomy (other ) - #4445 - -___ - -#### Brief description - -Added attribute `project_code` to `Anatomy` object. - - - -#### Description - -Anatomy already have access to almost all attributes from project anatomy except project code. This PR changing it. Technically `Anatomy` is everything what would be needed to get fill data of project. - -``` - -{ - - "project": { - - "name": anatomy.project_name, - - "code": anatomy.project_code - - } - -} - -``` - - -___ - -
- - - -
-Maya: Arnold Scene Source overhaul - OP-4865 (other / maya ) - #4449 - -___ - -#### Brief description - -General overhaul of the Arnold Scene Source (ASS) workflow. - - - -#### Description - -This originally was to support static files (non-sequencial) ASS publishing, but digging deeper whole workflow needed an update to get ready for further issues. During this overhaul the following changes were made: - -- Generalized Arnold Standin workflow to a single loader. - -- Support multiple nodes as proxies. - -- Support proxies for `pointcache` family. - -- Generalized approach to proxies as resources, so they can be the same file format as the original.This workflow should allow further expansion to utilize operators and eventually USD. - - - - -___ - -
- - - - -## [3.15.0](https://github.com/ynput/OpenPype/tree/3.15.0) - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.14.10...3.15.0) - -**Deprecated:** - -- General: Fill default values of new publish template profiles [\#4245](https://github.com/ynput/OpenPype/pull/4245) - -### ๐Ÿ“– Documentation - -- documentation: Split tools into separate entries [\#4342](https://github.com/ynput/OpenPype/pull/4342) -- Documentation: Fix harmony docs [\#4301](https://github.com/ynput/OpenPype/pull/4301) -- Remove staging logic set by OpenPype version [\#3979](https://github.com/ynput/OpenPype/pull/3979) - -**๐Ÿ†• New features** - -- General: Push to studio library [\#4284](https://github.com/ynput/OpenPype/pull/4284) -- Colorspace Management and Distribution [\#4195](https://github.com/ynput/OpenPype/pull/4195) -- Nuke: refactor to latest publisher workfow [\#4006](https://github.com/ynput/OpenPype/pull/4006) -- Update to Python 3.9 [\#3546](https://github.com/ynput/OpenPype/pull/3546) - -**๐Ÿš€ Enhancements** - -- Unreal: Don't use mongo queries in 'ExistingLayoutLoader' [\#4356](https://github.com/ynput/OpenPype/pull/4356) -- General: Loader and Creator plugins can be disabled [\#4310](https://github.com/ynput/OpenPype/pull/4310) -- General: Unbind poetry version [\#4306](https://github.com/ynput/OpenPype/pull/4306) -- General: Enhanced enum def items [\#4295](https://github.com/ynput/OpenPype/pull/4295) -- Git: add pre-commit hooks [\#4289](https://github.com/ynput/OpenPype/pull/4289) -- Tray Publisher: Improve Online family functionality [\#4263](https://github.com/ynput/OpenPype/pull/4263) -- General: Update MacOs to PySide6 [\#4255](https://github.com/ynput/OpenPype/pull/4255) -- Build: update to Gazu in toml [\#4208](https://github.com/ynput/OpenPype/pull/4208) -- Global: adding imageio to settings [\#4158](https://github.com/ynput/OpenPype/pull/4158) -- Blender: added project settings for validator no colons in name [\#4149](https://github.com/ynput/OpenPype/pull/4149) -- Dockerfile for Debian Bullseye [\#4108](https://github.com/ynput/OpenPype/pull/4108) -- AfterEffects: publish multiple compositions [\#4092](https://github.com/ynput/OpenPype/pull/4092) -- AfterEffects: make new publisher default [\#4056](https://github.com/ynput/OpenPype/pull/4056) -- Photoshop: make new publisher default [\#4051](https://github.com/ynput/OpenPype/pull/4051) -- Feature/multiverse [\#4046](https://github.com/ynput/OpenPype/pull/4046) -- Tests: add support for deadline for automatic tests [\#3989](https://github.com/ynput/OpenPype/pull/3989) -- Add version to shortcut name [\#3906](https://github.com/ynput/OpenPype/pull/3906) -- TrayPublisher: Removed from experimental tools [\#3667](https://github.com/ynput/OpenPype/pull/3667) - -**๐Ÿ› Bug fixes** - -- change 3.7 to 3.9 in folder name [\#4354](https://github.com/ynput/OpenPype/pull/4354) -- PushToProject: Fix hierarchy of project change [\#4350](https://github.com/ynput/OpenPype/pull/4350) -- Fix photoshop workfile save-as [\#4347](https://github.com/ynput/OpenPype/pull/4347) -- Nuke Input process node sourcing improvements [\#4341](https://github.com/ynput/OpenPype/pull/4341) -- New publisher: Some validation plugin tweaks [\#4339](https://github.com/ynput/OpenPype/pull/4339) -- Harmony: fix unable to change workfile on Mac [\#4334](https://github.com/ynput/OpenPype/pull/4334) -- Global: fixing in-place source publishing for editorial [\#4333](https://github.com/ynput/OpenPype/pull/4333) -- General: Use class constants of QMessageBox [\#4332](https://github.com/ynput/OpenPype/pull/4332) -- TVPaint: Fix plugin for TVPaint 11.7 [\#4328](https://github.com/ynput/OpenPype/pull/4328) -- Exctract OTIO review has improved quality [\#4325](https://github.com/ynput/OpenPype/pull/4325) -- Ftrack: fix typos causing bugs in sync [\#4322](https://github.com/ynput/OpenPype/pull/4322) -- General: Python 2 compatibility of instance collector [\#4320](https://github.com/ynput/OpenPype/pull/4320) -- Slack: user groups speedup [\#4318](https://github.com/ynput/OpenPype/pull/4318) -- Maya: Bug - Multiverse extractor executed on plain animation family [\#4315](https://github.com/ynput/OpenPype/pull/4315) -- Fix run\_documentation.ps1 [\#4312](https://github.com/ynput/OpenPype/pull/4312) -- Nuke: new creators fixes [\#4308](https://github.com/ynput/OpenPype/pull/4308) -- General: missing comment on standalone and tray publisher [\#4303](https://github.com/ynput/OpenPype/pull/4303) -- AfterEffects: Fix for audio from mp4 layer [\#4296](https://github.com/ynput/OpenPype/pull/4296) -- General: Update gazu in poetry lock [\#4247](https://github.com/ynput/OpenPype/pull/4247) -- Bug: Fixing version detection and filtering in Igniter [\#3914](https://github.com/ynput/OpenPype/pull/3914) -- Bug: Create missing version dir [\#3903](https://github.com/ynput/OpenPype/pull/3903) - -**๐Ÿ”€ Refactored code** - -- Remove redundant export\_alembic method. [\#4293](https://github.com/ynput/OpenPype/pull/4293) -- Igniter: Use qtpy modules instead of Qt [\#4237](https://github.com/ynput/OpenPype/pull/4237) - -**Merged pull requests:** - -- Sort families by alphabetical order in the Create plugin [\#4346](https://github.com/ynput/OpenPype/pull/4346) -- Global: Validate unique subsets [\#4336](https://github.com/ynput/OpenPype/pull/4336) -- Maya: Collect instances preserve handles even if frameStart + frameEnd matches context [\#3437](https://github.com/ynput/OpenPype/pull/3437) - -## [3.14.10](https://github.com/ynput/OpenPype/tree/HEAD) - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.14.9...3.14.10) - -**๐Ÿ†• New features** - -- Global | Nuke: Creator placeholders in workfile template builder [\#4266](https://github.com/ynput/OpenPype/pull/4266) -- Slack: Added dynamic message [\#4265](https://github.com/ynput/OpenPype/pull/4265) -- Blender: Workfile Loader [\#4234](https://github.com/ynput/OpenPype/pull/4234) -- Unreal: Publishing and Loading for UAssets [\#4198](https://github.com/ynput/OpenPype/pull/4198) -- Publish: register publishes without copying them [\#4157](https://github.com/ynput/OpenPype/pull/4157) - -**๐Ÿš€ Enhancements** - -- General: Added install method with docstring to HostBase [\#4298](https://github.com/ynput/OpenPype/pull/4298) -- Traypublisher: simple editorial multiple edl [\#4248](https://github.com/ynput/OpenPype/pull/4248) -- General: Extend 'IPluginPaths' to have more available methods [\#4214](https://github.com/ynput/OpenPype/pull/4214) -- Refactorization of folder coloring [\#4211](https://github.com/ynput/OpenPype/pull/4211) -- Flame - loading multilayer with controlled layer names [\#4204](https://github.com/ynput/OpenPype/pull/4204) - -**๐Ÿ› Bug fixes** - -- Unreal: fix missing `maintained_selection` call [\#4300](https://github.com/ynput/OpenPype/pull/4300) -- Ftrack: Fix receive of host ip on MacOs [\#4288](https://github.com/ynput/OpenPype/pull/4288) -- SiteSync: sftp connection failing when shouldnt be tested [\#4278](https://github.com/ynput/OpenPype/pull/4278) -- Deadline: fix default value for passing mongo url [\#4275](https://github.com/ynput/OpenPype/pull/4275) -- Scene Manager: Fix variable name [\#4268](https://github.com/ynput/OpenPype/pull/4268) -- Slack: notification fails because of missing published path [\#4264](https://github.com/ynput/OpenPype/pull/4264) -- hiero: creator gui with min max [\#4257](https://github.com/ynput/OpenPype/pull/4257) -- NiceCheckbox: Fix checker positioning in Python 2 [\#4253](https://github.com/ynput/OpenPype/pull/4253) -- Publisher: Fix 'CreatorType' not equal for Python 2 DCCs [\#4249](https://github.com/ynput/OpenPype/pull/4249) -- Deadline: fix dependencies [\#4242](https://github.com/ynput/OpenPype/pull/4242) -- Houdini: hotfix instance data access [\#4236](https://github.com/ynput/OpenPype/pull/4236) -- bugfix/image plane load error [\#4222](https://github.com/ynput/OpenPype/pull/4222) -- Hiero: thumbnail from multilayer exr [\#4209](https://github.com/ynput/OpenPype/pull/4209) - -**๐Ÿ”€ Refactored code** - -- Resolve: Use qtpy in Resolve [\#4254](https://github.com/ynput/OpenPype/pull/4254) -- Houdini: Use qtpy in Houdini [\#4252](https://github.com/ynput/OpenPype/pull/4252) -- Max: Use qtpy in Max [\#4251](https://github.com/ynput/OpenPype/pull/4251) -- Maya: Use qtpy in Maya [\#4250](https://github.com/ynput/OpenPype/pull/4250) -- Hiero: Use qtpy in Hiero [\#4240](https://github.com/ynput/OpenPype/pull/4240) -- Nuke: Use qtpy in Nuke [\#4239](https://github.com/ynput/OpenPype/pull/4239) -- Flame: Use qtpy in flame [\#4238](https://github.com/ynput/OpenPype/pull/4238) -- General: Legacy io not used in global plugins [\#4134](https://github.com/ynput/OpenPype/pull/4134) - -**Merged pull requests:** - -- Bump json5 from 1.0.1 to 1.0.2 in /website [\#4292](https://github.com/ynput/OpenPype/pull/4292) -- Maya: Fix validate frame range repair + fix create render with deadline disabled [\#4279](https://github.com/ynput/OpenPype/pull/4279) - - -## [3.14.9](https://github.com/pypeclub/OpenPype/tree/3.14.9) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.8...3.14.9) - -### ๐Ÿ“– Documentation - -- Documentation: Testing on Deadline [\#4185](https://github.com/pypeclub/OpenPype/pull/4185) -- Consistent Python version [\#4160](https://github.com/pypeclub/OpenPype/pull/4160) - -**๐Ÿ†• New features** - -- Feature/op 4397 gl tf extractor for maya [\#4192](https://github.com/pypeclub/OpenPype/pull/4192) -- Maya: Extractor for Unreal SkeletalMesh [\#4174](https://github.com/pypeclub/OpenPype/pull/4174) -- 3dsmax: integration [\#4168](https://github.com/pypeclub/OpenPype/pull/4168) -- Blender: Extract Alembic Animations [\#4128](https://github.com/pypeclub/OpenPype/pull/4128) -- Unreal: Load Alembic Animations [\#4127](https://github.com/pypeclub/OpenPype/pull/4127) - -**๐Ÿš€ Enhancements** - -- Houdini: Use new interface class name for publish host [\#4220](https://github.com/pypeclub/OpenPype/pull/4220) -- General: Default command for headless mode is interactive [\#4203](https://github.com/pypeclub/OpenPype/pull/4203) -- Maya: Enhanced ASS publishing [\#4196](https://github.com/pypeclub/OpenPype/pull/4196) -- Feature/op 3924 implement ass extractor [\#4188](https://github.com/pypeclub/OpenPype/pull/4188) -- File transactions: Source path is destination path [\#4184](https://github.com/pypeclub/OpenPype/pull/4184) -- Deadline: improve environment processing [\#4182](https://github.com/pypeclub/OpenPype/pull/4182) -- General: Comment per instance in Publisher [\#4178](https://github.com/pypeclub/OpenPype/pull/4178) -- Ensure Mongo database directory exists in Windows. [\#4166](https://github.com/pypeclub/OpenPype/pull/4166) -- Note about unrestricted execution on Windows. [\#4161](https://github.com/pypeclub/OpenPype/pull/4161) -- Maya: Enable thumbnail transparency on extraction. [\#4147](https://github.com/pypeclub/OpenPype/pull/4147) -- Maya: Disable viewport Pan/Zoom on playblast extraction. [\#4146](https://github.com/pypeclub/OpenPype/pull/4146) -- Maya: Optional viewport refresh on pointcache extraction [\#4144](https://github.com/pypeclub/OpenPype/pull/4144) -- CelAction: refactory integration to current openpype [\#4140](https://github.com/pypeclub/OpenPype/pull/4140) -- Maya: create and publish bounding box geometry [\#4131](https://github.com/pypeclub/OpenPype/pull/4131) -- Changed the UOpenPypePublishInstance to use the UDataAsset class [\#4124](https://github.com/pypeclub/OpenPype/pull/4124) -- General: Collection Audio speed up [\#4110](https://github.com/pypeclub/OpenPype/pull/4110) -- Maya: keep existing AOVs when creating render instance [\#4087](https://github.com/pypeclub/OpenPype/pull/4087) -- General: Oiio conversion multipart fix [\#4060](https://github.com/pypeclub/OpenPype/pull/4060) - -**๐Ÿ› Bug fixes** - -- Publisher: Signal type issues in Python 2 DCCs [\#4230](https://github.com/pypeclub/OpenPype/pull/4230) -- Blender: Fix Layout Family Versioning [\#4228](https://github.com/pypeclub/OpenPype/pull/4228) -- Blender: Fix Create Camera "Use selection" [\#4226](https://github.com/pypeclub/OpenPype/pull/4226) -- TrayPublisher - join needs list [\#4224](https://github.com/pypeclub/OpenPype/pull/4224) -- General: Event callbacks pass event to callbacks as expected [\#4210](https://github.com/pypeclub/OpenPype/pull/4210) -- Build:Revert .toml update of Gazu [\#4207](https://github.com/pypeclub/OpenPype/pull/4207) -- Nuke: fixed imageio node overrides subset filter [\#4202](https://github.com/pypeclub/OpenPype/pull/4202) -- Maya: pointcache [\#4201](https://github.com/pypeclub/OpenPype/pull/4201) -- Unreal: Support for Unreal Engine 5.1 [\#4199](https://github.com/pypeclub/OpenPype/pull/4199) -- General: Integrate thumbnail looks for thumbnail to multiple places [\#4181](https://github.com/pypeclub/OpenPype/pull/4181) -- Various minor bugfixes [\#4172](https://github.com/pypeclub/OpenPype/pull/4172) -- Nuke/Hiero: Remove tkinter library paths before launch [\#4171](https://github.com/pypeclub/OpenPype/pull/4171) -- Flame: vertical alignment of layers [\#4169](https://github.com/pypeclub/OpenPype/pull/4169) -- Nuke: correct detection of viewer and display [\#4165](https://github.com/pypeclub/OpenPype/pull/4165) -- Settings UI: Don't create QApplication if already exists [\#4156](https://github.com/pypeclub/OpenPype/pull/4156) -- General: Extract review handle start offset of sequences [\#4152](https://github.com/pypeclub/OpenPype/pull/4152) -- Maya: Maintain time connections on Alembic update. [\#4143](https://github.com/pypeclub/OpenPype/pull/4143) - -**๐Ÿ”€ Refactored code** - -- General: Use qtpy in modules and hosts UIs which are running in OpenPype process [\#4225](https://github.com/pypeclub/OpenPype/pull/4225) -- Tools: Use qtpy instead of Qt in standalone tools [\#4223](https://github.com/pypeclub/OpenPype/pull/4223) -- General: Use qtpy in settings UI [\#4215](https://github.com/pypeclub/OpenPype/pull/4215) - -**Merged pull requests:** - -- layout publish more than one container issue [\#4098](https://github.com/pypeclub/OpenPype/pull/4098) - -## [3.14.8](https://github.com/pypeclub/OpenPype/tree/3.14.8) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.7...3.14.8) - -**๐Ÿš€ Enhancements** - -- General: Refactored extract hierarchy plugin [\#4139](https://github.com/pypeclub/OpenPype/pull/4139) -- General: Find executable enhancement [\#4137](https://github.com/pypeclub/OpenPype/pull/4137) -- Ftrack: Reset session before instance processing [\#4129](https://github.com/pypeclub/OpenPype/pull/4129) -- Ftrack: Editorial asset sync issue [\#4126](https://github.com/pypeclub/OpenPype/pull/4126) -- Deadline: Build version resolving [\#4115](https://github.com/pypeclub/OpenPype/pull/4115) -- Houdini: New Publisher [\#3046](https://github.com/pypeclub/OpenPype/pull/3046) -- Fix: Standalone Publish Directories [\#4148](https://github.com/pypeclub/OpenPype/pull/4148) - -**๐Ÿ› Bug fixes** - -- Ftrack: Fix occational double parents issue [\#4153](https://github.com/pypeclub/OpenPype/pull/4153) -- General: Maketx executable issue [\#4136](https://github.com/pypeclub/OpenPype/pull/4136) -- Maya: Looks - add all connections [\#4135](https://github.com/pypeclub/OpenPype/pull/4135) -- General: Fix variable check in collect anatomy instance data [\#4117](https://github.com/pypeclub/OpenPype/pull/4117) - -## [3.14.7](https://github.com/pypeclub/OpenPype/tree/3.14.7) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.6...3.14.7) - -**๐Ÿ†• New features** - -- Hiero: loading effect family to timeline [\#4055](https://github.com/pypeclub/OpenPype/pull/4055) - -**๐Ÿš€ Enhancements** - -- Photoshop: bug with pop-up window on Instance Creator [\#4121](https://github.com/pypeclub/OpenPype/pull/4121) -- Publisher: Open on specific tab [\#4120](https://github.com/pypeclub/OpenPype/pull/4120) -- Publisher: Hide unknown publish values [\#4116](https://github.com/pypeclub/OpenPype/pull/4116) -- Ftrack: Event server status give more information about version locations [\#4112](https://github.com/pypeclub/OpenPype/pull/4112) -- General: Allow higher numbers in frames and clips [\#4101](https://github.com/pypeclub/OpenPype/pull/4101) -- Publisher: Settings for validate frame range [\#4097](https://github.com/pypeclub/OpenPype/pull/4097) -- Publisher: Ignore escape button [\#4090](https://github.com/pypeclub/OpenPype/pull/4090) -- Flame: Loading clip with native colorspace resolved from mapping [\#4079](https://github.com/pypeclub/OpenPype/pull/4079) -- General: Extract review single frame output [\#4064](https://github.com/pypeclub/OpenPype/pull/4064) -- Publisher: Prepared common function for instance data cache [\#4063](https://github.com/pypeclub/OpenPype/pull/4063) -- Publisher: Easy access to publish page from create page [\#4058](https://github.com/pypeclub/OpenPype/pull/4058) -- General/TVPaint: Attribute defs dialog [\#4052](https://github.com/pypeclub/OpenPype/pull/4052) -- Publisher: Better reset defer [\#4048](https://github.com/pypeclub/OpenPype/pull/4048) -- Publisher: Add thumbnail sources [\#4042](https://github.com/pypeclub/OpenPype/pull/4042) - -**๐Ÿ› Bug fixes** - -- General: Move default settings for template name [\#4119](https://github.com/pypeclub/OpenPype/pull/4119) -- Slack: notification fail in new tray publisher [\#4118](https://github.com/pypeclub/OpenPype/pull/4118) -- Nuke: loaded nodes set to first tab [\#4114](https://github.com/pypeclub/OpenPype/pull/4114) -- Nuke: load image first frame [\#4113](https://github.com/pypeclub/OpenPype/pull/4113) -- Files Widget: Ignore case sensitivity of extensions [\#4096](https://github.com/pypeclub/OpenPype/pull/4096) -- Webpublisher: extension is lowercased in Setting and in uploaded files [\#4095](https://github.com/pypeclub/OpenPype/pull/4095) -- Publish Report Viewer: Fix small bugs [\#4086](https://github.com/pypeclub/OpenPype/pull/4086) -- Igniter: fix regex to match semver better [\#4085](https://github.com/pypeclub/OpenPype/pull/4085) -- Maya: aov filtering [\#4083](https://github.com/pypeclub/OpenPype/pull/4083) -- Flame/Flare: Loading to multiple batches [\#4080](https://github.com/pypeclub/OpenPype/pull/4080) -- hiero: creator from settings with set maximum [\#4077](https://github.com/pypeclub/OpenPype/pull/4077) -- Nuke: resolve hashes in file name only for frame token [\#4074](https://github.com/pypeclub/OpenPype/pull/4074) -- Publisher: Fix cache of asset docs [\#4070](https://github.com/pypeclub/OpenPype/pull/4070) -- Webpublisher: cleanup wp extract thumbnail [\#4067](https://github.com/pypeclub/OpenPype/pull/4067) -- Settings UI: Locked setting can't bypass lock [\#4066](https://github.com/pypeclub/OpenPype/pull/4066) -- Loader: Fix comparison of repre name [\#4053](https://github.com/pypeclub/OpenPype/pull/4053) -- Deadline: Extract environment subprocess failure [\#4050](https://github.com/pypeclub/OpenPype/pull/4050) - -**๐Ÿ”€ Refactored code** - -- General: Collect entities plugin minor changes [\#4089](https://github.com/pypeclub/OpenPype/pull/4089) -- General: Direct interfaces import [\#4065](https://github.com/pypeclub/OpenPype/pull/4065) - -**Merged pull requests:** - -- Bump loader-utils from 1.4.1 to 1.4.2 in /website [\#4100](https://github.com/pypeclub/OpenPype/pull/4100) -- Online family for Tray Publisher [\#4093](https://github.com/pypeclub/OpenPype/pull/4093) -- Bump loader-utils from 1.4.0 to 1.4.1 in /website [\#4081](https://github.com/pypeclub/OpenPype/pull/4081) -- remove underscore from subset name [\#4059](https://github.com/pypeclub/OpenPype/pull/4059) -- Alembic Loader as Arnold Standin [\#4047](https://github.com/pypeclub/OpenPype/pull/4047) - -## [3.14.6](https://github.com/pypeclub/OpenPype/tree/3.14.6) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.5...3.14.6) - -### ๐Ÿ“– Documentation - -- Documentation: Minor updates to dev\_requirements.md [\#4025](https://github.com/pypeclub/OpenPype/pull/4025) - -**๐Ÿ†• New features** - -- Nuke: add 13.2 variant [\#4041](https://github.com/pypeclub/OpenPype/pull/4041) - -**๐Ÿš€ Enhancements** - -- Publish Report Viewer: Store reports locally on machine [\#4040](https://github.com/pypeclub/OpenPype/pull/4040) -- General: More specific error in burnins script [\#4026](https://github.com/pypeclub/OpenPype/pull/4026) -- General: Extract review does not crash with old settings overrides [\#4023](https://github.com/pypeclub/OpenPype/pull/4023) -- Publisher: Convertors for legacy instances [\#4020](https://github.com/pypeclub/OpenPype/pull/4020) -- workflows: adding milestone creator and assigner [\#4018](https://github.com/pypeclub/OpenPype/pull/4018) -- Publisher: Catch creator errors [\#4015](https://github.com/pypeclub/OpenPype/pull/4015) - -**๐Ÿ› Bug fixes** - -- Hiero - effect collection fixes [\#4038](https://github.com/pypeclub/OpenPype/pull/4038) -- Nuke - loader clip correct hash conversion in path [\#4037](https://github.com/pypeclub/OpenPype/pull/4037) -- Maya: Soft fail when applying capture preset [\#4034](https://github.com/pypeclub/OpenPype/pull/4034) -- Igniter: handle missing directory [\#4032](https://github.com/pypeclub/OpenPype/pull/4032) -- StandalonePublisher: Fix thumbnail publishing [\#4029](https://github.com/pypeclub/OpenPype/pull/4029) -- Experimental Tools: Fix publisher import [\#4027](https://github.com/pypeclub/OpenPype/pull/4027) -- Houdini: fix wrong path in ASS loader [\#4016](https://github.com/pypeclub/OpenPype/pull/4016) - -**๐Ÿ”€ Refactored code** - -- General: Import lib functions from lib [\#4017](https://github.com/pypeclub/OpenPype/pull/4017) - -## [3.14.5](https://github.com/pypeclub/OpenPype/tree/3.14.5) (2022-10-24) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.4...3.14.5) - -**๐Ÿš€ Enhancements** - -- Maya: add OBJ extractor to model family [\#4021](https://github.com/pypeclub/OpenPype/pull/4021) -- Publish report viewer tool [\#4010](https://github.com/pypeclub/OpenPype/pull/4010) -- Nuke | Global: adding custom tags representation filtering [\#4009](https://github.com/pypeclub/OpenPype/pull/4009) -- Publisher: Create context has shared data for collection phase [\#3995](https://github.com/pypeclub/OpenPype/pull/3995) -- Resolve: updating to v18 compatibility [\#3986](https://github.com/pypeclub/OpenPype/pull/3986) - -**๐Ÿ› Bug fixes** - -- TrayPublisher: Fix missing argument [\#4019](https://github.com/pypeclub/OpenPype/pull/4019) -- General: Fix python 2 compatibility of ffmpeg and oiio tools discovery [\#4011](https://github.com/pypeclub/OpenPype/pull/4011) - -**๐Ÿ”€ Refactored code** - -- Maya: Removed unused imports [\#4008](https://github.com/pypeclub/OpenPype/pull/4008) -- Unreal: Fix import of moved function [\#4007](https://github.com/pypeclub/OpenPype/pull/4007) -- Houdini: Change import of RepairAction [\#4005](https://github.com/pypeclub/OpenPype/pull/4005) -- Nuke/Hiero: Refactor openpype.api imports [\#4000](https://github.com/pypeclub/OpenPype/pull/4000) -- TVPaint: Defined with HostBase [\#3994](https://github.com/pypeclub/OpenPype/pull/3994) - -**Merged pull requests:** - -- Unreal: Remove redundant Creator stub [\#4012](https://github.com/pypeclub/OpenPype/pull/4012) -- Unreal: add `uproject` extension to Unreal project template [\#4004](https://github.com/pypeclub/OpenPype/pull/4004) -- Unreal: fix order of includes [\#4002](https://github.com/pypeclub/OpenPype/pull/4002) -- Fusion: Implement backwards compatibility \(+/- Fusion 17.2\) [\#3958](https://github.com/pypeclub/OpenPype/pull/3958) - -## [3.14.4](https://github.com/pypeclub/OpenPype/tree/3.14.4) (2022-10-19) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.3...3.14.4) - -**๐Ÿ†• New features** - -- Webpublisher: use max next published version number for all items in batch [\#3961](https://github.com/pypeclub/OpenPype/pull/3961) -- General: Control Thumbnail integration via explicit configuration profiles [\#3951](https://github.com/pypeclub/OpenPype/pull/3951) - -**๐Ÿš€ Enhancements** - -- Publisher: Multiselection in card view [\#3993](https://github.com/pypeclub/OpenPype/pull/3993) -- TrayPublisher: Original Basename cause crash too early [\#3990](https://github.com/pypeclub/OpenPype/pull/3990) -- Tray Publisher: add `originalBasename` data to simple creators [\#3988](https://github.com/pypeclub/OpenPype/pull/3988) -- General: Custom paths to ffmpeg and OpenImageIO tools [\#3982](https://github.com/pypeclub/OpenPype/pull/3982) -- Integrate: Preserve existing subset group if instance does not set it for new version [\#3976](https://github.com/pypeclub/OpenPype/pull/3976) -- Publisher: Prepare publisher controller for remote publishing [\#3972](https://github.com/pypeclub/OpenPype/pull/3972) -- Maya: new style dataclasses in maya deadline submitter plugin [\#3968](https://github.com/pypeclub/OpenPype/pull/3968) -- Maya: Define preffered Qt bindings for Qt.py and qtpy [\#3963](https://github.com/pypeclub/OpenPype/pull/3963) -- Settings: Move imageio from project anatomy to project settings \[pypeclub\] [\#3959](https://github.com/pypeclub/OpenPype/pull/3959) -- TrayPublisher: Extract thumbnail for other families [\#3952](https://github.com/pypeclub/OpenPype/pull/3952) -- Publisher: Pass instance to subset name method on update [\#3949](https://github.com/pypeclub/OpenPype/pull/3949) -- General: Set root environments before DCC launch [\#3947](https://github.com/pypeclub/OpenPype/pull/3947) -- Refactor: changed legacy way to update database for Hero version integrate [\#3941](https://github.com/pypeclub/OpenPype/pull/3941) -- Maya: Moved plugin from global to maya [\#3939](https://github.com/pypeclub/OpenPype/pull/3939) -- Publisher: Create dialog is part of main window [\#3936](https://github.com/pypeclub/OpenPype/pull/3936) -- Fusion: Implement Alembic and FBX mesh loader [\#3927](https://github.com/pypeclub/OpenPype/pull/3927) - -**๐Ÿ› Bug fixes** - -- TrayPublisher: Disable sequences in batch mov creator [\#3996](https://github.com/pypeclub/OpenPype/pull/3996) -- Fix - tags might be missing on representation [\#3985](https://github.com/pypeclub/OpenPype/pull/3985) -- Resolve: Fix usage of functions from lib [\#3983](https://github.com/pypeclub/OpenPype/pull/3983) -- Maya: remove invalid prefix token for non-multipart outputs [\#3981](https://github.com/pypeclub/OpenPype/pull/3981) -- Ftrack: Fix schema cache for Python 2 [\#3980](https://github.com/pypeclub/OpenPype/pull/3980) -- Maya: add object to attr.s declaration [\#3973](https://github.com/pypeclub/OpenPype/pull/3973) -- Maya: Deadline OutputFilePath hack regression for Renderman [\#3950](https://github.com/pypeclub/OpenPype/pull/3950) -- Houdini: Fix validate workfile paths for non-parm file references [\#3948](https://github.com/pypeclub/OpenPype/pull/3948) -- Photoshop: missed sync published version of workfile with workfile [\#3946](https://github.com/pypeclub/OpenPype/pull/3946) -- Maya: Set default value for RenderSetupIncludeLights option [\#3944](https://github.com/pypeclub/OpenPype/pull/3944) -- Maya: fix regression of Renderman Deadline hack [\#3943](https://github.com/pypeclub/OpenPype/pull/3943) -- Kitsu: 2 fixes, nb\_frames and Shot type error [\#3940](https://github.com/pypeclub/OpenPype/pull/3940) -- Tray: Change order of attribute changes [\#3938](https://github.com/pypeclub/OpenPype/pull/3938) -- AttributeDefs: Fix crashing multivalue of files widget [\#3937](https://github.com/pypeclub/OpenPype/pull/3937) -- General: Fix links query on hero version [\#3900](https://github.com/pypeclub/OpenPype/pull/3900) -- Publisher: Files Drag n Drop cleanup [\#3888](https://github.com/pypeclub/OpenPype/pull/3888) - -**๐Ÿ”€ Refactored code** - -- Flame: Import lib functions from lib [\#3992](https://github.com/pypeclub/OpenPype/pull/3992) -- General: Fix deprecated warning in legacy creator [\#3978](https://github.com/pypeclub/OpenPype/pull/3978) -- Blender: Remove openpype api imports [\#3977](https://github.com/pypeclub/OpenPype/pull/3977) -- General: Use direct import of resources [\#3964](https://github.com/pypeclub/OpenPype/pull/3964) -- General: Direct settings imports [\#3934](https://github.com/pypeclub/OpenPype/pull/3934) -- General: import 'Logger' from 'openpype.lib' [\#3926](https://github.com/pypeclub/OpenPype/pull/3926) -- General: Remove deprecated functions from lib [\#3907](https://github.com/pypeclub/OpenPype/pull/3907) - -**Merged pull requests:** - -- Maya + Yeti: Load Yeti Cache fix frame number recognition [\#3942](https://github.com/pypeclub/OpenPype/pull/3942) -- Fusion: Implement callbacks to Fusion's event system thread [\#3928](https://github.com/pypeclub/OpenPype/pull/3928) -- Photoshop: create single frame image in Ftrack as review [\#3908](https://github.com/pypeclub/OpenPype/pull/3908) - -## [3.14.3](https://github.com/pypeclub/OpenPype/tree/3.14.3) (2022-10-03) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.2...3.14.3) - -**๐Ÿš€ Enhancements** - -- Publisher: Enhancement proposals [\#3897](https://github.com/pypeclub/OpenPype/pull/3897) - -**๐Ÿ› Bug fixes** - -- Maya: Fix Render single camera validator [\#3929](https://github.com/pypeclub/OpenPype/pull/3929) -- Flame: loading multilayer exr to batch/reel is working [\#3901](https://github.com/pypeclub/OpenPype/pull/3901) -- Hiero: Fix inventory check on launch [\#3895](https://github.com/pypeclub/OpenPype/pull/3895) -- WebPublisher: Fix import after refactor [\#3891](https://github.com/pypeclub/OpenPype/pull/3891) - -**๐Ÿ”€ Refactored code** - -- Maya: Remove unused 'openpype.api' imports in plugins [\#3925](https://github.com/pypeclub/OpenPype/pull/3925) -- Resolve: Use new Extractor location [\#3918](https://github.com/pypeclub/OpenPype/pull/3918) -- Unreal: Use new Extractor location [\#3917](https://github.com/pypeclub/OpenPype/pull/3917) -- Flame: Use new Extractor location [\#3916](https://github.com/pypeclub/OpenPype/pull/3916) -- Houdini: Use new Extractor location [\#3894](https://github.com/pypeclub/OpenPype/pull/3894) -- Harmony: Use new Extractor location [\#3893](https://github.com/pypeclub/OpenPype/pull/3893) - -**Merged pull requests:** - -- Maya: Fix Scene Inventory possibly starting off-screen due to maya preferences [\#3923](https://github.com/pypeclub/OpenPype/pull/3923) - -## [3.14.2](https://github.com/pypeclub/OpenPype/tree/3.14.2) (2022-09-12) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.1...3.14.2) - -### ๐Ÿ“– Documentation - -- Documentation: Anatomy templates [\#3618](https://github.com/pypeclub/OpenPype/pull/3618) - -**๐Ÿ†• New features** - -- Nuke: Build workfile by template [\#3763](https://github.com/pypeclub/OpenPype/pull/3763) -- Houdini: Publishing workfiles [\#3697](https://github.com/pypeclub/OpenPype/pull/3697) -- Global: making collect audio plugin global [\#3679](https://github.com/pypeclub/OpenPype/pull/3679) - -**๐Ÿš€ Enhancements** - -- Flame: Adding Creator's retimed shot and handles switch [\#3826](https://github.com/pypeclub/OpenPype/pull/3826) -- Flame: OpenPype submenu to batch and media manager [\#3825](https://github.com/pypeclub/OpenPype/pull/3825) -- General: Better pixmap scaling [\#3809](https://github.com/pypeclub/OpenPype/pull/3809) -- Photoshop: attempt to speed up ExtractImage [\#3793](https://github.com/pypeclub/OpenPype/pull/3793) -- SyncServer: Added cli commands for sync server [\#3765](https://github.com/pypeclub/OpenPype/pull/3765) -- Kitsu: Drop 'entities root' setting. [\#3739](https://github.com/pypeclub/OpenPype/pull/3739) -- git: update gitignore [\#3722](https://github.com/pypeclub/OpenPype/pull/3722) -- Blender: Publisher collect workfile representation [\#3670](https://github.com/pypeclub/OpenPype/pull/3670) -- Maya: move set render settings menu entry [\#3669](https://github.com/pypeclub/OpenPype/pull/3669) -- Scene Inventory: Maya add actions to select from or to scene [\#3659](https://github.com/pypeclub/OpenPype/pull/3659) -- Scene Inventory: Add subsetGroup column [\#3658](https://github.com/pypeclub/OpenPype/pull/3658) - -**๐Ÿ› Bug fixes** - -- General: Fix Pattern access in client code [\#3828](https://github.com/pypeclub/OpenPype/pull/3828) -- Launcher: Skip opening last work file works for groups [\#3822](https://github.com/pypeclub/OpenPype/pull/3822) -- Maya: Publishing data key change [\#3811](https://github.com/pypeclub/OpenPype/pull/3811) -- Igniter: Fix status handling when version is already installed [\#3804](https://github.com/pypeclub/OpenPype/pull/3804) -- Resolve: Addon import is Python 2 compatible [\#3798](https://github.com/pypeclub/OpenPype/pull/3798) -- Hiero: retimed clip publishing is working [\#3792](https://github.com/pypeclub/OpenPype/pull/3792) -- nuke: validate write node is not failing due wrong type [\#3780](https://github.com/pypeclub/OpenPype/pull/3780) -- Fix - changed format of version string in pyproject.toml [\#3777](https://github.com/pypeclub/OpenPype/pull/3777) -- Ftrack status fix typo prgoress -\> progress [\#3761](https://github.com/pypeclub/OpenPype/pull/3761) -- Fix version resolution [\#3757](https://github.com/pypeclub/OpenPype/pull/3757) -- Maya: `containerise` dont skip empty values [\#3674](https://github.com/pypeclub/OpenPype/pull/3674) - -**๐Ÿ”€ Refactored code** - -- Photoshop: Use new Extractor location [\#3789](https://github.com/pypeclub/OpenPype/pull/3789) -- Blender: Use new Extractor location [\#3787](https://github.com/pypeclub/OpenPype/pull/3787) -- AfterEffects: Use new Extractor location [\#3784](https://github.com/pypeclub/OpenPype/pull/3784) -- General: Remove unused teshost [\#3773](https://github.com/pypeclub/OpenPype/pull/3773) -- General: Copied 'Extractor' plugin to publish pipeline [\#3771](https://github.com/pypeclub/OpenPype/pull/3771) -- General: Move queries of asset and representation links [\#3770](https://github.com/pypeclub/OpenPype/pull/3770) -- General: Move create project folders to pipeline [\#3768](https://github.com/pypeclub/OpenPype/pull/3768) -- General: Create project function moved to client code [\#3766](https://github.com/pypeclub/OpenPype/pull/3766) -- Maya: Refactor submit deadline to use AbstractSubmitDeadline [\#3759](https://github.com/pypeclub/OpenPype/pull/3759) -- General: Change publish template settings location [\#3755](https://github.com/pypeclub/OpenPype/pull/3755) -- General: Move hostdirname functionality into host [\#3749](https://github.com/pypeclub/OpenPype/pull/3749) -- General: Move publish utils to pipeline [\#3745](https://github.com/pypeclub/OpenPype/pull/3745) -- Houdini: Define houdini as addon [\#3735](https://github.com/pypeclub/OpenPype/pull/3735) -- Fusion: Defined fusion as addon [\#3733](https://github.com/pypeclub/OpenPype/pull/3733) -- Flame: Defined flame as addon [\#3732](https://github.com/pypeclub/OpenPype/pull/3732) -- Resolve: Define resolve as addon [\#3727](https://github.com/pypeclub/OpenPype/pull/3727) - -**Merged pull requests:** - -- Standalone Publisher: Ignore empty labels, then still use name like other asset models [\#3779](https://github.com/pypeclub/OpenPype/pull/3779) -- Kitsu - sync\_all\_project - add list ignore\_projects [\#3776](https://github.com/pypeclub/OpenPype/pull/3776) - -## [3.14.1](https://github.com/pypeclub/OpenPype/tree/3.14.1) (2022-08-30) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.0...3.14.1) - -### ๐Ÿ“– Documentation - -- Documentation: Few updates [\#3698](https://github.com/pypeclub/OpenPype/pull/3698) -- Documentation: Settings development [\#3660](https://github.com/pypeclub/OpenPype/pull/3660) - -**๐Ÿ†• New features** - -- Webpublisher:change create flatten image into tri state [\#3678](https://github.com/pypeclub/OpenPype/pull/3678) -- Blender: validators code correction with settings and defaults [\#3662](https://github.com/pypeclub/OpenPype/pull/3662) - -**๐Ÿš€ Enhancements** - -- General: Thumbnail can use project roots [\#3750](https://github.com/pypeclub/OpenPype/pull/3750) -- Settings: Remove settings lock on tray exit [\#3720](https://github.com/pypeclub/OpenPype/pull/3720) -- General: Added helper getters to modules manager [\#3712](https://github.com/pypeclub/OpenPype/pull/3712) -- Unreal: Define unreal as module and use host class [\#3701](https://github.com/pypeclub/OpenPype/pull/3701) -- Settings: Lock settings UI session [\#3700](https://github.com/pypeclub/OpenPype/pull/3700) -- General: Benevolent context label collector [\#3686](https://github.com/pypeclub/OpenPype/pull/3686) -- Ftrack: Store ftrack entities on hierarchy integration to instances [\#3677](https://github.com/pypeclub/OpenPype/pull/3677) -- Ftrack: More logs related to auto sync value change [\#3671](https://github.com/pypeclub/OpenPype/pull/3671) -- Blender: ops refresh manager after process events [\#3663](https://github.com/pypeclub/OpenPype/pull/3663) - -**๐Ÿ› Bug fixes** - -- Maya: Fix typo in getPanel argument `with_focus` -\> `withFocus` [\#3753](https://github.com/pypeclub/OpenPype/pull/3753) -- General: Smaller fixes of imports [\#3748](https://github.com/pypeclub/OpenPype/pull/3748) -- General: Logger tweaks [\#3741](https://github.com/pypeclub/OpenPype/pull/3741) -- Nuke: missing job dependency if multiple bake streams [\#3737](https://github.com/pypeclub/OpenPype/pull/3737) -- Nuke: color-space settings from anatomy is working [\#3721](https://github.com/pypeclub/OpenPype/pull/3721) -- Settings: Fix studio default anatomy save [\#3716](https://github.com/pypeclub/OpenPype/pull/3716) -- Maya: Use project name instead of project code [\#3709](https://github.com/pypeclub/OpenPype/pull/3709) -- Settings: Fix project overrides save [\#3708](https://github.com/pypeclub/OpenPype/pull/3708) -- Workfiles tool: Fix published workfile filtering [\#3704](https://github.com/pypeclub/OpenPype/pull/3704) -- PS, AE: Provide default variant value for workfile subset [\#3703](https://github.com/pypeclub/OpenPype/pull/3703) -- RoyalRender: handle host name that is not set [\#3695](https://github.com/pypeclub/OpenPype/pull/3695) -- Flame: retime is working on clip publishing [\#3684](https://github.com/pypeclub/OpenPype/pull/3684) -- Webpublisher: added check for empty context [\#3682](https://github.com/pypeclub/OpenPype/pull/3682) - -**๐Ÿ”€ Refactored code** - -- General: Move delivery logic to pipeline [\#3751](https://github.com/pypeclub/OpenPype/pull/3751) -- General: Host addons cleanup [\#3744](https://github.com/pypeclub/OpenPype/pull/3744) -- Webpublisher: Webpublisher is used as addon [\#3740](https://github.com/pypeclub/OpenPype/pull/3740) -- Photoshop: Defined photoshop as addon [\#3736](https://github.com/pypeclub/OpenPype/pull/3736) -- Harmony: Defined harmony as addon [\#3734](https://github.com/pypeclub/OpenPype/pull/3734) -- General: Module interfaces cleanup [\#3731](https://github.com/pypeclub/OpenPype/pull/3731) -- AfterEffects: Move AE functions from general lib [\#3730](https://github.com/pypeclub/OpenPype/pull/3730) -- Blender: Define blender as module [\#3729](https://github.com/pypeclub/OpenPype/pull/3729) -- AfterEffects: Define AfterEffects as module [\#3728](https://github.com/pypeclub/OpenPype/pull/3728) -- General: Replace PypeLogger with Logger [\#3725](https://github.com/pypeclub/OpenPype/pull/3725) -- Nuke: Define nuke as module [\#3724](https://github.com/pypeclub/OpenPype/pull/3724) -- General: Move subset name functionality [\#3723](https://github.com/pypeclub/OpenPype/pull/3723) -- General: Move creators plugin getter [\#3714](https://github.com/pypeclub/OpenPype/pull/3714) -- General: Move constants from lib to client [\#3713](https://github.com/pypeclub/OpenPype/pull/3713) -- Loader: Subset groups using client operations [\#3710](https://github.com/pypeclub/OpenPype/pull/3710) -- TVPaint: Defined as module [\#3707](https://github.com/pypeclub/OpenPype/pull/3707) -- StandalonePublisher: Define StandalonePublisher as module [\#3706](https://github.com/pypeclub/OpenPype/pull/3706) -- TrayPublisher: Define TrayPublisher as module [\#3705](https://github.com/pypeclub/OpenPype/pull/3705) -- General: Move context specific functions to context tools [\#3702](https://github.com/pypeclub/OpenPype/pull/3702) - -**Merged pull requests:** - -- Hiero: Define hiero as module [\#3717](https://github.com/pypeclub/OpenPype/pull/3717) -- Deadline: better logging for DL webservice failures [\#3694](https://github.com/pypeclub/OpenPype/pull/3694) -- Photoshop: resize saved images in ExtractReview for ffmpeg [\#3676](https://github.com/pypeclub/OpenPype/pull/3676) -- Nuke: Validation refactory to new publisher [\#3567](https://github.com/pypeclub/OpenPype/pull/3567) - -## [3.14.0](https://github.com/pypeclub/OpenPype/tree/3.14.0) (2022-08-18) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.13.0...3.14.0) - -**๐Ÿ†• New features** - -- Maya: Build workfile by template [\#3578](https://github.com/pypeclub/OpenPype/pull/3578) -- Maya: Implementation of JSON layout for Unreal workflow [\#3353](https://github.com/pypeclub/OpenPype/pull/3353) -- Maya: Build workfile by template [\#3315](https://github.com/pypeclub/OpenPype/pull/3315) - -**๐Ÿš€ Enhancements** - -- Ftrack: Addiotional component metadata [\#3685](https://github.com/pypeclub/OpenPype/pull/3685) -- Ftrack: Set task status on farm publishing [\#3680](https://github.com/pypeclub/OpenPype/pull/3680) -- Ftrack: Set task status on task creation in integrate hierarchy [\#3675](https://github.com/pypeclub/OpenPype/pull/3675) -- Maya: Disable rendering of all lights for render instances submitted through Deadline. [\#3661](https://github.com/pypeclub/OpenPype/pull/3661) -- General: Optimized OCIO configs [\#3650](https://github.com/pypeclub/OpenPype/pull/3650) - -**๐Ÿ› Bug fixes** - -- General: Switch from hero version to versioned works [\#3691](https://github.com/pypeclub/OpenPype/pull/3691) -- General: Fix finding of last version [\#3656](https://github.com/pypeclub/OpenPype/pull/3656) -- General: Extract Review can scale with pixel aspect ratio [\#3644](https://github.com/pypeclub/OpenPype/pull/3644) -- Maya: Refactor moved usage of CreateRender settings [\#3643](https://github.com/pypeclub/OpenPype/pull/3643) -- General: Hero version representations have full context [\#3638](https://github.com/pypeclub/OpenPype/pull/3638) -- Nuke: color settings for render write node is working now [\#3632](https://github.com/pypeclub/OpenPype/pull/3632) -- Maya: FBX support for update in reference loader [\#3631](https://github.com/pypeclub/OpenPype/pull/3631) - -**๐Ÿ”€ Refactored code** - -- General: Use client projects getter [\#3673](https://github.com/pypeclub/OpenPype/pull/3673) -- Resolve: Match folder structure to other hosts [\#3653](https://github.com/pypeclub/OpenPype/pull/3653) -- Maya: Hosts as modules [\#3647](https://github.com/pypeclub/OpenPype/pull/3647) -- TimersManager: Plugins are in timers manager module [\#3639](https://github.com/pypeclub/OpenPype/pull/3639) -- General: Move workfiles functions into pipeline [\#3637](https://github.com/pypeclub/OpenPype/pull/3637) -- General: Workfiles builder using query functions [\#3598](https://github.com/pypeclub/OpenPype/pull/3598) - -**Merged pull requests:** - -- Deadline: Global job pre load is not Pype 2 compatible [\#3666](https://github.com/pypeclub/OpenPype/pull/3666) -- Maya: Remove unused get current renderer logic [\#3645](https://github.com/pypeclub/OpenPype/pull/3645) -- Kitsu|Fix: Movie project type fails & first loop children names [\#3636](https://github.com/pypeclub/OpenPype/pull/3636) -- fix the bug of failing to extract look when UDIMs format used in AiImage [\#3628](https://github.com/pypeclub/OpenPype/pull/3628) - -## [3.13.0](https://github.com/pypeclub/OpenPype/tree/3.13.0) (2022-08-09) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.12.2...3.13.0) - -**๐Ÿ†• New features** - -- Support for mutliple installed versions - 3.13 [\#3605](https://github.com/pypeclub/OpenPype/pull/3605) -- Traypublisher: simple editorial publishing [\#3492](https://github.com/pypeclub/OpenPype/pull/3492) - -**๐Ÿš€ Enhancements** - -- Editorial: Mix audio use side file for ffmpeg filters [\#3630](https://github.com/pypeclub/OpenPype/pull/3630) -- Ftrack: Comment template can contain optional keys [\#3615](https://github.com/pypeclub/OpenPype/pull/3615) -- Ftrack: Add more metadata to ftrack components [\#3612](https://github.com/pypeclub/OpenPype/pull/3612) -- General: Add context to pyblish context [\#3594](https://github.com/pypeclub/OpenPype/pull/3594) -- Kitsu: Shot&Sequence name with prefix over appends [\#3593](https://github.com/pypeclub/OpenPype/pull/3593) -- Photoshop: implemented {layer} placeholder in subset template [\#3591](https://github.com/pypeclub/OpenPype/pull/3591) -- General: Python module appdirs from git [\#3589](https://github.com/pypeclub/OpenPype/pull/3589) -- Ftrack: Update ftrack api to 2.3.3 [\#3588](https://github.com/pypeclub/OpenPype/pull/3588) -- General: New Integrator small fixes [\#3583](https://github.com/pypeclub/OpenPype/pull/3583) -- Maya: Render Creator has configurable options. [\#3097](https://github.com/pypeclub/OpenPype/pull/3097) - -**๐Ÿ› Bug fixes** - -- Maya: fix aov separator in Redshift [\#3625](https://github.com/pypeclub/OpenPype/pull/3625) -- Fix for multi-version build on Mac [\#3622](https://github.com/pypeclub/OpenPype/pull/3622) -- Ftrack: Sync hierarchical attributes can handle new created entities [\#3621](https://github.com/pypeclub/OpenPype/pull/3621) -- General: Extract review aspect ratio scale is calculated by ffmpeg [\#3620](https://github.com/pypeclub/OpenPype/pull/3620) -- Maya: Fix types of default settings [\#3617](https://github.com/pypeclub/OpenPype/pull/3617) -- Integrator: Don't force to have dot before frame [\#3611](https://github.com/pypeclub/OpenPype/pull/3611) -- AfterEffects: refactored integrate doesnt work formulti frame publishes [\#3610](https://github.com/pypeclub/OpenPype/pull/3610) -- Maya look data contents fails with custom attribute on group [\#3607](https://github.com/pypeclub/OpenPype/pull/3607) -- TrayPublisher: Fix wrong conflict merge [\#3600](https://github.com/pypeclub/OpenPype/pull/3600) -- Bugfix: Add OCIO as submodule to prepare for handling `maketx` color space conversion. [\#3590](https://github.com/pypeclub/OpenPype/pull/3590) -- Fix general settings environment variables resolution [\#3587](https://github.com/pypeclub/OpenPype/pull/3587) -- Editorial publishing workflow improvements [\#3580](https://github.com/pypeclub/OpenPype/pull/3580) -- General: Update imports in start script [\#3579](https://github.com/pypeclub/OpenPype/pull/3579) -- Nuke: render family integration consistency [\#3576](https://github.com/pypeclub/OpenPype/pull/3576) -- Ftrack: Handle missing published path in integrator [\#3570](https://github.com/pypeclub/OpenPype/pull/3570) -- Nuke: publish existing frames with slate with correct range [\#3555](https://github.com/pypeclub/OpenPype/pull/3555) - -**๐Ÿ”€ Refactored code** - -- General: Plugin settings handled by plugins [\#3623](https://github.com/pypeclub/OpenPype/pull/3623) -- General: Naive implementation of document create, update, delete [\#3601](https://github.com/pypeclub/OpenPype/pull/3601) -- General: Use query functions in general code [\#3596](https://github.com/pypeclub/OpenPype/pull/3596) -- General: Separate extraction of template data into more functions [\#3574](https://github.com/pypeclub/OpenPype/pull/3574) -- General: Lib cleanup [\#3571](https://github.com/pypeclub/OpenPype/pull/3571) - -**Merged pull requests:** - -- Webpublisher: timeout for PS studio processing [\#3619](https://github.com/pypeclub/OpenPype/pull/3619) -- Core: translated validate\_containers.py into New publisher style [\#3614](https://github.com/pypeclub/OpenPype/pull/3614) -- Enable write color sets on animation publish automatically [\#3582](https://github.com/pypeclub/OpenPype/pull/3582) - -## [3.12.2](https://github.com/pypeclub/OpenPype/tree/3.12.2) (2022-07-27) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.12.1...3.12.2) - -### ๐Ÿ“– Documentation - -- Update website with more studios [\#3554](https://github.com/pypeclub/OpenPype/pull/3554) -- Documentation: Update publishing dev docs [\#3549](https://github.com/pypeclub/OpenPype/pull/3549) - -**๐Ÿš€ Enhancements** - -- General: Global thumbnail extractor is ready for more cases [\#3561](https://github.com/pypeclub/OpenPype/pull/3561) -- Maya: add additional validators to Settings [\#3540](https://github.com/pypeclub/OpenPype/pull/3540) -- General: Interactive console in cli [\#3526](https://github.com/pypeclub/OpenPype/pull/3526) -- Ftrack: Automatic daily review session creation can define trigger hour [\#3516](https://github.com/pypeclub/OpenPype/pull/3516) -- Ftrack: add source into Note [\#3509](https://github.com/pypeclub/OpenPype/pull/3509) -- Ftrack: Trigger custom ftrack topic of project structure creation [\#3506](https://github.com/pypeclub/OpenPype/pull/3506) -- Settings UI: Add extract to file action on project view [\#3505](https://github.com/pypeclub/OpenPype/pull/3505) -- Add pack and unpack convenience scripts [\#3502](https://github.com/pypeclub/OpenPype/pull/3502) -- General: Event system [\#3499](https://github.com/pypeclub/OpenPype/pull/3499) -- NewPublisher: Keep plugins with mismatch target in report [\#3498](https://github.com/pypeclub/OpenPype/pull/3498) -- Nuke: load clip with options from settings [\#3497](https://github.com/pypeclub/OpenPype/pull/3497) -- TrayPublisher: implemented render\_mov\_batch [\#3486](https://github.com/pypeclub/OpenPype/pull/3486) -- Migrate basic families to the new Tray Publisher [\#3469](https://github.com/pypeclub/OpenPype/pull/3469) -- Enhance powershell build scripts [\#1827](https://github.com/pypeclub/OpenPype/pull/1827) - -**๐Ÿ› Bug fixes** - -- Maya: fix Review image plane attribute [\#3569](https://github.com/pypeclub/OpenPype/pull/3569) -- Maya: Fix animated attributes \(ie. overscan\) on loaded cameras breaking review publishing. [\#3562](https://github.com/pypeclub/OpenPype/pull/3562) -- NewPublisher: Python 2 compatible html escape [\#3559](https://github.com/pypeclub/OpenPype/pull/3559) -- Remove invalid submodules from `/vendor` [\#3557](https://github.com/pypeclub/OpenPype/pull/3557) -- General: Remove hosts filter on integrator plugins [\#3556](https://github.com/pypeclub/OpenPype/pull/3556) -- Settings: Clean default values of environments [\#3550](https://github.com/pypeclub/OpenPype/pull/3550) -- Module interfaces: Fix import error [\#3547](https://github.com/pypeclub/OpenPype/pull/3547) -- Workfiles tool: Show of tool and it's flags [\#3539](https://github.com/pypeclub/OpenPype/pull/3539) -- General: Create workfile documents works again [\#3538](https://github.com/pypeclub/OpenPype/pull/3538) -- Additional fixes for powershell scripts [\#3525](https://github.com/pypeclub/OpenPype/pull/3525) -- Maya: Added wrapper around cmds.setAttr [\#3523](https://github.com/pypeclub/OpenPype/pull/3523) -- Nuke: double slate [\#3521](https://github.com/pypeclub/OpenPype/pull/3521) -- General: Fix hash of centos oiio archive [\#3519](https://github.com/pypeclub/OpenPype/pull/3519) -- Maya: Renderman display output fix [\#3514](https://github.com/pypeclub/OpenPype/pull/3514) -- TrayPublisher: Simple creation enhancements and fixes [\#3513](https://github.com/pypeclub/OpenPype/pull/3513) -- NewPublisher: Publish attributes are properly collected [\#3510](https://github.com/pypeclub/OpenPype/pull/3510) -- TrayPublisher: Make sure host name is filled [\#3504](https://github.com/pypeclub/OpenPype/pull/3504) -- NewPublisher: Groups work and enum multivalue [\#3501](https://github.com/pypeclub/OpenPype/pull/3501) - -**๐Ÿ”€ Refactored code** - -- General: Use query functions in integrator [\#3563](https://github.com/pypeclub/OpenPype/pull/3563) -- General: Mongo core connection moved to client [\#3531](https://github.com/pypeclub/OpenPype/pull/3531) -- Refactor Integrate Asset [\#3530](https://github.com/pypeclub/OpenPype/pull/3530) -- General: Client docstrings cleanup [\#3529](https://github.com/pypeclub/OpenPype/pull/3529) -- General: Move load related functions into pipeline [\#3527](https://github.com/pypeclub/OpenPype/pull/3527) -- General: Get current context document functions [\#3522](https://github.com/pypeclub/OpenPype/pull/3522) -- Kitsu: Use query function from client [\#3496](https://github.com/pypeclub/OpenPype/pull/3496) -- TimersManager: Use query functions [\#3495](https://github.com/pypeclub/OpenPype/pull/3495) -- Deadline: Use query functions [\#3466](https://github.com/pypeclub/OpenPype/pull/3466) -- Refactor Integrate Asset [\#2898](https://github.com/pypeclub/OpenPype/pull/2898) - -**Merged pull requests:** - -- Maya: fix active pane loss [\#3566](https://github.com/pypeclub/OpenPype/pull/3566) - -## [3.12.1](https://github.com/pypeclub/OpenPype/tree/3.12.1) (2022-07-13) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.12.0...3.12.1) - -### ๐Ÿ“– Documentation - -- Docs: Added minimal permissions for MongoDB [\#3441](https://github.com/pypeclub/OpenPype/pull/3441) - -**๐Ÿ†• New features** - -- Maya: Add VDB to Arnold loader [\#3433](https://github.com/pypeclub/OpenPype/pull/3433) - -**๐Ÿš€ Enhancements** - -- TrayPublisher: Added more options for grouping of instances [\#3494](https://github.com/pypeclub/OpenPype/pull/3494) -- NewPublisher: Align creator attributes from top to bottom [\#3487](https://github.com/pypeclub/OpenPype/pull/3487) -- NewPublisher: Added ability to use label of instance [\#3484](https://github.com/pypeclub/OpenPype/pull/3484) -- General: Creator Plugins have access to project [\#3476](https://github.com/pypeclub/OpenPype/pull/3476) -- General: Better arguments order in creator init [\#3475](https://github.com/pypeclub/OpenPype/pull/3475) -- Ftrack: Trigger custom ftrack events on project creation and preparation [\#3465](https://github.com/pypeclub/OpenPype/pull/3465) -- Windows installer: Clean old files and add version subfolder [\#3445](https://github.com/pypeclub/OpenPype/pull/3445) -- Blender: Bugfix - Set fps properly on open [\#3426](https://github.com/pypeclub/OpenPype/pull/3426) -- Hiero: Add custom scripts menu [\#3425](https://github.com/pypeclub/OpenPype/pull/3425) -- Blender: pre pyside install for all platforms [\#3400](https://github.com/pypeclub/OpenPype/pull/3400) -- Maya: Add additional playblast options to review Extractor. [\#3384](https://github.com/pypeclub/OpenPype/pull/3384) -- Maya: Ability to set resolution for playblasts from asset, and override through review instance. [\#3360](https://github.com/pypeclub/OpenPype/pull/3360) -- Maya: Redshift Volume Loader Implement update, remove, switch + fix vdb sequence support [\#3197](https://github.com/pypeclub/OpenPype/pull/3197) -- Maya: Implement `iter_visible_nodes_in_range` for extracting Alembics [\#3100](https://github.com/pypeclub/OpenPype/pull/3100) - -**๐Ÿ› Bug fixes** - -- TrayPublisher: Keep use instance label in list view [\#3493](https://github.com/pypeclub/OpenPype/pull/3493) -- General: Extract review use first frame of input sequence [\#3491](https://github.com/pypeclub/OpenPype/pull/3491) -- General: Fix Plist loading for application launch [\#3485](https://github.com/pypeclub/OpenPype/pull/3485) -- Nuke: Workfile tools open on start [\#3479](https://github.com/pypeclub/OpenPype/pull/3479) -- New Publisher: Disabled context change allows creation [\#3478](https://github.com/pypeclub/OpenPype/pull/3478) -- General: thumbnail extractor fix [\#3474](https://github.com/pypeclub/OpenPype/pull/3474) -- Kitsu: bugfix with sync-service ans publish plugins [\#3473](https://github.com/pypeclub/OpenPype/pull/3473) -- Flame: solved problem with multi-selected loading [\#3470](https://github.com/pypeclub/OpenPype/pull/3470) -- General: Fix query function in update logic [\#3468](https://github.com/pypeclub/OpenPype/pull/3468) -- Resolve: removed few bugs [\#3464](https://github.com/pypeclub/OpenPype/pull/3464) -- General: Delete old versions is safer when ftrack is disabled [\#3462](https://github.com/pypeclub/OpenPype/pull/3462) -- Nuke: fixing metadata slate TC difference [\#3455](https://github.com/pypeclub/OpenPype/pull/3455) -- Nuke: prerender reviewable fails [\#3450](https://github.com/pypeclub/OpenPype/pull/3450) -- Maya: fix hashing in Python 3 for tile rendering [\#3447](https://github.com/pypeclub/OpenPype/pull/3447) -- LogViewer: Escape html characters in log message [\#3443](https://github.com/pypeclub/OpenPype/pull/3443) -- Nuke: Slate frame is integrated [\#3427](https://github.com/pypeclub/OpenPype/pull/3427) -- Maya: Camera extra data - additional fix for \#3304 [\#3386](https://github.com/pypeclub/OpenPype/pull/3386) -- Maya: Handle excluding `model` family from frame range validator. [\#3370](https://github.com/pypeclub/OpenPype/pull/3370) - -**๐Ÿ”€ Refactored code** - -- Maya: Merge animation + pointcache extractor logic [\#3461](https://github.com/pypeclub/OpenPype/pull/3461) -- Maya: Re-use `maintained_time` from lib [\#3460](https://github.com/pypeclub/OpenPype/pull/3460) -- General: Use query functions in global plugins [\#3459](https://github.com/pypeclub/OpenPype/pull/3459) -- Clockify: Use query functions in clockify actions [\#3458](https://github.com/pypeclub/OpenPype/pull/3458) -- General: Use query functions in rest api calls [\#3457](https://github.com/pypeclub/OpenPype/pull/3457) -- General: Use query functions in openpype lib functions [\#3454](https://github.com/pypeclub/OpenPype/pull/3454) -- General: Use query functions in load utils [\#3446](https://github.com/pypeclub/OpenPype/pull/3446) -- General: Move publish plugin and publish render abstractions [\#3442](https://github.com/pypeclub/OpenPype/pull/3442) -- General: Use Anatomy after move to pipeline [\#3436](https://github.com/pypeclub/OpenPype/pull/3436) -- General: Anatomy moved to pipeline [\#3435](https://github.com/pypeclub/OpenPype/pull/3435) -- Fusion: Use client query functions [\#3380](https://github.com/pypeclub/OpenPype/pull/3380) -- Resolve: Use client query functions [\#3379](https://github.com/pypeclub/OpenPype/pull/3379) -- General: Host implementation defined with class [\#3337](https://github.com/pypeclub/OpenPype/pull/3337) - -## [3.12.0](https://github.com/pypeclub/OpenPype/tree/3.12.0) (2022-06-28) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.11.1...3.12.0) - -### ๐Ÿ“– Documentation - -- Fix typo in documentation: pyenv on mac [\#3417](https://github.com/pypeclub/OpenPype/pull/3417) -- Linux: update OIIO package [\#3401](https://github.com/pypeclub/OpenPype/pull/3401) - -**๐Ÿ†• New features** - -- Shotgrid: Add production beta of shotgrid integration [\#2921](https://github.com/pypeclub/OpenPype/pull/2921) - -**๐Ÿš€ Enhancements** - -- Webserver: Added CORS middleware [\#3422](https://github.com/pypeclub/OpenPype/pull/3422) -- Attribute Defs UI: Files widget show what is allowed to drop in [\#3411](https://github.com/pypeclub/OpenPype/pull/3411) -- General: Add ability to change user value for templates [\#3366](https://github.com/pypeclub/OpenPype/pull/3366) -- Hosts: More options for in-host callbacks [\#3357](https://github.com/pypeclub/OpenPype/pull/3357) -- Multiverse: expose some settings to GUI [\#3350](https://github.com/pypeclub/OpenPype/pull/3350) -- Maya: Allow more data to be published along camera ๐ŸŽฅ [\#3304](https://github.com/pypeclub/OpenPype/pull/3304) -- Add root keys and project keys to create starting folder [\#2755](https://github.com/pypeclub/OpenPype/pull/2755) - -**๐Ÿ› Bug fixes** - -- NewPublisher: Fix subset name change on change of creator plugin [\#3420](https://github.com/pypeclub/OpenPype/pull/3420) -- Bug: fix invalid avalon import [\#3418](https://github.com/pypeclub/OpenPype/pull/3418) -- Nuke: Fix keyword argument in query function [\#3414](https://github.com/pypeclub/OpenPype/pull/3414) -- Houdini: fix loading and updating vbd/bgeo sequences [\#3408](https://github.com/pypeclub/OpenPype/pull/3408) -- Nuke: Collect representation files based on Write [\#3407](https://github.com/pypeclub/OpenPype/pull/3407) -- General: Filter representations before integration start [\#3398](https://github.com/pypeclub/OpenPype/pull/3398) -- Maya: look collector typo [\#3392](https://github.com/pypeclub/OpenPype/pull/3392) -- TVPaint: Make sure exit code is set to not None [\#3382](https://github.com/pypeclub/OpenPype/pull/3382) -- Maya: vray device aspect ratio fix [\#3381](https://github.com/pypeclub/OpenPype/pull/3381) -- Flame: bunch of publishing issues [\#3377](https://github.com/pypeclub/OpenPype/pull/3377) -- Harmony: added unc path to zifile command in Harmony [\#3372](https://github.com/pypeclub/OpenPype/pull/3372) -- Standalone: settings improvements [\#3355](https://github.com/pypeclub/OpenPype/pull/3355) -- Nuke: Load full model hierarchy by default [\#3328](https://github.com/pypeclub/OpenPype/pull/3328) -- Nuke: multiple baking streams with correct slate [\#3245](https://github.com/pypeclub/OpenPype/pull/3245) -- Maya: fix image prefix warning in validator [\#3128](https://github.com/pypeclub/OpenPype/pull/3128) - -**๐Ÿ”€ Refactored code** - -- Unreal: Use client query functions [\#3421](https://github.com/pypeclub/OpenPype/pull/3421) -- General: Move editorial lib to pipeline [\#3419](https://github.com/pypeclub/OpenPype/pull/3419) -- Kitsu: renaming to plural func sync\_all\_projects [\#3397](https://github.com/pypeclub/OpenPype/pull/3397) -- Houdini: Use client query functions [\#3395](https://github.com/pypeclub/OpenPype/pull/3395) -- Hiero: Use client query functions [\#3393](https://github.com/pypeclub/OpenPype/pull/3393) -- Nuke: Use client query functions [\#3391](https://github.com/pypeclub/OpenPype/pull/3391) -- Maya: Use client query functions [\#3385](https://github.com/pypeclub/OpenPype/pull/3385) -- Harmony: Use client query functions [\#3378](https://github.com/pypeclub/OpenPype/pull/3378) -- Celaction: Use client query functions [\#3376](https://github.com/pypeclub/OpenPype/pull/3376) -- Photoshop: Use client query functions [\#3375](https://github.com/pypeclub/OpenPype/pull/3375) -- AfterEffects: Use client query functions [\#3374](https://github.com/pypeclub/OpenPype/pull/3374) -- TVPaint: Use client query functions [\#3340](https://github.com/pypeclub/OpenPype/pull/3340) -- Ftrack: Use client query functions [\#3339](https://github.com/pypeclub/OpenPype/pull/3339) -- Standalone Publisher: Use client query functions [\#3330](https://github.com/pypeclub/OpenPype/pull/3330) - -**Merged pull requests:** - -- Sync Queue: Added far future value for null values for dates [\#3371](https://github.com/pypeclub/OpenPype/pull/3371) -- Maya - added support for single frame playblast review [\#3369](https://github.com/pypeclub/OpenPype/pull/3369) -- Houdini: Implement Redshift Proxy Export [\#3196](https://github.com/pypeclub/OpenPype/pull/3196) - -## [3.11.1](https://github.com/pypeclub/OpenPype/tree/3.11.1) (2022-06-20) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.11.0...3.11.1) - -**๐Ÿ†• New features** - -- Flame: custom export temp folder [\#3346](https://github.com/pypeclub/OpenPype/pull/3346) -- Nuke: removing third-party plugins [\#3344](https://github.com/pypeclub/OpenPype/pull/3344) - -**๐Ÿš€ Enhancements** - -- Pyblish Pype: Hiding/Close issues [\#3367](https://github.com/pypeclub/OpenPype/pull/3367) -- Ftrack: Removed requirement of pypeclub role from default settings [\#3354](https://github.com/pypeclub/OpenPype/pull/3354) -- Kitsu: Prevent crash on missing frames information [\#3352](https://github.com/pypeclub/OpenPype/pull/3352) -- Ftrack: Open browser from tray [\#3320](https://github.com/pypeclub/OpenPype/pull/3320) -- Enhancement: More control over thumbnail processing. [\#3259](https://github.com/pypeclub/OpenPype/pull/3259) - -**๐Ÿ› Bug fixes** - -- Nuke: bake streams with slate on farm [\#3368](https://github.com/pypeclub/OpenPype/pull/3368) -- Harmony: audio validator has wrong logic [\#3364](https://github.com/pypeclub/OpenPype/pull/3364) -- Nuke: Fix missing variable in extract thumbnail [\#3363](https://github.com/pypeclub/OpenPype/pull/3363) -- Nuke: Fix precollect writes [\#3361](https://github.com/pypeclub/OpenPype/pull/3361) -- AE- fix validate\_scene\_settings and renderLocal [\#3358](https://github.com/pypeclub/OpenPype/pull/3358) -- deadline: fixing misidentification of revieables [\#3356](https://github.com/pypeclub/OpenPype/pull/3356) -- General: Create only one thumbnail per instance [\#3351](https://github.com/pypeclub/OpenPype/pull/3351) -- nuke: adding extract thumbnail settings 3.10 [\#3347](https://github.com/pypeclub/OpenPype/pull/3347) -- General: Fix last version function [\#3345](https://github.com/pypeclub/OpenPype/pull/3345) -- Deadline: added OPENPYPE\_MONGO to filter [\#3336](https://github.com/pypeclub/OpenPype/pull/3336) -- Nuke: fixing farm publishing if review is disabled [\#3306](https://github.com/pypeclub/OpenPype/pull/3306) -- Maya: Fix Yeti errors on Create, Publish and Load [\#3198](https://github.com/pypeclub/OpenPype/pull/3198) - -**๐Ÿ”€ Refactored code** - -- Webpublisher: Use client query functions [\#3333](https://github.com/pypeclub/OpenPype/pull/3333) - -## [3.11.0](https://github.com/pypeclub/OpenPype/tree/3.11.0) (2022-06-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.10.0...3.11.0) - -### ๐Ÿ“– Documentation - -- Documentation: Add app key to template documentation [\#3299](https://github.com/pypeclub/OpenPype/pull/3299) -- doc: adding royal render and multiverse to the web site [\#3285](https://github.com/pypeclub/OpenPype/pull/3285) -- Module: Kitsu module [\#2650](https://github.com/pypeclub/OpenPype/pull/2650) - -**๐Ÿ†• New features** - -- Multiverse: fixed composition write, full docs, cosmetics [\#3178](https://github.com/pypeclub/OpenPype/pull/3178) - -**๐Ÿš€ Enhancements** - -- Settings: Settings can be extracted from UI [\#3323](https://github.com/pypeclub/OpenPype/pull/3323) -- updated poetry installation source [\#3316](https://github.com/pypeclub/OpenPype/pull/3316) -- Ftrack: Action to easily create daily review session [\#3310](https://github.com/pypeclub/OpenPype/pull/3310) -- TVPaint: Extractor use mark in/out range to render [\#3309](https://github.com/pypeclub/OpenPype/pull/3309) -- Ftrack: Delivery action can work on ReviewSessions [\#3307](https://github.com/pypeclub/OpenPype/pull/3307) -- Maya: Look assigner UI improvements [\#3298](https://github.com/pypeclub/OpenPype/pull/3298) -- Ftrack: Action to transfer values of hierarchical attributes [\#3284](https://github.com/pypeclub/OpenPype/pull/3284) -- Maya: better handling of legacy review subsets names [\#3269](https://github.com/pypeclub/OpenPype/pull/3269) -- General: Updated windows oiio tool [\#3268](https://github.com/pypeclub/OpenPype/pull/3268) -- Unreal: add support for skeletalMesh and staticMesh to loaders [\#3267](https://github.com/pypeclub/OpenPype/pull/3267) -- Maya: reference loaders could store placeholder in referenced url [\#3264](https://github.com/pypeclub/OpenPype/pull/3264) -- TVPaint: Init file for TVPaint worker also handle guideline images [\#3250](https://github.com/pypeclub/OpenPype/pull/3250) -- Nuke: Change default icon path in settings [\#3247](https://github.com/pypeclub/OpenPype/pull/3247) -- Maya: publishing of animation and pointcache on a farm [\#3225](https://github.com/pypeclub/OpenPype/pull/3225) -- Maya: Look assigner UI improvements [\#3208](https://github.com/pypeclub/OpenPype/pull/3208) -- Nuke: add pointcache and animation to loader [\#3186](https://github.com/pypeclub/OpenPype/pull/3186) -- Nuke: Add a gizmo menu [\#3172](https://github.com/pypeclub/OpenPype/pull/3172) -- Support for Unreal 5 [\#3122](https://github.com/pypeclub/OpenPype/pull/3122) - -**๐Ÿ› Bug fixes** - -- General: Handle empty source key on instance [\#3342](https://github.com/pypeclub/OpenPype/pull/3342) -- Houdini: Fix Houdini VDB manage update wrong file attribute name [\#3322](https://github.com/pypeclub/OpenPype/pull/3322) -- Nuke: anatomy compatibility issue hacks [\#3321](https://github.com/pypeclub/OpenPype/pull/3321) -- hiero: otio p3 compatibility issue - metadata on effect use update 3.11 [\#3314](https://github.com/pypeclub/OpenPype/pull/3314) -- General: Vendorized modules for Python 2 and update poetry lock [\#3305](https://github.com/pypeclub/OpenPype/pull/3305) -- Fix - added local targets to install host [\#3303](https://github.com/pypeclub/OpenPype/pull/3303) -- Settings: Add missing default settings for nuke gizmo [\#3301](https://github.com/pypeclub/OpenPype/pull/3301) -- Maya: Fix swaped width and height in reviews [\#3300](https://github.com/pypeclub/OpenPype/pull/3300) -- Maya: point cache publish handles Maya instances [\#3297](https://github.com/pypeclub/OpenPype/pull/3297) -- Global: extract review slate issues [\#3286](https://github.com/pypeclub/OpenPype/pull/3286) -- Webpublisher: return only active projects in ProjectsEndpoint [\#3281](https://github.com/pypeclub/OpenPype/pull/3281) -- Hiero: add support for task tags 3.10.x [\#3279](https://github.com/pypeclub/OpenPype/pull/3279) -- General: Fix Oiio tool path resolving [\#3278](https://github.com/pypeclub/OpenPype/pull/3278) -- Maya: Fix udim support for e.g. uppercase \ tag [\#3266](https://github.com/pypeclub/OpenPype/pull/3266) -- Nuke: bake reformat was failing on string type [\#3261](https://github.com/pypeclub/OpenPype/pull/3261) -- Maya: hotfix Pxr multitexture in looks [\#3260](https://github.com/pypeclub/OpenPype/pull/3260) -- Unreal: Fix Camera Loading if Layout is missing [\#3255](https://github.com/pypeclub/OpenPype/pull/3255) -- Unreal: Fixed Animation loading in UE5 [\#3240](https://github.com/pypeclub/OpenPype/pull/3240) -- Unreal: Fixed Render creation in UE5 [\#3239](https://github.com/pypeclub/OpenPype/pull/3239) -- Unreal: Fixed Camera loading in UE5 [\#3238](https://github.com/pypeclub/OpenPype/pull/3238) -- Flame: debugging [\#3224](https://github.com/pypeclub/OpenPype/pull/3224) -- add silent audio to slate [\#3162](https://github.com/pypeclub/OpenPype/pull/3162) -- Add timecode to slate [\#2929](https://github.com/pypeclub/OpenPype/pull/2929) - -**๐Ÿ”€ Refactored code** - -- Blender: Use client query functions [\#3331](https://github.com/pypeclub/OpenPype/pull/3331) -- General: Define query functions [\#3288](https://github.com/pypeclub/OpenPype/pull/3288) - -**Merged pull requests:** - -- Maya: add pointcache family to gpu cache loader [\#3318](https://github.com/pypeclub/OpenPype/pull/3318) -- Maya look: skip empty file attributes [\#3274](https://github.com/pypeclub/OpenPype/pull/3274) - -## [3.10.0](https://github.com/pypeclub/OpenPype/tree/3.10.0) (2022-05-26) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.8...3.10.0) - -### ๐Ÿ“– Documentation - -- Docs: add all-contributors config and initial list [\#3094](https://github.com/pypeclub/OpenPype/pull/3094) -- Nuke docs with videos [\#3052](https://github.com/pypeclub/OpenPype/pull/3052) - -**๐Ÿ†• New features** - -- General: OpenPype modules publish plugins are registered in host [\#3180](https://github.com/pypeclub/OpenPype/pull/3180) -- General: Creator plugins from addons can be registered [\#3179](https://github.com/pypeclub/OpenPype/pull/3179) -- Ftrack: Single image reviewable [\#3157](https://github.com/pypeclub/OpenPype/pull/3157) -- Nuke: Expose write attributes to settings [\#3123](https://github.com/pypeclub/OpenPype/pull/3123) -- Hiero: Initial frame publish support [\#3106](https://github.com/pypeclub/OpenPype/pull/3106) -- Unreal: Render Publishing [\#2917](https://github.com/pypeclub/OpenPype/pull/2917) -- AfterEffects: Implemented New Publisher [\#2838](https://github.com/pypeclub/OpenPype/pull/2838) -- Unreal: Rendering implementation [\#2410](https://github.com/pypeclub/OpenPype/pull/2410) - -**๐Ÿš€ Enhancements** - -- Maya: FBX camera export [\#3253](https://github.com/pypeclub/OpenPype/pull/3253) -- General: updating common vendor `scriptmenu` to 1.5.2 [\#3246](https://github.com/pypeclub/OpenPype/pull/3246) -- Project Manager: Allow to paste Tasks into multiple assets at the same time [\#3226](https://github.com/pypeclub/OpenPype/pull/3226) -- Project manager: Sped up project load [\#3216](https://github.com/pypeclub/OpenPype/pull/3216) -- Loader UI: Speed issues of loader with sync server [\#3199](https://github.com/pypeclub/OpenPype/pull/3199) -- Looks: add basic support for Renderman [\#3190](https://github.com/pypeclub/OpenPype/pull/3190) -- Maya: added clean\_import option to Import loader [\#3181](https://github.com/pypeclub/OpenPype/pull/3181) -- Add the scripts menu definition to nuke [\#3168](https://github.com/pypeclub/OpenPype/pull/3168) -- Maya: add maya 2023 to default applications [\#3167](https://github.com/pypeclub/OpenPype/pull/3167) -- Compressed bgeo publishing in SAP and Houdini loader [\#3153](https://github.com/pypeclub/OpenPype/pull/3153) -- General: Add 'dataclasses' to required python modules [\#3149](https://github.com/pypeclub/OpenPype/pull/3149) -- Hooks: Tweak logging grammar [\#3147](https://github.com/pypeclub/OpenPype/pull/3147) -- Nuke: settings for reformat node in CreateWriteRender node [\#3143](https://github.com/pypeclub/OpenPype/pull/3143) -- Houdini: Add loader for alembic through Alembic Archive node [\#3140](https://github.com/pypeclub/OpenPype/pull/3140) -- Publisher: UI Modifications and fixes [\#3139](https://github.com/pypeclub/OpenPype/pull/3139) -- General: Simplified OP modules/addons import [\#3137](https://github.com/pypeclub/OpenPype/pull/3137) -- Terminal: Tweak coloring of TrayModuleManager logging enabled states [\#3133](https://github.com/pypeclub/OpenPype/pull/3133) -- General: Cleanup some Loader docstrings [\#3131](https://github.com/pypeclub/OpenPype/pull/3131) -- Nuke: render instance with subset name filtered overrides [\#3117](https://github.com/pypeclub/OpenPype/pull/3117) -- Unreal: Layout and Camera update and remove functions reimplemented and improvements [\#3116](https://github.com/pypeclub/OpenPype/pull/3116) -- Settings: Remove environment groups from settings [\#3115](https://github.com/pypeclub/OpenPype/pull/3115) -- TVPaint: Match renderlayer key with other hosts [\#3110](https://github.com/pypeclub/OpenPype/pull/3110) -- Ftrack: AssetVersion status on publish [\#3108](https://github.com/pypeclub/OpenPype/pull/3108) -- Tray publisher: Simple families from settings [\#3105](https://github.com/pypeclub/OpenPype/pull/3105) -- Local Settings UI: Overlay messages on save and reset [\#3104](https://github.com/pypeclub/OpenPype/pull/3104) -- General: Remove repos related logic [\#3087](https://github.com/pypeclub/OpenPype/pull/3087) -- Standalone publisher: add support for bgeo and vdb [\#3080](https://github.com/pypeclub/OpenPype/pull/3080) -- Houdini: Fix FPS + outdated content pop-ups [\#3079](https://github.com/pypeclub/OpenPype/pull/3079) -- General: Add global log verbose arguments [\#3070](https://github.com/pypeclub/OpenPype/pull/3070) -- Flame: extract presets distribution [\#3063](https://github.com/pypeclub/OpenPype/pull/3063) -- Update collect\_render.py [\#3055](https://github.com/pypeclub/OpenPype/pull/3055) -- SiteSync: Added compute\_resource\_sync\_sites to sync\_server\_module [\#2983](https://github.com/pypeclub/OpenPype/pull/2983) -- Maya: Implement Hardware Renderer 2.0 support for Render Products [\#2611](https://github.com/pypeclub/OpenPype/pull/2611) - -**๐Ÿ› Bug fixes** - -- nuke: use framerange issue [\#3254](https://github.com/pypeclub/OpenPype/pull/3254) -- Ftrack: Chunk sizes for queries has minimal condition [\#3244](https://github.com/pypeclub/OpenPype/pull/3244) -- Maya: renderman displays needs to be filtered [\#3242](https://github.com/pypeclub/OpenPype/pull/3242) -- Ftrack: Validate that the user exists on ftrack [\#3237](https://github.com/pypeclub/OpenPype/pull/3237) -- Maya: Fix support for multiple resolutions [\#3236](https://github.com/pypeclub/OpenPype/pull/3236) -- TVPaint: Look for more groups than 12 [\#3228](https://github.com/pypeclub/OpenPype/pull/3228) -- Hiero: debugging frame range and other 3.10 [\#3222](https://github.com/pypeclub/OpenPype/pull/3222) -- Project Manager: Fix persistent editors on project change [\#3218](https://github.com/pypeclub/OpenPype/pull/3218) -- Deadline: instance data overwrite fix [\#3214](https://github.com/pypeclub/OpenPype/pull/3214) -- Ftrack: Push hierarchical attributes action works [\#3210](https://github.com/pypeclub/OpenPype/pull/3210) -- Standalone Publisher: Always create new representation for thumbnail [\#3203](https://github.com/pypeclub/OpenPype/pull/3203) -- Photoshop: skip collector when automatic testing [\#3202](https://github.com/pypeclub/OpenPype/pull/3202) -- Nuke: render/workfile version sync doesn't work on farm [\#3185](https://github.com/pypeclub/OpenPype/pull/3185) -- Ftrack: Review image only if there are no mp4 reviews [\#3183](https://github.com/pypeclub/OpenPype/pull/3183) -- Ftrack: Locations deepcopy issue [\#3177](https://github.com/pypeclub/OpenPype/pull/3177) -- General: Avoid creating multiple thumbnails [\#3176](https://github.com/pypeclub/OpenPype/pull/3176) -- General/Hiero: better clip duration calculation [\#3169](https://github.com/pypeclub/OpenPype/pull/3169) -- General: Oiio conversion for ffmpeg checks for invalid characters [\#3166](https://github.com/pypeclub/OpenPype/pull/3166) -- Fix for attaching render to subset [\#3164](https://github.com/pypeclub/OpenPype/pull/3164) -- Harmony: fixed missing task name in render instance [\#3163](https://github.com/pypeclub/OpenPype/pull/3163) -- Ftrack: Action delete old versions formatting works [\#3152](https://github.com/pypeclub/OpenPype/pull/3152) -- Deadline: fix the output directory [\#3144](https://github.com/pypeclub/OpenPype/pull/3144) -- General: New Session schema [\#3141](https://github.com/pypeclub/OpenPype/pull/3141) -- General: Missing version on headless mode crash properly [\#3136](https://github.com/pypeclub/OpenPype/pull/3136) -- TVPaint: Composite layers in reversed order [\#3135](https://github.com/pypeclub/OpenPype/pull/3135) -- Nuke: fixing default settings for workfile builder loaders [\#3120](https://github.com/pypeclub/OpenPype/pull/3120) -- Nuke: fix anatomy imageio regex default [\#3119](https://github.com/pypeclub/OpenPype/pull/3119) -- General: Python 3 compatibility in queries [\#3112](https://github.com/pypeclub/OpenPype/pull/3112) -- General: TemplateResult can be copied [\#3099](https://github.com/pypeclub/OpenPype/pull/3099) -- General: Collect loaded versions skips not existing representations [\#3095](https://github.com/pypeclub/OpenPype/pull/3095) -- RoyalRender Control Submission - AVALON\_APP\_NAME default [\#3091](https://github.com/pypeclub/OpenPype/pull/3091) -- Ftrack: Update Create Folders action [\#3089](https://github.com/pypeclub/OpenPype/pull/3089) -- Maya: Collect Render fix any render cameras check [\#3088](https://github.com/pypeclub/OpenPype/pull/3088) -- Project Manager: Avoid unnecessary updates of asset documents [\#3083](https://github.com/pypeclub/OpenPype/pull/3083) -- Standalone publisher: Fix plugins install [\#3077](https://github.com/pypeclub/OpenPype/pull/3077) -- General: Extract review sequence is not converted with same names [\#3076](https://github.com/pypeclub/OpenPype/pull/3076) -- Webpublisher: Use variant value [\#3068](https://github.com/pypeclub/OpenPype/pull/3068) -- Nuke: Add aov matching even for remainder and prerender [\#3060](https://github.com/pypeclub/OpenPype/pull/3060) -- Fix support for Renderman in Maya [\#3006](https://github.com/pypeclub/OpenPype/pull/3006) - -**๐Ÿ”€ Refactored code** - -- Avalon repo removed from Jobs workflow [\#3193](https://github.com/pypeclub/OpenPype/pull/3193) -- General: Remove remaining imports from avalon [\#3130](https://github.com/pypeclub/OpenPype/pull/3130) -- General: Move mongo db logic and remove avalon repository [\#3066](https://github.com/pypeclub/OpenPype/pull/3066) -- General: Move host install [\#3009](https://github.com/pypeclub/OpenPype/pull/3009) - -**Merged pull requests:** - -- Harmony: message length in 21.1 [\#3257](https://github.com/pypeclub/OpenPype/pull/3257) -- Harmony: 21.1 fix [\#3249](https://github.com/pypeclub/OpenPype/pull/3249) -- Maya: added jpg to filter for Image Plane Loader [\#3223](https://github.com/pypeclub/OpenPype/pull/3223) -- Webpublisher: replace space by underscore in subset names [\#3160](https://github.com/pypeclub/OpenPype/pull/3160) -- StandalonePublisher: removed Extract Background plugins [\#3093](https://github.com/pypeclub/OpenPype/pull/3093) -- Nuke: added suspend\_publish knob [\#3078](https://github.com/pypeclub/OpenPype/pull/3078) -- Bump async from 2.6.3 to 2.6.4 in /website [\#3065](https://github.com/pypeclub/OpenPype/pull/3065) -- SiteSync: Download all workfile inputs [\#2966](https://github.com/pypeclub/OpenPype/pull/2966) -- Photoshop: New Publisher [\#2933](https://github.com/pypeclub/OpenPype/pull/2933) -- Bump pillow from 9.0.0 to 9.0.1 [\#2880](https://github.com/pypeclub/OpenPype/pull/2880) -- AfterEffects: Allow configuration of default variant via Settings [\#2856](https://github.com/pypeclub/OpenPype/pull/2856) - -## [3.9.8](https://github.com/pypeclub/OpenPype/tree/3.9.8) (2022-05-19) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.7...3.9.8) - -## [3.9.7](https://github.com/pypeclub/OpenPype/tree/3.9.7) (2022-05-11) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.6...3.9.7) - -## [3.9.6](https://github.com/pypeclub/OpenPype/tree/3.9.6) (2022-05-03) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.5...3.9.6) - -## [3.9.5](https://github.com/pypeclub/OpenPype/tree/3.9.5) (2022-04-25) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.4...3.9.5) - -## [3.9.4](https://github.com/pypeclub/OpenPype/tree/3.9.4) (2022-04-15) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.3...3.9.4) - -### ๐Ÿ“– Documentation - -- Documentation: more info about Tasks [\#3062](https://github.com/pypeclub/OpenPype/pull/3062) -- Documentation: Python requirements to 3.7.9 [\#3035](https://github.com/pypeclub/OpenPype/pull/3035) -- Website Docs: Remove unused pages [\#2974](https://github.com/pypeclub/OpenPype/pull/2974) - -**๐Ÿ†• New features** - -- General: Local overrides for environment variables [\#3045](https://github.com/pypeclub/OpenPype/pull/3045) -- Flame: Flare integration preparation [\#2928](https://github.com/pypeclub/OpenPype/pull/2928) - -**๐Ÿš€ Enhancements** - -- TVPaint: Added init file for worker to triggers missing sound file dialog [\#3053](https://github.com/pypeclub/OpenPype/pull/3053) -- Ftrack: Custom attributes can be filled in slate values [\#3036](https://github.com/pypeclub/OpenPype/pull/3036) -- Resolve environment variable in google drive credential path [\#3008](https://github.com/pypeclub/OpenPype/pull/3008) - -**๐Ÿ› Bug fixes** - -- GitHub: Updated push-protected action in github workflow [\#3064](https://github.com/pypeclub/OpenPype/pull/3064) -- Nuke: Typos in imports from Nuke implementation [\#3061](https://github.com/pypeclub/OpenPype/pull/3061) -- Hotfix: fixing deadline job publishing [\#3059](https://github.com/pypeclub/OpenPype/pull/3059) -- General: Extract Review handle invalid characters for ffmpeg [\#3050](https://github.com/pypeclub/OpenPype/pull/3050) -- Slate Review: Support to keep format on slate concatenation [\#3049](https://github.com/pypeclub/OpenPype/pull/3049) -- Webpublisher: fix processing of workfile [\#3048](https://github.com/pypeclub/OpenPype/pull/3048) -- Ftrack: Integrate ftrack api fix [\#3044](https://github.com/pypeclub/OpenPype/pull/3044) -- Webpublisher - removed wrong hardcoded family [\#3043](https://github.com/pypeclub/OpenPype/pull/3043) -- LibraryLoader: Use current project for asset query in families filter [\#3042](https://github.com/pypeclub/OpenPype/pull/3042) -- SiteSync: Providers ignore that site is disabled [\#3041](https://github.com/pypeclub/OpenPype/pull/3041) -- Unreal: Creator import fixes [\#3040](https://github.com/pypeclub/OpenPype/pull/3040) -- SiteSync: fix transitive alternate sites, fix dropdown in Local Settings [\#3018](https://github.com/pypeclub/OpenPype/pull/3018) -- Maya: invalid review flag on rendered AOVs [\#2915](https://github.com/pypeclub/OpenPype/pull/2915) - -**Merged pull requests:** - -- Deadline: reworked pools assignment [\#3051](https://github.com/pypeclub/OpenPype/pull/3051) -- Houdini: Avoid ImportError on `hdefereval` when Houdini runs without UI [\#2987](https://github.com/pypeclub/OpenPype/pull/2987) - -## [3.9.3](https://github.com/pypeclub/OpenPype/tree/3.9.3) (2022-04-07) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.2...3.9.3) - -### ๐Ÿ“– Documentation - -- Documentation: Added mention of adding My Drive as a root [\#2999](https://github.com/pypeclub/OpenPype/pull/2999) -- Website Docs: Manager Ftrack fix broken links [\#2979](https://github.com/pypeclub/OpenPype/pull/2979) -- Docs: Added MongoDB requirements [\#2951](https://github.com/pypeclub/OpenPype/pull/2951) -- Documentation: New publisher develop docs [\#2896](https://github.com/pypeclub/OpenPype/pull/2896) - -**๐Ÿ†• New features** - -- Ftrack: Add description integrator [\#3027](https://github.com/pypeclub/OpenPype/pull/3027) -- nuke: bypass baking [\#2992](https://github.com/pypeclub/OpenPype/pull/2992) -- Publishing textures for Unreal [\#2988](https://github.com/pypeclub/OpenPype/pull/2988) -- Maya to Unreal: Static and Skeletal Meshes [\#2978](https://github.com/pypeclub/OpenPype/pull/2978) -- Multiverse: Initial Support [\#2908](https://github.com/pypeclub/OpenPype/pull/2908) - -**๐Ÿš€ Enhancements** - -- General: default workfile subset name for workfile [\#3011](https://github.com/pypeclub/OpenPype/pull/3011) -- Ftrack: Add more options for note text of integrate ftrack note [\#3025](https://github.com/pypeclub/OpenPype/pull/3025) -- Console Interpreter: Changed how console splitter size are reused on show [\#3016](https://github.com/pypeclub/OpenPype/pull/3016) -- Deadline: Use more suitable name for sequence review logic [\#3015](https://github.com/pypeclub/OpenPype/pull/3015) -- Nuke: add concurrency attr to deadline job [\#3005](https://github.com/pypeclub/OpenPype/pull/3005) -- Photoshop: create image without instance [\#3001](https://github.com/pypeclub/OpenPype/pull/3001) -- TVPaint: Render scene family [\#3000](https://github.com/pypeclub/OpenPype/pull/3000) -- Deadline: priority configurable in Maya jobs [\#2995](https://github.com/pypeclub/OpenPype/pull/2995) -- Nuke: ReviewDataMov Read RAW attribute [\#2985](https://github.com/pypeclub/OpenPype/pull/2985) -- General: `METADATA_KEYS` constant as `frozenset` for optimal immutable lookup [\#2980](https://github.com/pypeclub/OpenPype/pull/2980) -- General: Tools with host filters [\#2975](https://github.com/pypeclub/OpenPype/pull/2975) -- Hero versions: Use custom templates [\#2967](https://github.com/pypeclub/OpenPype/pull/2967) -- Slack: Added configurable maximum file size of review upload to Slack [\#2945](https://github.com/pypeclub/OpenPype/pull/2945) -- NewPublisher: Prepared implementation of optional pyblish plugin [\#2943](https://github.com/pypeclub/OpenPype/pull/2943) -- TVPaint: Extractor to convert PNG into EXR [\#2942](https://github.com/pypeclub/OpenPype/pull/2942) -- Workfiles tool: Save as published workfiles [\#2937](https://github.com/pypeclub/OpenPype/pull/2937) -- Workfiles: Open published workfiles [\#2925](https://github.com/pypeclub/OpenPype/pull/2925) -- General: Default modules loaded dynamically [\#2923](https://github.com/pypeclub/OpenPype/pull/2923) -- CI: change the version bump logic [\#2919](https://github.com/pypeclub/OpenPype/pull/2919) -- Deadline: Add headless argument [\#2916](https://github.com/pypeclub/OpenPype/pull/2916) -- Nuke: Add no-audio Tag [\#2911](https://github.com/pypeclub/OpenPype/pull/2911) -- Ftrack: Fill workfile in custom attribute [\#2906](https://github.com/pypeclub/OpenPype/pull/2906) -- Nuke: improving readability [\#2903](https://github.com/pypeclub/OpenPype/pull/2903) -- Settings UI: Add simple tooltips for settings entities [\#2901](https://github.com/pypeclub/OpenPype/pull/2901) - -**๐Ÿ› Bug fixes** - -- General: Fix validate asset docs plug-in filename and class name [\#3029](https://github.com/pypeclub/OpenPype/pull/3029) -- Deadline: Fixed default value of use sequence for review [\#3033](https://github.com/pypeclub/OpenPype/pull/3033) -- Settings UI: Version column can be extended so version are visible [\#3032](https://github.com/pypeclub/OpenPype/pull/3032) -- General: Fix import after movements [\#3028](https://github.com/pypeclub/OpenPype/pull/3028) -- Harmony: Added creating subset name for workfile from template [\#3024](https://github.com/pypeclub/OpenPype/pull/3024) -- AfterEffects: Added creating subset name for workfile from template [\#3023](https://github.com/pypeclub/OpenPype/pull/3023) -- General: Add example addons to ignored [\#3022](https://github.com/pypeclub/OpenPype/pull/3022) -- Maya: Remove missing import [\#3017](https://github.com/pypeclub/OpenPype/pull/3017) -- Ftrack: multiple reviewable componets [\#3012](https://github.com/pypeclub/OpenPype/pull/3012) -- Tray publisher: Fixes after code movement [\#3010](https://github.com/pypeclub/OpenPype/pull/3010) -- Hosts: Remove path existence checks in 'add\_implementation\_envs' [\#3004](https://github.com/pypeclub/OpenPype/pull/3004) -- Nuke: fixing unicode type detection in effect loaders [\#3002](https://github.com/pypeclub/OpenPype/pull/3002) -- Fix - remove doubled dot in workfile created from template [\#2998](https://github.com/pypeclub/OpenPype/pull/2998) -- Nuke: removing redundant Ftrack asset when farm publishing [\#2996](https://github.com/pypeclub/OpenPype/pull/2996) -- PS: fix renaming subset incorrectly in PS [\#2991](https://github.com/pypeclub/OpenPype/pull/2991) -- Fix: Disable setuptools auto discovery [\#2990](https://github.com/pypeclub/OpenPype/pull/2990) -- AEL: fix opening existing workfile if no scene opened [\#2989](https://github.com/pypeclub/OpenPype/pull/2989) -- Maya: Don't do hardlinks on windows for look publishing [\#2986](https://github.com/pypeclub/OpenPype/pull/2986) -- Settings UI: Fix version completer on linux [\#2981](https://github.com/pypeclub/OpenPype/pull/2981) -- Photoshop: Fix creation of subset names in PS review and workfile [\#2969](https://github.com/pypeclub/OpenPype/pull/2969) -- Slack: Added default for review\_upload\_limit for Slack [\#2965](https://github.com/pypeclub/OpenPype/pull/2965) -- General: OIIO conversion for ffmeg can handle sequences [\#2958](https://github.com/pypeclub/OpenPype/pull/2958) -- Settings: Conditional dictionary avoid invalid logs [\#2956](https://github.com/pypeclub/OpenPype/pull/2956) -- General: Smaller fixes and typos [\#2950](https://github.com/pypeclub/OpenPype/pull/2950) -- LogViewer: Don't refresh on initialization [\#2949](https://github.com/pypeclub/OpenPype/pull/2949) -- nuke: python3 compatibility issue with `iteritems` [\#2948](https://github.com/pypeclub/OpenPype/pull/2948) -- General: anatomy data with correct task short key [\#2947](https://github.com/pypeclub/OpenPype/pull/2947) -- SceneInventory: Fix imports in UI [\#2944](https://github.com/pypeclub/OpenPype/pull/2944) -- Slack: add generic exception [\#2941](https://github.com/pypeclub/OpenPype/pull/2941) -- General: Python specific vendor paths on env injection [\#2939](https://github.com/pypeclub/OpenPype/pull/2939) -- General: More fail safe delete old versions [\#2936](https://github.com/pypeclub/OpenPype/pull/2936) -- Settings UI: Collapsed of collapsible wrapper works as expected [\#2934](https://github.com/pypeclub/OpenPype/pull/2934) -- Maya: Do not pass `set` to maya commands \(fixes support for older maya versions\) [\#2932](https://github.com/pypeclub/OpenPype/pull/2932) -- General: Don't print log record on OSError [\#2926](https://github.com/pypeclub/OpenPype/pull/2926) -- Hiero: Fix import of 'register\_event\_callback' [\#2924](https://github.com/pypeclub/OpenPype/pull/2924) -- Flame: centos related debugging [\#2922](https://github.com/pypeclub/OpenPype/pull/2922) -- Ftrack: Missing Ftrack id after editorial publish [\#2905](https://github.com/pypeclub/OpenPype/pull/2905) -- AfterEffects: Fix rendering for single frame in DL [\#2875](https://github.com/pypeclub/OpenPype/pull/2875) - -**๐Ÿ”€ Refactored code** - -- General: Move plugins register and discover [\#2935](https://github.com/pypeclub/OpenPype/pull/2935) -- General: Move Attribute Definitions from pipeline [\#2931](https://github.com/pypeclub/OpenPype/pull/2931) -- General: Removed silo references and terminal splash [\#2927](https://github.com/pypeclub/OpenPype/pull/2927) -- General: Move pipeline constants to OpenPype [\#2918](https://github.com/pypeclub/OpenPype/pull/2918) -- General: Move formatting and workfile functions [\#2914](https://github.com/pypeclub/OpenPype/pull/2914) -- General: Move remaining plugins from avalon [\#2912](https://github.com/pypeclub/OpenPype/pull/2912) - -**Merged pull requests:** - -- Maya: Allow to select invalid camera contents if no cameras found [\#3030](https://github.com/pypeclub/OpenPype/pull/3030) -- Bump paramiko from 2.9.2 to 2.10.1 [\#2973](https://github.com/pypeclub/OpenPype/pull/2973) -- Bump minimist from 1.2.5 to 1.2.6 in /website [\#2954](https://github.com/pypeclub/OpenPype/pull/2954) -- Bump node-forge from 1.2.1 to 1.3.0 in /website [\#2953](https://github.com/pypeclub/OpenPype/pull/2953) -- Maya - added transparency into review creator [\#2952](https://github.com/pypeclub/OpenPype/pull/2952) - -## [3.9.2](https://github.com/pypeclub/OpenPype/tree/3.9.2) (2022-04-04) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.1...3.9.2) - -## [3.9.1](https://github.com/pypeclub/OpenPype/tree/3.9.1) (2022-03-18) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.0...3.9.1) - -**๐Ÿš€ Enhancements** - -- General: Change how OPENPYPE\_DEBUG value is handled [\#2907](https://github.com/pypeclub/OpenPype/pull/2907) -- nuke: imageio adding ocio config version 1.2 [\#2897](https://github.com/pypeclub/OpenPype/pull/2897) -- Flame: support for comment with xml attribute overrides [\#2892](https://github.com/pypeclub/OpenPype/pull/2892) -- Nuke: ExtractReviewSlate can handle more codes and profiles [\#2879](https://github.com/pypeclub/OpenPype/pull/2879) -- Flame: sequence used for reference video [\#2869](https://github.com/pypeclub/OpenPype/pull/2869) - -**๐Ÿ› Bug fixes** - -- General: Fix use of Anatomy roots [\#2904](https://github.com/pypeclub/OpenPype/pull/2904) -- Fixing gap detection in extract review [\#2902](https://github.com/pypeclub/OpenPype/pull/2902) -- Pyblish Pype - ensure current state is correct when entering new group order [\#2899](https://github.com/pypeclub/OpenPype/pull/2899) -- SceneInventory: Fix import of load function [\#2894](https://github.com/pypeclub/OpenPype/pull/2894) -- Harmony - fixed creator issue [\#2891](https://github.com/pypeclub/OpenPype/pull/2891) -- General: Remove forgotten use of avalon Creator [\#2885](https://github.com/pypeclub/OpenPype/pull/2885) -- General: Avoid circular import [\#2884](https://github.com/pypeclub/OpenPype/pull/2884) -- Fixes for attaching loaded containers \(\#2837\) [\#2874](https://github.com/pypeclub/OpenPype/pull/2874) -- Maya: Deformer node ids validation plugin [\#2826](https://github.com/pypeclub/OpenPype/pull/2826) -- Flame Babypublisher optimalization [\#2806](https://github.com/pypeclub/OpenPype/pull/2806) -- hotfix: OIIO tool path - add extension on windows [\#2618](https://github.com/pypeclub/OpenPype/pull/2618) - -**๐Ÿ”€ Refactored code** - -- General: Reduce style usage to OpenPype repository [\#2889](https://github.com/pypeclub/OpenPype/pull/2889) -- General: Move loader logic from avalon to openpype [\#2886](https://github.com/pypeclub/OpenPype/pull/2886) - -## [3.9.0](https://github.com/pypeclub/OpenPype/tree/3.9.0) (2022-03-14) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.8.2...3.9.0) - -**Deprecated:** - -- Houdini: Remove unused code [\#2779](https://github.com/pypeclub/OpenPype/pull/2779) -- Loader: Remove default family states for hosts from code [\#2706](https://github.com/pypeclub/OpenPype/pull/2706) -- AssetCreator: Remove the tool [\#2845](https://github.com/pypeclub/OpenPype/pull/2845) - -### ๐Ÿ“– Documentation - -- Documentation: fixed broken links [\#2799](https://github.com/pypeclub/OpenPype/pull/2799) -- Documentation: broken link fix [\#2785](https://github.com/pypeclub/OpenPype/pull/2785) -- Documentation: link fixes [\#2772](https://github.com/pypeclub/OpenPype/pull/2772) -- Update docusaurus to latest version [\#2760](https://github.com/pypeclub/OpenPype/pull/2760) -- Various testing updates [\#2726](https://github.com/pypeclub/OpenPype/pull/2726) -- documentation: add example to `repack-version` command [\#2669](https://github.com/pypeclub/OpenPype/pull/2669) -- Update docusaurus [\#2639](https://github.com/pypeclub/OpenPype/pull/2639) -- Documentation: Fixed relative links [\#2621](https://github.com/pypeclub/OpenPype/pull/2621) -- Documentation: Change Photoshop & AfterEffects plugin path [\#2878](https://github.com/pypeclub/OpenPype/pull/2878) - -**๐Ÿ†• New features** - -- Flame: loading clips to reels [\#2622](https://github.com/pypeclub/OpenPype/pull/2622) -- General: Store settings by OpenPype version [\#2570](https://github.com/pypeclub/OpenPype/pull/2570) - -**๐Ÿš€ Enhancements** - -- New: Validation exceptions [\#2841](https://github.com/pypeclub/OpenPype/pull/2841) -- General: Set context environments for non host applications [\#2803](https://github.com/pypeclub/OpenPype/pull/2803) -- Houdini: Remove duplicate ValidateOutputNode plug-in [\#2780](https://github.com/pypeclub/OpenPype/pull/2780) -- Tray publisher: New Tray Publisher host \(beta\) [\#2778](https://github.com/pypeclub/OpenPype/pull/2778) -- Slack: Added regex for filtering on subset names [\#2775](https://github.com/pypeclub/OpenPype/pull/2775) -- Houdini: Implement Reset Frame Range [\#2770](https://github.com/pypeclub/OpenPype/pull/2770) -- Pyblish Pype: Remove redundant new line in installed fonts printing [\#2758](https://github.com/pypeclub/OpenPype/pull/2758) -- Flame: use Shot Name on segment for asset name [\#2751](https://github.com/pypeclub/OpenPype/pull/2751) -- Flame: adding validator source clip [\#2746](https://github.com/pypeclub/OpenPype/pull/2746) -- Work Files: Preserve subversion comment of current filename by default [\#2734](https://github.com/pypeclub/OpenPype/pull/2734) -- Maya: set Deadline job/batch name to original source workfile name instead of published workfile [\#2733](https://github.com/pypeclub/OpenPype/pull/2733) -- Ftrack: Disable ftrack module by default [\#2732](https://github.com/pypeclub/OpenPype/pull/2732) -- Project Manager: Disable add task, add asset and save button when not in a project [\#2727](https://github.com/pypeclub/OpenPype/pull/2727) -- dropbox handle big file [\#2718](https://github.com/pypeclub/OpenPype/pull/2718) -- Fusion Move PR: Minor tweaks to Fusion integration [\#2716](https://github.com/pypeclub/OpenPype/pull/2716) -- RoyalRender: Minor enhancements [\#2700](https://github.com/pypeclub/OpenPype/pull/2700) -- Nuke: prerender with review knob [\#2691](https://github.com/pypeclub/OpenPype/pull/2691) -- Maya configurable unit validator [\#2680](https://github.com/pypeclub/OpenPype/pull/2680) -- General: Add settings for CleanUpFarm and disable the plugin by default [\#2679](https://github.com/pypeclub/OpenPype/pull/2679) -- Project Manager: Only allow scroll wheel edits when spinbox is active [\#2678](https://github.com/pypeclub/OpenPype/pull/2678) -- Ftrack: Sync description to assets [\#2670](https://github.com/pypeclub/OpenPype/pull/2670) -- Houdini: Moved to OpenPype [\#2658](https://github.com/pypeclub/OpenPype/pull/2658) -- Maya: Move implementation to OpenPype [\#2649](https://github.com/pypeclub/OpenPype/pull/2649) -- General: FFmpeg conversion also check attribute string length [\#2635](https://github.com/pypeclub/OpenPype/pull/2635) -- Houdini: Load Arnold .ass procedurals into Houdini [\#2606](https://github.com/pypeclub/OpenPype/pull/2606) -- Deadline: Simplify GlobalJobPreLoad logic [\#2605](https://github.com/pypeclub/OpenPype/pull/2605) -- Houdini: Implement Arnold .ass standin extraction from Houdini \(also support .ass.gz\) [\#2603](https://github.com/pypeclub/OpenPype/pull/2603) -- New Publisher: New features and preparations for new standalone publisher [\#2556](https://github.com/pypeclub/OpenPype/pull/2556) -- Fix Maya 2022 Python 3 compatibility [\#2445](https://github.com/pypeclub/OpenPype/pull/2445) -- TVPaint: Use new publisher exceptions in validators [\#2435](https://github.com/pypeclub/OpenPype/pull/2435) -- Harmony: Added new style validations for New Publisher [\#2434](https://github.com/pypeclub/OpenPype/pull/2434) -- Aftereffects: New style validations for New publisher [\#2430](https://github.com/pypeclub/OpenPype/pull/2430) -- Farm publishing: New cleanup plugin for Maya renders on farm [\#2390](https://github.com/pypeclub/OpenPype/pull/2390) -- General: Subset name filtering in ExtractReview outpus [\#2872](https://github.com/pypeclub/OpenPype/pull/2872) -- NewPublisher: Descriptions and Icons in creator dialog [\#2867](https://github.com/pypeclub/OpenPype/pull/2867) -- NewPublisher: Changing task on publishing instance [\#2863](https://github.com/pypeclub/OpenPype/pull/2863) -- TrayPublisher: Choose project widget is more clear [\#2859](https://github.com/pypeclub/OpenPype/pull/2859) -- Maya: add loaded containers to published instance [\#2837](https://github.com/pypeclub/OpenPype/pull/2837) -- Ftrack: Can sync fps as string [\#2836](https://github.com/pypeclub/OpenPype/pull/2836) -- General: Custom function for find executable [\#2822](https://github.com/pypeclub/OpenPype/pull/2822) -- General: Color dialog UI fixes [\#2817](https://github.com/pypeclub/OpenPype/pull/2817) -- global: letter box calculated on output as last process [\#2812](https://github.com/pypeclub/OpenPype/pull/2812) -- Nuke: adding Reformat to baking mov plugin [\#2811](https://github.com/pypeclub/OpenPype/pull/2811) -- Manager: Update all to latest button [\#2805](https://github.com/pypeclub/OpenPype/pull/2805) -- Houdini: Move Houdini Save Current File to beginning of ExtractorOrder [\#2747](https://github.com/pypeclub/OpenPype/pull/2747) -- Global: adding studio name/code to anatomy template formatting data [\#2630](https://github.com/pypeclub/OpenPype/pull/2630) - -**๐Ÿ› Bug fixes** - -- Settings UI: Search case sensitivity [\#2810](https://github.com/pypeclub/OpenPype/pull/2810) -- resolve: fixing fusion module loading [\#2802](https://github.com/pypeclub/OpenPype/pull/2802) -- Ftrack: Unset task ids from asset versions before tasks are removed [\#2800](https://github.com/pypeclub/OpenPype/pull/2800) -- Slack: fail gracefully if slack exception [\#2798](https://github.com/pypeclub/OpenPype/pull/2798) -- Flame: Fix version string in default settings [\#2783](https://github.com/pypeclub/OpenPype/pull/2783) -- After Effects: Fix typo in name `afftereffects` -\> `aftereffects` [\#2768](https://github.com/pypeclub/OpenPype/pull/2768) -- Houdini: Fix open last workfile [\#2767](https://github.com/pypeclub/OpenPype/pull/2767) -- Avoid renaming udim indexes [\#2765](https://github.com/pypeclub/OpenPype/pull/2765) -- Maya: Fix `unique_namespace` when in an namespace that is empty [\#2759](https://github.com/pypeclub/OpenPype/pull/2759) -- Loader UI: Fix right click in representation widget [\#2757](https://github.com/pypeclub/OpenPype/pull/2757) -- Harmony: Rendering in Deadline didn't work in other machines than submitter [\#2754](https://github.com/pypeclub/OpenPype/pull/2754) -- Aftereffects 2022 and Deadline [\#2748](https://github.com/pypeclub/OpenPype/pull/2748) -- Flame: bunch of bugs [\#2745](https://github.com/pypeclub/OpenPype/pull/2745) -- Maya: Save current scene on workfile publish [\#2744](https://github.com/pypeclub/OpenPype/pull/2744) -- Version Up: Preserve parts of filename after version number \(like subversion\) on version\_up [\#2741](https://github.com/pypeclub/OpenPype/pull/2741) -- Loader UI: Multiple asset selection and underline colors fixed [\#2731](https://github.com/pypeclub/OpenPype/pull/2731) -- General: Fix loading of unused chars in xml format [\#2729](https://github.com/pypeclub/OpenPype/pull/2729) -- TVPaint: Set objectName with members [\#2725](https://github.com/pypeclub/OpenPype/pull/2725) -- General: Don't use 'objectName' from loaded references [\#2715](https://github.com/pypeclub/OpenPype/pull/2715) -- Settings: Studio Project anatomy is queried using right keys [\#2711](https://github.com/pypeclub/OpenPype/pull/2711) -- Local Settings: Additional applications don't break UI [\#2710](https://github.com/pypeclub/OpenPype/pull/2710) -- Maya: Remove some unused code [\#2709](https://github.com/pypeclub/OpenPype/pull/2709) -- Houdini: Fix refactor of Houdini host move for CreateArnoldAss [\#2704](https://github.com/pypeclub/OpenPype/pull/2704) -- LookAssigner: Fix imports after moving code to OpenPype repository [\#2701](https://github.com/pypeclub/OpenPype/pull/2701) -- Multiple hosts: unify menu style across hosts [\#2693](https://github.com/pypeclub/OpenPype/pull/2693) -- Maya Redshift fixes [\#2692](https://github.com/pypeclub/OpenPype/pull/2692) -- Maya: fix fps validation popup [\#2685](https://github.com/pypeclub/OpenPype/pull/2685) -- Houdini Explicitly collect correct frame name even in case of single frame render when `frameStart` is provided [\#2676](https://github.com/pypeclub/OpenPype/pull/2676) -- hiero: fix effect collector name and order [\#2673](https://github.com/pypeclub/OpenPype/pull/2673) -- Maya: Fix menu callbacks [\#2671](https://github.com/pypeclub/OpenPype/pull/2671) -- hiero: removing obsolete unsupported plugin [\#2667](https://github.com/pypeclub/OpenPype/pull/2667) -- Launcher: Fix access to 'data' attribute on actions [\#2659](https://github.com/pypeclub/OpenPype/pull/2659) -- Maya `vrscene` loader fixes [\#2633](https://github.com/pypeclub/OpenPype/pull/2633) -- Houdini: fix usd family in loader and integrators [\#2631](https://github.com/pypeclub/OpenPype/pull/2631) -- Maya: Add only reference node to look family container like with other families [\#2508](https://github.com/pypeclub/OpenPype/pull/2508) -- General: Missing time function [\#2877](https://github.com/pypeclub/OpenPype/pull/2877) -- Deadline: Fix plugin name for tile assemble [\#2868](https://github.com/pypeclub/OpenPype/pull/2868) -- Nuke: gizmo precollect fix [\#2866](https://github.com/pypeclub/OpenPype/pull/2866) -- General: Fix hardlink for windows [\#2864](https://github.com/pypeclub/OpenPype/pull/2864) -- General: ffmpeg was crashing on slate merge [\#2860](https://github.com/pypeclub/OpenPype/pull/2860) -- WebPublisher: Video file was published with one too many frame [\#2858](https://github.com/pypeclub/OpenPype/pull/2858) -- New Publisher: Error dialog got right styles [\#2857](https://github.com/pypeclub/OpenPype/pull/2857) -- General: Fix getattr clalback on dynamic modules [\#2855](https://github.com/pypeclub/OpenPype/pull/2855) -- Nuke: slate resolution to input video resolution [\#2853](https://github.com/pypeclub/OpenPype/pull/2853) -- WebPublisher: Fix username stored in DB [\#2852](https://github.com/pypeclub/OpenPype/pull/2852) -- WebPublisher: Fix wrong number of frames for video file [\#2851](https://github.com/pypeclub/OpenPype/pull/2851) -- Nuke: Fix family test in validate\_write\_legacy to work with stillImage [\#2847](https://github.com/pypeclub/OpenPype/pull/2847) -- Nuke: fix multiple baking profile farm publishing [\#2842](https://github.com/pypeclub/OpenPype/pull/2842) -- Blender: Fixed parameters for FBX export of the camera [\#2840](https://github.com/pypeclub/OpenPype/pull/2840) -- Maya: Stop creation of reviews for Cryptomattes [\#2832](https://github.com/pypeclub/OpenPype/pull/2832) -- Deadline: Remove recreated event [\#2828](https://github.com/pypeclub/OpenPype/pull/2828) -- Deadline: Added missing events folder [\#2827](https://github.com/pypeclub/OpenPype/pull/2827) -- Settings: Missing document with OP versions may break start of OpenPype [\#2825](https://github.com/pypeclub/OpenPype/pull/2825) -- Deadline: more detailed temp file name for environment json [\#2824](https://github.com/pypeclub/OpenPype/pull/2824) -- General: Host name was formed from obsolete code [\#2821](https://github.com/pypeclub/OpenPype/pull/2821) -- Settings UI: Fix "Apply from" action [\#2820](https://github.com/pypeclub/OpenPype/pull/2820) -- Ftrack: Job killer with missing user [\#2819](https://github.com/pypeclub/OpenPype/pull/2819) -- Nuke: Use AVALON\_APP to get value for "app" key [\#2818](https://github.com/pypeclub/OpenPype/pull/2818) -- StandalonePublisher: use dynamic groups in subset names [\#2816](https://github.com/pypeclub/OpenPype/pull/2816) - -**๐Ÿ”€ Refactored code** - -- Ftrack: Moved module one hierarchy level higher [\#2792](https://github.com/pypeclub/OpenPype/pull/2792) -- SyncServer: Moved module one hierarchy level higher [\#2791](https://github.com/pypeclub/OpenPype/pull/2791) -- Royal render: Move module one hierarchy level higher [\#2790](https://github.com/pypeclub/OpenPype/pull/2790) -- Deadline: Move module one hierarchy level higher [\#2789](https://github.com/pypeclub/OpenPype/pull/2789) -- Refactor: move webserver tool to openpype [\#2876](https://github.com/pypeclub/OpenPype/pull/2876) -- General: Move create logic from avalon to OpenPype [\#2854](https://github.com/pypeclub/OpenPype/pull/2854) -- General: Add vendors from avalon [\#2848](https://github.com/pypeclub/OpenPype/pull/2848) -- General: Basic event system [\#2846](https://github.com/pypeclub/OpenPype/pull/2846) -- General: Move change context functions [\#2839](https://github.com/pypeclub/OpenPype/pull/2839) -- Tools: Don't use avalon tools code [\#2829](https://github.com/pypeclub/OpenPype/pull/2829) -- Move Unreal Implementation to OpenPype [\#2823](https://github.com/pypeclub/OpenPype/pull/2823) -- General: Extract template formatting from anatomy [\#2766](https://github.com/pypeclub/OpenPype/pull/2766) - -**Merged pull requests:** - -- Fusion: Moved implementation into OpenPype [\#2713](https://github.com/pypeclub/OpenPype/pull/2713) -- TVPaint: Plugin build without dependencies [\#2705](https://github.com/pypeclub/OpenPype/pull/2705) -- Webpublisher: Photoshop create a beauty png [\#2689](https://github.com/pypeclub/OpenPype/pull/2689) -- Ftrack: Hierarchical attributes are queried properly [\#2682](https://github.com/pypeclub/OpenPype/pull/2682) -- Maya: Add Validate Frame Range settings [\#2661](https://github.com/pypeclub/OpenPype/pull/2661) -- Harmony: move to Openpype [\#2657](https://github.com/pypeclub/OpenPype/pull/2657) -- Maya: cleanup duplicate rendersetup code [\#2642](https://github.com/pypeclub/OpenPype/pull/2642) -- Deadline: Be able to pass Mongo url to job [\#2616](https://github.com/pypeclub/OpenPype/pull/2616) - -## [3.8.2](https://github.com/pypeclub/OpenPype/tree/3.8.2) (2022-02-07) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.8.1...3.8.2) - -### ๐Ÿ“– Documentation - -- Cosmetics: Fix common typos in openpype/website [\#2617](https://github.com/pypeclub/OpenPype/pull/2617) - -**๐Ÿš€ Enhancements** - -- TVPaint: Image loaders also work on review family [\#2638](https://github.com/pypeclub/OpenPype/pull/2638) -- General: Project backup tools [\#2629](https://github.com/pypeclub/OpenPype/pull/2629) -- nuke: adding clear button to write nodes [\#2627](https://github.com/pypeclub/OpenPype/pull/2627) -- Ftrack: Family to Asset type mapping is in settings [\#2602](https://github.com/pypeclub/OpenPype/pull/2602) -- Nuke: load color space from representation data [\#2576](https://github.com/pypeclub/OpenPype/pull/2576) - -**๐Ÿ› Bug fixes** - -- Fix pulling of cx\_freeze 6.10 [\#2628](https://github.com/pypeclub/OpenPype/pull/2628) -- Global: fix broken otio review extractor [\#2590](https://github.com/pypeclub/OpenPype/pull/2590) - -**Merged pull requests:** - -- WebPublisher: fix instance duplicates [\#2641](https://github.com/pypeclub/OpenPype/pull/2641) -- Fix - safer pulling of task name for webpublishing from PS [\#2613](https://github.com/pypeclub/OpenPype/pull/2613) - -## [3.8.1](https://github.com/pypeclub/OpenPype/tree/3.8.1) (2022-02-01) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.8.0...3.8.1) - -**๐Ÿš€ Enhancements** - -- Webpublisher: Thumbnail extractor [\#2600](https://github.com/pypeclub/OpenPype/pull/2600) -- Loader: Allow to toggle default family filters between "include" or "exclude" filtering [\#2541](https://github.com/pypeclub/OpenPype/pull/2541) -- Launcher: Added context menu to to skip opening last workfile [\#2536](https://github.com/pypeclub/OpenPype/pull/2536) -- Unreal: JSON Layout Loading support [\#2066](https://github.com/pypeclub/OpenPype/pull/2066) - -**๐Ÿ› Bug fixes** - -- Release/3.8.0 [\#2619](https://github.com/pypeclub/OpenPype/pull/2619) -- Settings: Enum does not store empty string if has single item to select [\#2615](https://github.com/pypeclub/OpenPype/pull/2615) -- switch distutils to sysconfig for `get_platform()` [\#2594](https://github.com/pypeclub/OpenPype/pull/2594) -- Fix poetry index and speedcopy update [\#2589](https://github.com/pypeclub/OpenPype/pull/2589) -- Webpublisher: Fix - subset names from processed .psd used wrong value for task [\#2586](https://github.com/pypeclub/OpenPype/pull/2586) -- `vrscene` creator Deadline webservice URL handling [\#2580](https://github.com/pypeclub/OpenPype/pull/2580) -- global: track name was failing if duplicated root word in name [\#2568](https://github.com/pypeclub/OpenPype/pull/2568) -- Validate Maya Rig produces no cycle errors [\#2484](https://github.com/pypeclub/OpenPype/pull/2484) - -**Merged pull requests:** - -- Bump pillow from 8.4.0 to 9.0.0 [\#2595](https://github.com/pypeclub/OpenPype/pull/2595) -- Webpublisher: Skip version collect [\#2591](https://github.com/pypeclub/OpenPype/pull/2591) -- build\(deps\): bump pillow from 8.4.0 to 9.0.0 [\#2523](https://github.com/pypeclub/OpenPype/pull/2523) - -## [3.8.0](https://github.com/pypeclub/OpenPype/tree/3.8.0) (2022-01-24) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.7.0...3.8.0) - -### ๐Ÿ“– Documentation - -- Variable in docs renamed to proper name [\#2546](https://github.com/pypeclub/OpenPype/pull/2546) - -**๐Ÿ†• New features** - -- Flame: extracting segments with trans-coding [\#2547](https://github.com/pypeclub/OpenPype/pull/2547) -- Maya : V-Ray Proxy - load all ABC files via proxy [\#2544](https://github.com/pypeclub/OpenPype/pull/2544) -- Maya to Unreal: Extended static mesh workflow [\#2537](https://github.com/pypeclub/OpenPype/pull/2537) -- Flame: collecting publishable instances [\#2519](https://github.com/pypeclub/OpenPype/pull/2519) -- Flame: create publishable clips [\#2495](https://github.com/pypeclub/OpenPype/pull/2495) -- Flame: OpenTimelineIO Export Modul [\#2398](https://github.com/pypeclub/OpenPype/pull/2398) - -**๐Ÿš€ Enhancements** - -- Webpublisher: Moved error at the beginning of the log [\#2559](https://github.com/pypeclub/OpenPype/pull/2559) -- Ftrack: Use ApplicationManager to get DJV path [\#2558](https://github.com/pypeclub/OpenPype/pull/2558) -- Webpublisher: Added endpoint to reprocess batch through UI [\#2555](https://github.com/pypeclub/OpenPype/pull/2555) -- Settings: PathInput strip passed string [\#2550](https://github.com/pypeclub/OpenPype/pull/2550) -- Global: Exctract Review anatomy fill data with output name [\#2548](https://github.com/pypeclub/OpenPype/pull/2548) -- Cosmetics: Clean up some cosmetics / typos [\#2542](https://github.com/pypeclub/OpenPype/pull/2542) -- General: Validate if current process OpenPype version is requested version [\#2529](https://github.com/pypeclub/OpenPype/pull/2529) -- General: Be able to use anatomy data in ffmpeg output arguments [\#2525](https://github.com/pypeclub/OpenPype/pull/2525) -- Expose toggle publish plug-in settings for Maya Look Shading Engine Naming [\#2521](https://github.com/pypeclub/OpenPype/pull/2521) -- Photoshop: Move implementation to OpenPype [\#2510](https://github.com/pypeclub/OpenPype/pull/2510) -- TimersManager: Move module one hierarchy higher [\#2501](https://github.com/pypeclub/OpenPype/pull/2501) -- Slack: notifications are sent with Openpype logo and bot name [\#2499](https://github.com/pypeclub/OpenPype/pull/2499) -- Slack: Add review to notification message [\#2498](https://github.com/pypeclub/OpenPype/pull/2498) -- Ftrack: Event handlers settings [\#2496](https://github.com/pypeclub/OpenPype/pull/2496) -- Tools: Fix style and modality of errors in loader and creator [\#2489](https://github.com/pypeclub/OpenPype/pull/2489) -- Maya: Collect 'fps' animation data only for "review" instances [\#2486](https://github.com/pypeclub/OpenPype/pull/2486) -- Project Manager: Remove project button cleanup [\#2482](https://github.com/pypeclub/OpenPype/pull/2482) -- Tools: Be able to change models of tasks and assets widgets [\#2475](https://github.com/pypeclub/OpenPype/pull/2475) -- Publish pype: Reduce publish process defering [\#2464](https://github.com/pypeclub/OpenPype/pull/2464) -- Maya: Improve speed of Collect History logic [\#2460](https://github.com/pypeclub/OpenPype/pull/2460) -- Maya: Validate Rig Controllers - fix Error: in script editor [\#2459](https://github.com/pypeclub/OpenPype/pull/2459) -- Maya: Validate NGONs simplify and speed-up [\#2458](https://github.com/pypeclub/OpenPype/pull/2458) -- Maya: Optimize Validate Locked Normals speed for dense polymeshes [\#2457](https://github.com/pypeclub/OpenPype/pull/2457) -- Maya: Refactor missing \_get\_reference\_node method [\#2455](https://github.com/pypeclub/OpenPype/pull/2455) -- Houdini: Remove broken unique name counter [\#2450](https://github.com/pypeclub/OpenPype/pull/2450) -- Maya: Improve lib.polyConstraint performance when Select tool is not the active tool context [\#2447](https://github.com/pypeclub/OpenPype/pull/2447) -- General: Validate third party before build [\#2425](https://github.com/pypeclub/OpenPype/pull/2425) -- Maya : add option to not group reference in ReferenceLoader [\#2383](https://github.com/pypeclub/OpenPype/pull/2383) - -**๐Ÿ› Bug fixes** - -- AfterEffects: Fix - removed obsolete import [\#2577](https://github.com/pypeclub/OpenPype/pull/2577) -- General: OpenPype version updates [\#2575](https://github.com/pypeclub/OpenPype/pull/2575) -- Ftrack: Delete action revision [\#2563](https://github.com/pypeclub/OpenPype/pull/2563) -- Webpublisher: ftrack shows incorrect user names [\#2560](https://github.com/pypeclub/OpenPype/pull/2560) -- General: Do not validate version if build does not support it [\#2557](https://github.com/pypeclub/OpenPype/pull/2557) -- Webpublisher: Fixed progress reporting [\#2553](https://github.com/pypeclub/OpenPype/pull/2553) -- Fix Maya AssProxyLoader version switch [\#2551](https://github.com/pypeclub/OpenPype/pull/2551) -- General: Fix install thread in igniter [\#2549](https://github.com/pypeclub/OpenPype/pull/2549) -- Houdini: vdbcache family preserve frame numbers on publish integration + enable validate version for Houdini [\#2535](https://github.com/pypeclub/OpenPype/pull/2535) -- Maya: Fix Load VDB to V-Ray [\#2533](https://github.com/pypeclub/OpenPype/pull/2533) -- Maya: ReferenceLoader fix not unique group name error for attach to root [\#2532](https://github.com/pypeclub/OpenPype/pull/2532) -- Maya: namespaced context go back to original namespace when started from inside a namespace [\#2531](https://github.com/pypeclub/OpenPype/pull/2531) -- Fix create zip tool - path argument [\#2522](https://github.com/pypeclub/OpenPype/pull/2522) -- Maya: Fix Extract Look with space in names [\#2518](https://github.com/pypeclub/OpenPype/pull/2518) -- Fix published frame content for sequence starting with 0 [\#2513](https://github.com/pypeclub/OpenPype/pull/2513) -- Maya: reset empty string attributes correctly to "" instead of "None" [\#2506](https://github.com/pypeclub/OpenPype/pull/2506) -- Improve FusionPreLaunch hook errors [\#2505](https://github.com/pypeclub/OpenPype/pull/2505) -- General: Settings work if OpenPypeVersion is available [\#2494](https://github.com/pypeclub/OpenPype/pull/2494) -- General: PYTHONPATH may break OpenPype dependencies [\#2493](https://github.com/pypeclub/OpenPype/pull/2493) -- General: Modules import function output fix [\#2492](https://github.com/pypeclub/OpenPype/pull/2492) -- AE: fix hiding of alert window below Publish [\#2491](https://github.com/pypeclub/OpenPype/pull/2491) -- Workfiles tool: Files widget show files on first show [\#2488](https://github.com/pypeclub/OpenPype/pull/2488) -- General: Custom template paths filter fix [\#2483](https://github.com/pypeclub/OpenPype/pull/2483) -- Loader: Remove always on top flag in tray [\#2480](https://github.com/pypeclub/OpenPype/pull/2480) -- General: Anatomy does not return root envs as unicode [\#2465](https://github.com/pypeclub/OpenPype/pull/2465) -- Maya: Validate Shape Zero do not keep fixed geometry vertices selected/active after repair [\#2456](https://github.com/pypeclub/OpenPype/pull/2456) - -**Merged pull requests:** - -- AfterEffects: Move implementation to OpenPype [\#2543](https://github.com/pypeclub/OpenPype/pull/2543) -- Maya: Remove Maya Look Assigner check on startup [\#2540](https://github.com/pypeclub/OpenPype/pull/2540) -- build\(deps\): bump shelljs from 0.8.4 to 0.8.5 in /website [\#2538](https://github.com/pypeclub/OpenPype/pull/2538) -- build\(deps\): bump follow-redirects from 1.14.4 to 1.14.7 in /website [\#2534](https://github.com/pypeclub/OpenPype/pull/2534) -- Nuke: Merge avalon's implementation into OpenPype [\#2514](https://github.com/pypeclub/OpenPype/pull/2514) -- Maya: Vray fix proxies look assignment [\#2392](https://github.com/pypeclub/OpenPype/pull/2392) -- Bump algoliasearch-helper from 3.4.4 to 3.6.2 in /website [\#2297](https://github.com/pypeclub/OpenPype/pull/2297) - -## [3.7.0](https://github.com/pypeclub/OpenPype/tree/3.7.0) (2022-01-04) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...3.7.0) - -**Deprecated:** - -- General: Default modules hierarchy n2 [\#2368](https://github.com/pypeclub/OpenPype/pull/2368) - -### ๐Ÿ“– Documentation - -- docs\[website\]: Add Ellipse Studio \(logo\) as an OpenPype contributor [\#2324](https://github.com/pypeclub/OpenPype/pull/2324) - -**๐Ÿ†• New features** - -- Settings UI use OpenPype styles [\#2296](https://github.com/pypeclub/OpenPype/pull/2296) -- Store typed version dependencies for workfiles [\#2192](https://github.com/pypeclub/OpenPype/pull/2192) -- OpenPypeV3: add key task type, task shortname and user to path templating construction [\#2157](https://github.com/pypeclub/OpenPype/pull/2157) -- Nuke: Alembic model workflow [\#2140](https://github.com/pypeclub/OpenPype/pull/2140) -- TVPaint: Load workfile from published. [\#1980](https://github.com/pypeclub/OpenPype/pull/1980) - -**๐Ÿš€ Enhancements** - -- General: Workdir extra folders [\#2462](https://github.com/pypeclub/OpenPype/pull/2462) -- Photoshop: New style validations for New publisher [\#2429](https://github.com/pypeclub/OpenPype/pull/2429) -- General: Environment variables groups [\#2424](https://github.com/pypeclub/OpenPype/pull/2424) -- Unreal: Dynamic menu created in Python [\#2422](https://github.com/pypeclub/OpenPype/pull/2422) -- Settings UI: Hyperlinks to settings [\#2420](https://github.com/pypeclub/OpenPype/pull/2420) -- Modules: JobQueue module moved one hierarchy level higher [\#2419](https://github.com/pypeclub/OpenPype/pull/2419) -- TimersManager: Start timer post launch hook [\#2418](https://github.com/pypeclub/OpenPype/pull/2418) -- General: Run applications as separate processes under linux [\#2408](https://github.com/pypeclub/OpenPype/pull/2408) -- Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) -- Enhancement: Global cleanup plugin that explicitly remove paths from context [\#2402](https://github.com/pypeclub/OpenPype/pull/2402) -- General: MongoDB ability to specify replica set groups [\#2401](https://github.com/pypeclub/OpenPype/pull/2401) -- Flame: moving `utility_scripts` to api folder also with `scripts` [\#2385](https://github.com/pypeclub/OpenPype/pull/2385) -- Centos 7 dependency compatibility [\#2384](https://github.com/pypeclub/OpenPype/pull/2384) -- Enhancement: Settings: Use project settings values from another project [\#2382](https://github.com/pypeclub/OpenPype/pull/2382) -- Blender 3: Support auto install for new blender version [\#2377](https://github.com/pypeclub/OpenPype/pull/2377) -- Maya add render image path to settings [\#2375](https://github.com/pypeclub/OpenPype/pull/2375) -- Settings: Webpublisher in hosts enum [\#2367](https://github.com/pypeclub/OpenPype/pull/2367) -- Hiero: python3 compatibility [\#2365](https://github.com/pypeclub/OpenPype/pull/2365) -- Burnins: Be able recognize mxf OPAtom format [\#2361](https://github.com/pypeclub/OpenPype/pull/2361) -- Maya: Add is\_static\_image\_plane and is\_in\_all\_views option in imagePlaneLoader [\#2356](https://github.com/pypeclub/OpenPype/pull/2356) -- Local settings: Copyable studio paths [\#2349](https://github.com/pypeclub/OpenPype/pull/2349) -- Assets Widget: Clear model on project change [\#2345](https://github.com/pypeclub/OpenPype/pull/2345) -- General: OpenPype default modules hierarchy [\#2338](https://github.com/pypeclub/OpenPype/pull/2338) -- TVPaint: Move implementation to OpenPype [\#2336](https://github.com/pypeclub/OpenPype/pull/2336) -- General: FFprobe error exception contain original error message [\#2328](https://github.com/pypeclub/OpenPype/pull/2328) -- Resolve: Add experimental button to menu [\#2325](https://github.com/pypeclub/OpenPype/pull/2325) -- Hiero: Add experimental tools action [\#2323](https://github.com/pypeclub/OpenPype/pull/2323) -- Input links: Cleanup and unification of differences [\#2322](https://github.com/pypeclub/OpenPype/pull/2322) -- General: Don't validate vendor bin with executing them [\#2317](https://github.com/pypeclub/OpenPype/pull/2317) -- General: Multilayer EXRs support [\#2315](https://github.com/pypeclub/OpenPype/pull/2315) -- General: Run process log stderr as info log level [\#2309](https://github.com/pypeclub/OpenPype/pull/2309) -- General: Reduce vendor imports [\#2305](https://github.com/pypeclub/OpenPype/pull/2305) -- Tools: Cleanup of unused classes [\#2304](https://github.com/pypeclub/OpenPype/pull/2304) -- Project Manager: Added ability to delete project [\#2298](https://github.com/pypeclub/OpenPype/pull/2298) -- Ftrack: Synchronize input links [\#2287](https://github.com/pypeclub/OpenPype/pull/2287) -- StandalonePublisher: Remove unused plugin ExtractHarmonyZip [\#2277](https://github.com/pypeclub/OpenPype/pull/2277) -- Ftrack: Support multiple reviews [\#2271](https://github.com/pypeclub/OpenPype/pull/2271) -- Ftrack: Remove unused clean component plugin [\#2269](https://github.com/pypeclub/OpenPype/pull/2269) -- Royal Render: Support for rr channels in separate dirs [\#2268](https://github.com/pypeclub/OpenPype/pull/2268) -- Houdini: Add experimental tools action [\#2267](https://github.com/pypeclub/OpenPype/pull/2267) -- Nuke: extract baked review videos presets [\#2248](https://github.com/pypeclub/OpenPype/pull/2248) -- TVPaint: Workers rendering [\#2209](https://github.com/pypeclub/OpenPype/pull/2209) -- OpenPypeV3: Add key parent asset to path templating construction [\#2186](https://github.com/pypeclub/OpenPype/pull/2186) - -**๐Ÿ› Bug fixes** - -- TVPaint: Create render layer dialog is in front [\#2471](https://github.com/pypeclub/OpenPype/pull/2471) -- Short Pyblish plugin path [\#2428](https://github.com/pypeclub/OpenPype/pull/2428) -- PS: Introduced settings for invalid characters to use in ValidateNaming plugin [\#2417](https://github.com/pypeclub/OpenPype/pull/2417) -- Settings UI: Breadcrumbs path does not create new entities [\#2416](https://github.com/pypeclub/OpenPype/pull/2416) -- AfterEffects: Variant 2022 is in defaults but missing in schemas [\#2412](https://github.com/pypeclub/OpenPype/pull/2412) -- Nuke: baking representations was not additive [\#2406](https://github.com/pypeclub/OpenPype/pull/2406) -- General: Fix access to environments from default settings [\#2403](https://github.com/pypeclub/OpenPype/pull/2403) -- Fix: Placeholder Input color set fix [\#2399](https://github.com/pypeclub/OpenPype/pull/2399) -- Settings: Fix state change of wrapper label [\#2396](https://github.com/pypeclub/OpenPype/pull/2396) -- Flame: fix ftrack publisher [\#2381](https://github.com/pypeclub/OpenPype/pull/2381) -- hiero: solve custom ocio path [\#2379](https://github.com/pypeclub/OpenPype/pull/2379) -- hiero: fix workio and flatten [\#2378](https://github.com/pypeclub/OpenPype/pull/2378) -- Nuke: fixing menu re-drawing during context change [\#2374](https://github.com/pypeclub/OpenPype/pull/2374) -- Webpublisher: Fix assignment of families of TVpaint instances [\#2373](https://github.com/pypeclub/OpenPype/pull/2373) -- Nuke: fixing node name based on switched asset name [\#2369](https://github.com/pypeclub/OpenPype/pull/2369) -- JobQueue: Fix loading of settings [\#2362](https://github.com/pypeclub/OpenPype/pull/2362) -- Tools: Placeholder color [\#2359](https://github.com/pypeclub/OpenPype/pull/2359) -- Launcher: Minimize button on MacOs [\#2355](https://github.com/pypeclub/OpenPype/pull/2355) -- StandalonePublisher: Fix import of constant [\#2354](https://github.com/pypeclub/OpenPype/pull/2354) -- Houdini: Fix HDA creation [\#2350](https://github.com/pypeclub/OpenPype/pull/2350) -- Adobe products show issue [\#2347](https://github.com/pypeclub/OpenPype/pull/2347) -- Maya Look Assigner: Fix Python 3 compatibility [\#2343](https://github.com/pypeclub/OpenPype/pull/2343) -- Remove wrongly used host for hook [\#2342](https://github.com/pypeclub/OpenPype/pull/2342) -- Tools: Use Qt context on tools show [\#2340](https://github.com/pypeclub/OpenPype/pull/2340) -- Flame: Fix default argument value in custom dictionary [\#2339](https://github.com/pypeclub/OpenPype/pull/2339) -- Timers Manager: Disable auto stop timer on linux platform [\#2334](https://github.com/pypeclub/OpenPype/pull/2334) -- nuke: bake preset single input exception [\#2331](https://github.com/pypeclub/OpenPype/pull/2331) -- Hiero: fixing multiple templates at a hierarchy parent [\#2330](https://github.com/pypeclub/OpenPype/pull/2330) -- Fix - provider icons are pulled from a folder [\#2326](https://github.com/pypeclub/OpenPype/pull/2326) -- InputLinks: Typo in "inputLinks" key [\#2314](https://github.com/pypeclub/OpenPype/pull/2314) -- Deadline timeout and logging [\#2312](https://github.com/pypeclub/OpenPype/pull/2312) -- nuke: do not multiply representation on class method [\#2311](https://github.com/pypeclub/OpenPype/pull/2311) -- Workfiles tool: Fix task formatting [\#2306](https://github.com/pypeclub/OpenPype/pull/2306) -- Delivery: Fix delivery paths created on windows [\#2302](https://github.com/pypeclub/OpenPype/pull/2302) -- Maya: Deadline - fix limit groups [\#2295](https://github.com/pypeclub/OpenPype/pull/2295) -- Royal Render: Fix plugin order and OpenPype auto-detection [\#2291](https://github.com/pypeclub/OpenPype/pull/2291) -- New Publisher: Fix mapping of indexes [\#2285](https://github.com/pypeclub/OpenPype/pull/2285) -- Alternate site for site sync doesnt work for sequences [\#2284](https://github.com/pypeclub/OpenPype/pull/2284) -- FFmpeg: Execute ffprobe using list of arguments instead of string command [\#2281](https://github.com/pypeclub/OpenPype/pull/2281) -- Nuke: Anatomy fill data use task as dictionary [\#2278](https://github.com/pypeclub/OpenPype/pull/2278) -- Bug: fix variable name \_asset\_id in workfiles application [\#2274](https://github.com/pypeclub/OpenPype/pull/2274) -- Version handling fixes [\#2272](https://github.com/pypeclub/OpenPype/pull/2272) - -**Merged pull requests:** - -- Maya: Replaced PATH usage with vendored oiio path for maketx utility [\#2405](https://github.com/pypeclub/OpenPype/pull/2405) -- \[Fix\]\[MAYA\] Handle message type attribute within CollectLook [\#2394](https://github.com/pypeclub/OpenPype/pull/2394) -- Add validator to check correct version of extension for PS and AE [\#2387](https://github.com/pypeclub/OpenPype/pull/2387) -- Maya: configurable model top level validation [\#2321](https://github.com/pypeclub/OpenPype/pull/2321) -- Create test publish class for After Effects [\#2270](https://github.com/pypeclub/OpenPype/pull/2270) - -## [3.6.4](https://github.com/pypeclub/OpenPype/tree/3.6.4) (2021-11-23) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.3...3.6.4) - -**๐Ÿ› Bug fixes** - -- Nuke: inventory update removes all loaded read nodes [\#2294](https://github.com/pypeclub/OpenPype/pull/2294) - -## [3.6.3](https://github.com/pypeclub/OpenPype/tree/3.6.3) (2021-11-19) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.2...3.6.3) - -**๐Ÿ› Bug fixes** - -- Deadline: Fix publish targets [\#2280](https://github.com/pypeclub/OpenPype/pull/2280) - -## [3.6.2](https://github.com/pypeclub/OpenPype/tree/3.6.2) (2021-11-18) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.1...3.6.2) - -**๐Ÿš€ Enhancements** - -- Tools: Assets widget [\#2265](https://github.com/pypeclub/OpenPype/pull/2265) -- SceneInventory: Choose loader in asset switcher [\#2262](https://github.com/pypeclub/OpenPype/pull/2262) -- Style: New fonts in OpenPype style [\#2256](https://github.com/pypeclub/OpenPype/pull/2256) -- Tools: SceneInventory in OpenPype [\#2255](https://github.com/pypeclub/OpenPype/pull/2255) -- Tools: Tasks widget [\#2251](https://github.com/pypeclub/OpenPype/pull/2251) -- Tools: Creator in OpenPype [\#2244](https://github.com/pypeclub/OpenPype/pull/2244) -- Added endpoint for configured extensions [\#2221](https://github.com/pypeclub/OpenPype/pull/2221) - -**๐Ÿ› Bug fixes** - -- Tools: Parenting of tools in Nuke and Hiero [\#2266](https://github.com/pypeclub/OpenPype/pull/2266) -- limiting validator to specific editorial hosts [\#2264](https://github.com/pypeclub/OpenPype/pull/2264) -- Tools: Select Context dialog attribute fix [\#2261](https://github.com/pypeclub/OpenPype/pull/2261) -- Maya: Render publishing fails on linux [\#2260](https://github.com/pypeclub/OpenPype/pull/2260) -- LookAssigner: Fix tool reopen [\#2259](https://github.com/pypeclub/OpenPype/pull/2259) -- Standalone: editorial not publishing thumbnails on all subsets [\#2258](https://github.com/pypeclub/OpenPype/pull/2258) -- Burnins: Support mxf metadata [\#2247](https://github.com/pypeclub/OpenPype/pull/2247) -- Maya: Support for configurable AOV separator characters [\#2197](https://github.com/pypeclub/OpenPype/pull/2197) -- Maya: texture colorspace modes in looks [\#2195](https://github.com/pypeclub/OpenPype/pull/2195) - -## [3.6.1](https://github.com/pypeclub/OpenPype/tree/3.6.1) (2021-11-16) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.0...3.6.1) - -**๐Ÿ› Bug fixes** - -- Loader doesn't allow changing of version before loading [\#2254](https://github.com/pypeclub/OpenPype/pull/2254) - -## [3.6.0](https://github.com/pypeclub/OpenPype/tree/3.6.0) (2021-11-15) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.5.0...3.6.0) - -### ๐Ÿ“– Documentation - -- Add alternative sites for Site Sync [\#2206](https://github.com/pypeclub/OpenPype/pull/2206) -- Add command line way of running site sync server [\#2188](https://github.com/pypeclub/OpenPype/pull/2188) - -**๐Ÿ†• New features** - -- Add validate active site button to sync queue on a project [\#2176](https://github.com/pypeclub/OpenPype/pull/2176) -- Maya : Colorspace configuration [\#2170](https://github.com/pypeclub/OpenPype/pull/2170) -- Blender: Added support for audio [\#2168](https://github.com/pypeclub/OpenPype/pull/2168) -- Flame: a host basic integration [\#2165](https://github.com/pypeclub/OpenPype/pull/2165) -- Houdini: simple HDA workflow [\#2072](https://github.com/pypeclub/OpenPype/pull/2072) -- Basic Royal Render Integration โœจ [\#2061](https://github.com/pypeclub/OpenPype/pull/2061) -- Camera handling between Blender and Unreal [\#1988](https://github.com/pypeclub/OpenPype/pull/1988) -- switch PyQt5 for PySide2 [\#1744](https://github.com/pypeclub/OpenPype/pull/1744) - -**๐Ÿš€ Enhancements** - -- Tools: Subset manager in OpenPype [\#2243](https://github.com/pypeclub/OpenPype/pull/2243) -- General: Skip module directories without init file [\#2239](https://github.com/pypeclub/OpenPype/pull/2239) -- General: Static interfaces [\#2238](https://github.com/pypeclub/OpenPype/pull/2238) -- Style: Fix transparent image in style [\#2235](https://github.com/pypeclub/OpenPype/pull/2235) -- Add a "following workfile versioning" option on publish [\#2225](https://github.com/pypeclub/OpenPype/pull/2225) -- Modules: Module can add cli commands [\#2224](https://github.com/pypeclub/OpenPype/pull/2224) -- Webpublisher: Separate webpublisher logic [\#2222](https://github.com/pypeclub/OpenPype/pull/2222) -- Add both side availability on Site Sync sites to Loader [\#2220](https://github.com/pypeclub/OpenPype/pull/2220) -- Tools: Center loader and library loader on show [\#2219](https://github.com/pypeclub/OpenPype/pull/2219) -- Maya : Validate shape zero [\#2212](https://github.com/pypeclub/OpenPype/pull/2212) -- Maya : validate unique names [\#2211](https://github.com/pypeclub/OpenPype/pull/2211) -- Tools: OpenPype stylesheet in workfiles tool [\#2208](https://github.com/pypeclub/OpenPype/pull/2208) -- Ftrack: Replace Queue with deque in event handlers logic [\#2204](https://github.com/pypeclub/OpenPype/pull/2204) -- Tools: New select context dialog [\#2200](https://github.com/pypeclub/OpenPype/pull/2200) -- Maya : Validate mesh ngons [\#2199](https://github.com/pypeclub/OpenPype/pull/2199) -- Dirmap in Nuke [\#2198](https://github.com/pypeclub/OpenPype/pull/2198) -- Delivery: Check 'frame' key in template for sequence delivery [\#2196](https://github.com/pypeclub/OpenPype/pull/2196) -- Settings: Site sync project settings improvement [\#2193](https://github.com/pypeclub/OpenPype/pull/2193) -- Usage of tools code [\#2185](https://github.com/pypeclub/OpenPype/pull/2185) -- Settings: Dictionary based on project roots [\#2184](https://github.com/pypeclub/OpenPype/pull/2184) -- Subset name: Be able to pass asset document to get subset name [\#2179](https://github.com/pypeclub/OpenPype/pull/2179) -- Tools: Experimental tools [\#2167](https://github.com/pypeclub/OpenPype/pull/2167) -- Loader: Refactor and use OpenPype stylesheets [\#2166](https://github.com/pypeclub/OpenPype/pull/2166) -- Add loader for linked smart objects in photoshop [\#2149](https://github.com/pypeclub/OpenPype/pull/2149) -- Burnins: DNxHD profiles handling [\#2142](https://github.com/pypeclub/OpenPype/pull/2142) -- Tools: Single access point for host tools [\#2139](https://github.com/pypeclub/OpenPype/pull/2139) - -**๐Ÿ› Bug fixes** - -- Ftrack: Sync project ftrack id cache issue [\#2250](https://github.com/pypeclub/OpenPype/pull/2250) -- Ftrack: Session creation and Prepare project [\#2245](https://github.com/pypeclub/OpenPype/pull/2245) -- Added queue for studio processing in PS [\#2237](https://github.com/pypeclub/OpenPype/pull/2237) -- Python 2: Unicode to string conversion [\#2236](https://github.com/pypeclub/OpenPype/pull/2236) -- Fix - enum for color coding in PS [\#2234](https://github.com/pypeclub/OpenPype/pull/2234) -- Pyblish Tool: Fix targets handling [\#2232](https://github.com/pypeclub/OpenPype/pull/2232) -- Ftrack: Base event fix of 'get\_project\_from\_entity' method [\#2214](https://github.com/pypeclub/OpenPype/pull/2214) -- Maya : multiple subsets review broken [\#2210](https://github.com/pypeclub/OpenPype/pull/2210) -- Fix - different command used for Linux and Mac OS [\#2207](https://github.com/pypeclub/OpenPype/pull/2207) -- Tools: Workfiles tool don't use avalon widgets [\#2205](https://github.com/pypeclub/OpenPype/pull/2205) -- Ftrack: Fill missing ftrack id on mongo project [\#2203](https://github.com/pypeclub/OpenPype/pull/2203) -- Project Manager: Fix copying of tasks [\#2191](https://github.com/pypeclub/OpenPype/pull/2191) -- StandalonePublisher: Source validator don't expect representations [\#2190](https://github.com/pypeclub/OpenPype/pull/2190) -- Blender: Fix trying to pack an image when the shader node has no texture [\#2183](https://github.com/pypeclub/OpenPype/pull/2183) -- Maya: review viewport settings [\#2177](https://github.com/pypeclub/OpenPype/pull/2177) -- MacOS: Launching of applications may cause Permissions error [\#2175](https://github.com/pypeclub/OpenPype/pull/2175) -- Maya: Aspect ratio [\#2174](https://github.com/pypeclub/OpenPype/pull/2174) -- Blender: Fix 'Deselect All' with object not in 'Object Mode' [\#2163](https://github.com/pypeclub/OpenPype/pull/2163) -- Tools: Stylesheets are applied after tool show [\#2161](https://github.com/pypeclub/OpenPype/pull/2161) -- Maya: Collect render - fix UNC path support ๐Ÿ› [\#2158](https://github.com/pypeclub/OpenPype/pull/2158) -- Maya: Fix hotbox broken by scriptsmenu [\#2151](https://github.com/pypeclub/OpenPype/pull/2151) -- Ftrack: Ignore save warnings exception in Prepare project action [\#2150](https://github.com/pypeclub/OpenPype/pull/2150) -- Loader thumbnails with smooth edges [\#2147](https://github.com/pypeclub/OpenPype/pull/2147) -- Added validator for source files for Standalone Publisher [\#2138](https://github.com/pypeclub/OpenPype/pull/2138) - -**Merged pull requests:** - -- Bump pillow from 8.2.0 to 8.3.2 [\#2162](https://github.com/pypeclub/OpenPype/pull/2162) -- Bump axios from 0.21.1 to 0.21.4 in /website [\#2059](https://github.com/pypeclub/OpenPype/pull/2059) - -## [3.5.0](https://github.com/pypeclub/OpenPype/tree/3.5.0) (2021-10-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.4.1...3.5.0) - -**Deprecated:** - -- Maya: Change mayaAscii family to mayaScene [\#2106](https://github.com/pypeclub/OpenPype/pull/2106) - -**๐Ÿ†• New features** - -- Added project and task into context change message in Maya [\#2131](https://github.com/pypeclub/OpenPype/pull/2131) -- Add ExtractBurnin to photoshop review [\#2124](https://github.com/pypeclub/OpenPype/pull/2124) -- PYPE-1218 - changed namespace to contain subset name in Maya [\#2114](https://github.com/pypeclub/OpenPype/pull/2114) -- Added running configurable disk mapping command before start of OP [\#2091](https://github.com/pypeclub/OpenPype/pull/2091) -- SFTP provider [\#2073](https://github.com/pypeclub/OpenPype/pull/2073) -- Maya: Validate setdress top group [\#2068](https://github.com/pypeclub/OpenPype/pull/2068) -- Maya: Enable publishing render attrib sets \(e.g. V-Ray Displacement\) with model [\#1955](https://github.com/pypeclub/OpenPype/pull/1955) - -**๐Ÿš€ Enhancements** - -- Maya: make rig validators configurable in settings [\#2137](https://github.com/pypeclub/OpenPype/pull/2137) -- Settings: Updated readme for entity types in settings [\#2132](https://github.com/pypeclub/OpenPype/pull/2132) -- Nuke: unified clip loader [\#2128](https://github.com/pypeclub/OpenPype/pull/2128) -- Settings UI: Project model refreshing and sorting [\#2104](https://github.com/pypeclub/OpenPype/pull/2104) -- Create Read From Rendered - Disable Relative paths by default [\#2093](https://github.com/pypeclub/OpenPype/pull/2093) -- Added choosing different dirmap mapping if workfile synched locally [\#2088](https://github.com/pypeclub/OpenPype/pull/2088) -- General: Remove IdleManager module [\#2084](https://github.com/pypeclub/OpenPype/pull/2084) -- Tray UI: Message box about missing settings defaults [\#2080](https://github.com/pypeclub/OpenPype/pull/2080) -- Tray UI: Show menu where first click happened [\#2079](https://github.com/pypeclub/OpenPype/pull/2079) -- Global: add global validators to settings [\#2078](https://github.com/pypeclub/OpenPype/pull/2078) -- Use CRF for burnin when available [\#2070](https://github.com/pypeclub/OpenPype/pull/2070) -- Project manager: Filter first item after selection of project [\#2069](https://github.com/pypeclub/OpenPype/pull/2069) -- Nuke: Adding `still` image family workflow [\#2064](https://github.com/pypeclub/OpenPype/pull/2064) -- Maya: validate authorized loaded plugins [\#2062](https://github.com/pypeclub/OpenPype/pull/2062) -- Tools: add support for pyenv on windows [\#2051](https://github.com/pypeclub/OpenPype/pull/2051) -- SyncServer: Dropbox Provider [\#1979](https://github.com/pypeclub/OpenPype/pull/1979) -- Burnin: Get data from context with defined keys. [\#1897](https://github.com/pypeclub/OpenPype/pull/1897) -- Timers manager: Get task time [\#1896](https://github.com/pypeclub/OpenPype/pull/1896) -- TVPaint: Option to stop timer on application exit. [\#1887](https://github.com/pypeclub/OpenPype/pull/1887) - -**๐Ÿ› Bug fixes** - -- Maya: fix model publishing [\#2130](https://github.com/pypeclub/OpenPype/pull/2130) -- Fix - oiiotool wasn't recognized even if present [\#2129](https://github.com/pypeclub/OpenPype/pull/2129) -- General: Disk mapping group [\#2120](https://github.com/pypeclub/OpenPype/pull/2120) -- Hiero: publishing effect first time makes wrong resources path [\#2115](https://github.com/pypeclub/OpenPype/pull/2115) -- Add startup script for Houdini Core. [\#2110](https://github.com/pypeclub/OpenPype/pull/2110) -- TVPaint: Behavior name of loop also accept repeat [\#2109](https://github.com/pypeclub/OpenPype/pull/2109) -- Ftrack: Project settings save custom attributes skip unknown attributes [\#2103](https://github.com/pypeclub/OpenPype/pull/2103) -- Blender: Fix NoneType error when animation\_data is missing for a rig [\#2101](https://github.com/pypeclub/OpenPype/pull/2101) -- Fix broken import in sftp provider [\#2100](https://github.com/pypeclub/OpenPype/pull/2100) -- Global: Fix docstring on publish plugin extract review [\#2097](https://github.com/pypeclub/OpenPype/pull/2097) -- Delivery Action Files Sequence fix [\#2096](https://github.com/pypeclub/OpenPype/pull/2096) -- General: Cloud mongo ca certificate issue [\#2095](https://github.com/pypeclub/OpenPype/pull/2095) -- TVPaint: Creator use context from workfile [\#2087](https://github.com/pypeclub/OpenPype/pull/2087) -- Blender: fix texture missing when publishing blend files [\#2085](https://github.com/pypeclub/OpenPype/pull/2085) -- General: Startup validations oiio tool path fix on linux [\#2083](https://github.com/pypeclub/OpenPype/pull/2083) -- Deadline: Collect deadline server does not check existence of deadline key [\#2082](https://github.com/pypeclub/OpenPype/pull/2082) -- Blender: fixed Curves with modifiers in Rigs [\#2081](https://github.com/pypeclub/OpenPype/pull/2081) -- Nuke UI scaling [\#2077](https://github.com/pypeclub/OpenPype/pull/2077) -- Maya: Fix multi-camera renders [\#2065](https://github.com/pypeclub/OpenPype/pull/2065) -- Fix Sync Queue when project disabled [\#2063](https://github.com/pypeclub/OpenPype/pull/2063) - -**Merged pull requests:** - -- Bump pywin32 from 300 to 301 [\#2086](https://github.com/pypeclub/OpenPype/pull/2086) - -## [3.4.1](https://github.com/pypeclub/OpenPype/tree/3.4.1) (2021-09-23) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.4.0...3.4.1) - -**๐Ÿ†• New features** - -- Settings: Flag project as deactivated and hide from tools' view [\#2008](https://github.com/pypeclub/OpenPype/pull/2008) - -**๐Ÿš€ Enhancements** - -- General: Startup validations [\#2054](https://github.com/pypeclub/OpenPype/pull/2054) -- Nuke: proxy mode validator [\#2052](https://github.com/pypeclub/OpenPype/pull/2052) -- Ftrack: Removed ftrack interface [\#2049](https://github.com/pypeclub/OpenPype/pull/2049) -- Settings UI: Deffered set value on entity [\#2044](https://github.com/pypeclub/OpenPype/pull/2044) -- Loader: Families filtering [\#2043](https://github.com/pypeclub/OpenPype/pull/2043) -- Settings UI: Project view enhancements [\#2042](https://github.com/pypeclub/OpenPype/pull/2042) -- Settings for Nuke IncrementScriptVersion [\#2039](https://github.com/pypeclub/OpenPype/pull/2039) -- Loader & Library loader: Use tools from OpenPype [\#2038](https://github.com/pypeclub/OpenPype/pull/2038) -- Adding predefined project folders creation in PM [\#2030](https://github.com/pypeclub/OpenPype/pull/2030) -- WebserverModule: Removed interface of webserver module [\#2028](https://github.com/pypeclub/OpenPype/pull/2028) -- TimersManager: Removed interface of timers manager [\#2024](https://github.com/pypeclub/OpenPype/pull/2024) -- Feature Maya import asset from scene inventory [\#2018](https://github.com/pypeclub/OpenPype/pull/2018) - -**๐Ÿ› Bug fixes** - -- Timers manger: Typo fix [\#2058](https://github.com/pypeclub/OpenPype/pull/2058) -- Hiero: Editorial fixes [\#2057](https://github.com/pypeclub/OpenPype/pull/2057) -- Differentiate jpg sequences from thumbnail [\#2056](https://github.com/pypeclub/OpenPype/pull/2056) -- FFmpeg: Split command to list does not work [\#2046](https://github.com/pypeclub/OpenPype/pull/2046) -- Removed shell flag in subprocess call [\#2045](https://github.com/pypeclub/OpenPype/pull/2045) - -**Merged pull requests:** - -- Bump prismjs from 1.24.0 to 1.25.0 in /website [\#2050](https://github.com/pypeclub/OpenPype/pull/2050) - -## [3.4.0](https://github.com/pypeclub/OpenPype/tree/3.4.0) (2021-09-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.3.1...3.4.0) - -### ๐Ÿ“– Documentation - -- Documentation: Ftrack launch argsuments update [\#2014](https://github.com/pypeclub/OpenPype/pull/2014) -- Nuke Quick Start / Tutorial [\#1952](https://github.com/pypeclub/OpenPype/pull/1952) -- Houdini: add Camera, Point Cache, Composite, Redshift ROP and VDB Cache support [\#1821](https://github.com/pypeclub/OpenPype/pull/1821) - -**๐Ÿ†• New features** - -- Nuke: Compatibility with Nuke 13 [\#2003](https://github.com/pypeclub/OpenPype/pull/2003) -- Maya: Add Xgen family support [\#1947](https://github.com/pypeclub/OpenPype/pull/1947) -- Feature/webpublisher backend [\#1876](https://github.com/pypeclub/OpenPype/pull/1876) -- Blender: Improved assets handling [\#1615](https://github.com/pypeclub/OpenPype/pull/1615) - -**๐Ÿš€ Enhancements** - -- Added possibility to configure of synchronization of workfile versionโ€ฆ [\#2041](https://github.com/pypeclub/OpenPype/pull/2041) -- General: Task types in profiles [\#2036](https://github.com/pypeclub/OpenPype/pull/2036) -- Console interpreter: Handle invalid sizes on initialization [\#2022](https://github.com/pypeclub/OpenPype/pull/2022) -- Ftrack: Show OpenPype versions in event server status [\#2019](https://github.com/pypeclub/OpenPype/pull/2019) -- General: Staging icon [\#2017](https://github.com/pypeclub/OpenPype/pull/2017) -- Ftrack: Sync to avalon actions have jobs [\#2015](https://github.com/pypeclub/OpenPype/pull/2015) -- Modules: Connect method is not required [\#2009](https://github.com/pypeclub/OpenPype/pull/2009) -- Settings UI: Number with configurable steps [\#2001](https://github.com/pypeclub/OpenPype/pull/2001) -- Moving project folder structure creation out of ftrack module \#1989 [\#1996](https://github.com/pypeclub/OpenPype/pull/1996) -- Configurable items for providers without Settings [\#1987](https://github.com/pypeclub/OpenPype/pull/1987) -- Global: Example addons [\#1986](https://github.com/pypeclub/OpenPype/pull/1986) -- Standalone Publisher: Extract harmony zip handle workfile template [\#1982](https://github.com/pypeclub/OpenPype/pull/1982) -- Settings UI: Number sliders [\#1978](https://github.com/pypeclub/OpenPype/pull/1978) -- Workfiles: Support more workfile templates [\#1966](https://github.com/pypeclub/OpenPype/pull/1966) -- Launcher: Fix crashes on action click [\#1964](https://github.com/pypeclub/OpenPype/pull/1964) -- Settings: Minor fixes in UI and missing default values [\#1963](https://github.com/pypeclub/OpenPype/pull/1963) -- Blender: Toggle system console works on windows [\#1962](https://github.com/pypeclub/OpenPype/pull/1962) -- Global: Settings defined by Addons/Modules [\#1959](https://github.com/pypeclub/OpenPype/pull/1959) -- CI: change release numbering triggers [\#1954](https://github.com/pypeclub/OpenPype/pull/1954) -- Global: Avalon Host name collector [\#1949](https://github.com/pypeclub/OpenPype/pull/1949) -- Global: Define hosts in CollectSceneVersion [\#1948](https://github.com/pypeclub/OpenPype/pull/1948) -- Add face sets to exported alembics [\#1942](https://github.com/pypeclub/OpenPype/pull/1942) -- OpenPype: Add version validation and `--headless` mode and update progress ๐Ÿ”„ [\#1939](https://github.com/pypeclub/OpenPype/pull/1939) -- \#1894 - adds host to template\_name\_profiles for filtering [\#1915](https://github.com/pypeclub/OpenPype/pull/1915) -- Environments: Tool environments in alphabetical order [\#1910](https://github.com/pypeclub/OpenPype/pull/1910) -- Disregard publishing time. [\#1888](https://github.com/pypeclub/OpenPype/pull/1888) -- Dynamic modules [\#1872](https://github.com/pypeclub/OpenPype/pull/1872) - -**๐Ÿ› Bug fixes** - -- Workfiles tool: Task selection [\#2040](https://github.com/pypeclub/OpenPype/pull/2040) -- Ftrack: Delete old versions missing settings key [\#2037](https://github.com/pypeclub/OpenPype/pull/2037) -- Nuke: typo on a button [\#2034](https://github.com/pypeclub/OpenPype/pull/2034) -- Hiero: Fix "none" named tags [\#2033](https://github.com/pypeclub/OpenPype/pull/2033) -- FFmpeg: Subprocess arguments as list [\#2032](https://github.com/pypeclub/OpenPype/pull/2032) -- General: Fix Python 2 breaking line [\#2016](https://github.com/pypeclub/OpenPype/pull/2016) -- Bugfix/webpublisher task type [\#2006](https://github.com/pypeclub/OpenPype/pull/2006) -- Nuke thumbnails generated from middle of the sequence [\#1992](https://github.com/pypeclub/OpenPype/pull/1992) -- Nuke: last version from path gets correct version [\#1990](https://github.com/pypeclub/OpenPype/pull/1990) -- nuke, resolve, hiero: precollector order lest then 0.5 [\#1984](https://github.com/pypeclub/OpenPype/pull/1984) -- Last workfile with multiple work templates [\#1981](https://github.com/pypeclub/OpenPype/pull/1981) -- Collectors order [\#1977](https://github.com/pypeclub/OpenPype/pull/1977) -- Stop timer was within validator order range. [\#1975](https://github.com/pypeclub/OpenPype/pull/1975) -- Ftrack: arrow submodule has https url source [\#1974](https://github.com/pypeclub/OpenPype/pull/1974) -- Ftrack: Fix hosts attribute in collect ftrack username [\#1972](https://github.com/pypeclub/OpenPype/pull/1972) -- Deadline: Houdini plugins in different hierarchy [\#1970](https://github.com/pypeclub/OpenPype/pull/1970) -- Removed deprecated submodules [\#1967](https://github.com/pypeclub/OpenPype/pull/1967) -- Global: ExtractJpeg can handle filepaths with spaces [\#1961](https://github.com/pypeclub/OpenPype/pull/1961) -- Resolve path when adding to zip [\#1960](https://github.com/pypeclub/OpenPype/pull/1960) - -**Merged pull requests:** - -- Bump url-parse from 1.5.1 to 1.5.3 in /website [\#1958](https://github.com/pypeclub/OpenPype/pull/1958) -- Bump path-parse from 1.0.6 to 1.0.7 in /website [\#1933](https://github.com/pypeclub/OpenPype/pull/1933) - -## [3.3.1](https://github.com/pypeclub/OpenPype/tree/3.3.1) (2021-08-20) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.3.0...3.3.1) - -**๐Ÿ› Bug fixes** - -- TVPaint: Fixed rendered frame indexes [\#1946](https://github.com/pypeclub/OpenPype/pull/1946) -- Maya: Menu actions fix [\#1945](https://github.com/pypeclub/OpenPype/pull/1945) -- standalone: editorial shared object problem [\#1941](https://github.com/pypeclub/OpenPype/pull/1941) -- Bugfix nuke deadline app name [\#1928](https://github.com/pypeclub/OpenPype/pull/1928) - -## [3.3.0](https://github.com/pypeclub/OpenPype/tree/3.3.0) (2021-08-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.2.0...3.3.0) - -### ๐Ÿ“– Documentation - -- Standalone Publish of textures family [\#1834](https://github.com/pypeclub/OpenPype/pull/1834) - -**๐Ÿ†• New features** - -- Settings UI: Breadcrumbs in settings [\#1932](https://github.com/pypeclub/OpenPype/pull/1932) -- Maya: Scene patching ๐Ÿฉนon submission to Deadline [\#1923](https://github.com/pypeclub/OpenPype/pull/1923) -- Feature AE local render [\#1901](https://github.com/pypeclub/OpenPype/pull/1901) - -**๐Ÿš€ Enhancements** - -- Python console interpreter [\#1940](https://github.com/pypeclub/OpenPype/pull/1940) -- Global: Updated logos and Default settings [\#1927](https://github.com/pypeclub/OpenPype/pull/1927) -- Check for missing โœจ Python when using `pyenv` [\#1925](https://github.com/pypeclub/OpenPype/pull/1925) -- Settings: Default values for enum [\#1920](https://github.com/pypeclub/OpenPype/pull/1920) -- Settings UI: Modifiable dict view enhance [\#1919](https://github.com/pypeclub/OpenPype/pull/1919) -- submodules: avalon-core update [\#1911](https://github.com/pypeclub/OpenPype/pull/1911) -- Ftrack: Where I run action enhancement [\#1900](https://github.com/pypeclub/OpenPype/pull/1900) -- Ftrack: Private project server actions [\#1899](https://github.com/pypeclub/OpenPype/pull/1899) -- Support nested studio plugins paths. [\#1898](https://github.com/pypeclub/OpenPype/pull/1898) -- Settings: global validators with options [\#1892](https://github.com/pypeclub/OpenPype/pull/1892) -- Settings: Conditional dict enum positioning [\#1891](https://github.com/pypeclub/OpenPype/pull/1891) -- Expose stop timer through rest api. [\#1886](https://github.com/pypeclub/OpenPype/pull/1886) -- TVPaint: Increment workfile [\#1885](https://github.com/pypeclub/OpenPype/pull/1885) -- Allow Multiple Notes to run on tasks. [\#1882](https://github.com/pypeclub/OpenPype/pull/1882) -- Prepare for pyside2 [\#1869](https://github.com/pypeclub/OpenPype/pull/1869) -- Filter hosts in settings host-enum [\#1868](https://github.com/pypeclub/OpenPype/pull/1868) -- Local actions with process identifier [\#1867](https://github.com/pypeclub/OpenPype/pull/1867) -- Workfile tool start at host launch support [\#1865](https://github.com/pypeclub/OpenPype/pull/1865) -- Anatomy schema validation [\#1864](https://github.com/pypeclub/OpenPype/pull/1864) -- Ftrack prepare project structure [\#1861](https://github.com/pypeclub/OpenPype/pull/1861) -- Maya: support for configurable `dirmap` ๐Ÿ—บ๏ธ [\#1859](https://github.com/pypeclub/OpenPype/pull/1859) -- Independent general environments [\#1853](https://github.com/pypeclub/OpenPype/pull/1853) -- TVPaint Start Frame [\#1844](https://github.com/pypeclub/OpenPype/pull/1844) -- Ftrack push attributes action adds traceback to job [\#1843](https://github.com/pypeclub/OpenPype/pull/1843) -- Prepare project action enhance [\#1838](https://github.com/pypeclub/OpenPype/pull/1838) -- nuke: settings create missing default subsets [\#1829](https://github.com/pypeclub/OpenPype/pull/1829) -- Update poetry lock [\#1823](https://github.com/pypeclub/OpenPype/pull/1823) -- Settings: settings for plugins [\#1819](https://github.com/pypeclub/OpenPype/pull/1819) -- Settings list can use template or schema as object type [\#1815](https://github.com/pypeclub/OpenPype/pull/1815) -- Maya: Deadline custom settings [\#1797](https://github.com/pypeclub/OpenPype/pull/1797) -- Maya: Shader name validation [\#1762](https://github.com/pypeclub/OpenPype/pull/1762) - -**๐Ÿ› Bug fixes** - -- Fix - ftrack family was added incorrectly in some cases [\#1935](https://github.com/pypeclub/OpenPype/pull/1935) -- Fix - Deadline publish on Linux started Tray instead of headless publishing [\#1930](https://github.com/pypeclub/OpenPype/pull/1930) -- Maya: Validate Model Name - repair accident deletion in settings defaults [\#1929](https://github.com/pypeclub/OpenPype/pull/1929) -- Nuke: submit to farm failed due `ftrack` family remove [\#1926](https://github.com/pypeclub/OpenPype/pull/1926) -- Fix - validate takes repre\["files"\] as list all the time [\#1922](https://github.com/pypeclub/OpenPype/pull/1922) -- standalone: validator asset parents [\#1917](https://github.com/pypeclub/OpenPype/pull/1917) -- Nuke: update video file crassing [\#1916](https://github.com/pypeclub/OpenPype/pull/1916) -- Fix - texture validators for workfiles triggers only for textures workfiles [\#1914](https://github.com/pypeclub/OpenPype/pull/1914) -- Settings UI: List order works as expected [\#1906](https://github.com/pypeclub/OpenPype/pull/1906) -- Hiero: loaded clip was not set colorspace from version data [\#1904](https://github.com/pypeclub/OpenPype/pull/1904) -- Pyblish UI: Fix collecting stage processing [\#1903](https://github.com/pypeclub/OpenPype/pull/1903) -- Burnins: Use input's bitrate in h624 [\#1902](https://github.com/pypeclub/OpenPype/pull/1902) -- Bug: fixed python detection [\#1893](https://github.com/pypeclub/OpenPype/pull/1893) -- global: integrate name missing default template [\#1890](https://github.com/pypeclub/OpenPype/pull/1890) -- publisher: editorial plugins fixes [\#1889](https://github.com/pypeclub/OpenPype/pull/1889) -- Normalize path returned from Workfiles. [\#1880](https://github.com/pypeclub/OpenPype/pull/1880) -- Workfiles tool event arguments fix [\#1862](https://github.com/pypeclub/OpenPype/pull/1862) -- imageio: fix grouping [\#1856](https://github.com/pypeclub/OpenPype/pull/1856) -- Maya: don't add reference members as connections to the container set ๐Ÿ“ฆ [\#1855](https://github.com/pypeclub/OpenPype/pull/1855) -- publisher: missing version in subset prop [\#1849](https://github.com/pypeclub/OpenPype/pull/1849) -- Ftrack type error fix in sync to avalon event handler [\#1845](https://github.com/pypeclub/OpenPype/pull/1845) -- Nuke: updating effects subset fail [\#1841](https://github.com/pypeclub/OpenPype/pull/1841) -- nuke: write render node skipped with crop [\#1836](https://github.com/pypeclub/OpenPype/pull/1836) -- Project folder structure overrides [\#1813](https://github.com/pypeclub/OpenPype/pull/1813) -- Maya: fix yeti settings path in extractor [\#1809](https://github.com/pypeclub/OpenPype/pull/1809) -- Failsafe for cross project containers. [\#1806](https://github.com/pypeclub/OpenPype/pull/1806) -- Houdini colector formatting keys fix [\#1802](https://github.com/pypeclub/OpenPype/pull/1802) -- Settings error dialog on show [\#1798](https://github.com/pypeclub/OpenPype/pull/1798) -- Application launch stdout/stderr in GUI build [\#1684](https://github.com/pypeclub/OpenPype/pull/1684) -- Nuke: re-use instance nodes output path [\#1577](https://github.com/pypeclub/OpenPype/pull/1577) - -**Merged pull requests:** - -- Fix - make AE workfile publish to Ftrack configurable [\#1937](https://github.com/pypeclub/OpenPype/pull/1937) -- Add support for multiple Deadline โ˜ ๏ธโž– servers [\#1905](https://github.com/pypeclub/OpenPype/pull/1905) -- Maya: add support for `RedshiftNormalMap` node, fix `tx` linear space ๐Ÿš€ [\#1863](https://github.com/pypeclub/OpenPype/pull/1863) -- Maya: expected files -\> render products โš™๏ธ overhaul [\#1812](https://github.com/pypeclub/OpenPype/pull/1812) -- PS, AE - send actual context when another webserver is running [\#1811](https://github.com/pypeclub/OpenPype/pull/1811) - -## [3.2.0](https://github.com/pypeclub/OpenPype/tree/3.2.0) (2021-07-13) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.4...3.2.0) - -### ๐Ÿ“– Documentation - -- Fix: staging and `--use-version` option [\#1786](https://github.com/pypeclub/OpenPype/pull/1786) -- Subset template and TVPaint subset template docs [\#1717](https://github.com/pypeclub/OpenPype/pull/1717) -- Overscan color extract review [\#1701](https://github.com/pypeclub/OpenPype/pull/1701) - -**๐Ÿš€ Enhancements** - -- Nuke: ftrack family plugin settings preset [\#1805](https://github.com/pypeclub/OpenPype/pull/1805) -- Standalone publisher last project [\#1799](https://github.com/pypeclub/OpenPype/pull/1799) -- Ftrack Multiple notes as server action [\#1795](https://github.com/pypeclub/OpenPype/pull/1795) -- Settings conditional dict [\#1777](https://github.com/pypeclub/OpenPype/pull/1777) -- Settings application use python 2 only where needed [\#1776](https://github.com/pypeclub/OpenPype/pull/1776) -- Settings UI copy/paste [\#1769](https://github.com/pypeclub/OpenPype/pull/1769) -- Workfile tool widths [\#1766](https://github.com/pypeclub/OpenPype/pull/1766) -- Push hierarchical attributes care about task parent changes [\#1763](https://github.com/pypeclub/OpenPype/pull/1763) -- Application executables with environment variables [\#1757](https://github.com/pypeclub/OpenPype/pull/1757) -- Deadline: Nuke submission additional attributes [\#1756](https://github.com/pypeclub/OpenPype/pull/1756) -- Settings schema without prefill [\#1753](https://github.com/pypeclub/OpenPype/pull/1753) -- Settings Hosts enum [\#1739](https://github.com/pypeclub/OpenPype/pull/1739) -- Validate containers settings [\#1736](https://github.com/pypeclub/OpenPype/pull/1736) -- PS - added loader from sequence [\#1726](https://github.com/pypeclub/OpenPype/pull/1726) -- Autoupdate launcher [\#1725](https://github.com/pypeclub/OpenPype/pull/1725) -- Toggle Ftrack upload in StandalonePublisher [\#1708](https://github.com/pypeclub/OpenPype/pull/1708) -- Nuke: Prerender Frame Range by default [\#1699](https://github.com/pypeclub/OpenPype/pull/1699) -- Smoother edges of color triangle [\#1695](https://github.com/pypeclub/OpenPype/pull/1695) - -**๐Ÿ› Bug fixes** - -- nuke: fixing wrong name of family folder when `used existing frames` [\#1803](https://github.com/pypeclub/OpenPype/pull/1803) -- Collect ftrack family bugs [\#1801](https://github.com/pypeclub/OpenPype/pull/1801) -- Invitee email can be None which break the Ftrack commit. [\#1788](https://github.com/pypeclub/OpenPype/pull/1788) -- Otio unrelated error on import [\#1782](https://github.com/pypeclub/OpenPype/pull/1782) -- FFprobe streams order [\#1775](https://github.com/pypeclub/OpenPype/pull/1775) -- Fix - single file files are str only, cast it to list to count properly [\#1772](https://github.com/pypeclub/OpenPype/pull/1772) -- Environments in app executable for MacOS [\#1768](https://github.com/pypeclub/OpenPype/pull/1768) -- Project specific environments [\#1767](https://github.com/pypeclub/OpenPype/pull/1767) -- Settings UI with refresh button [\#1764](https://github.com/pypeclub/OpenPype/pull/1764) -- Standalone publisher thumbnail extractor fix [\#1761](https://github.com/pypeclub/OpenPype/pull/1761) -- Anatomy others templates don't cause crash [\#1758](https://github.com/pypeclub/OpenPype/pull/1758) -- Backend acre module commit update [\#1745](https://github.com/pypeclub/OpenPype/pull/1745) -- hiero: precollect instances failing when audio selected [\#1743](https://github.com/pypeclub/OpenPype/pull/1743) -- Hiero: creator instance error [\#1742](https://github.com/pypeclub/OpenPype/pull/1742) -- Nuke: fixing render creator for no selection format failing [\#1741](https://github.com/pypeclub/OpenPype/pull/1741) -- StandalonePublisher: failing collector for editorial [\#1738](https://github.com/pypeclub/OpenPype/pull/1738) -- Local settings UI crash on missing defaults [\#1737](https://github.com/pypeclub/OpenPype/pull/1737) -- TVPaint white background on thumbnail [\#1735](https://github.com/pypeclub/OpenPype/pull/1735) -- Ftrack missing custom attribute message [\#1734](https://github.com/pypeclub/OpenPype/pull/1734) -- Launcher project changes [\#1733](https://github.com/pypeclub/OpenPype/pull/1733) -- Ftrack sync status [\#1732](https://github.com/pypeclub/OpenPype/pull/1732) -- TVPaint use layer name for default variant [\#1724](https://github.com/pypeclub/OpenPype/pull/1724) -- Default subset template for TVPaint review and workfile families [\#1716](https://github.com/pypeclub/OpenPype/pull/1716) -- Maya: Extract review hotfix [\#1714](https://github.com/pypeclub/OpenPype/pull/1714) -- Settings: Imageio improving granularity [\#1711](https://github.com/pypeclub/OpenPype/pull/1711) -- Application without executables [\#1679](https://github.com/pypeclub/OpenPype/pull/1679) -- Unreal: launching on Linux [\#1672](https://github.com/pypeclub/OpenPype/pull/1672) - -**Merged pull requests:** - -- Bump prismjs from 1.23.0 to 1.24.0 in /website [\#1773](https://github.com/pypeclub/OpenPype/pull/1773) -- TVPaint ftrack family [\#1755](https://github.com/pypeclub/OpenPype/pull/1755) - -## [2.18.4](https://github.com/pypeclub/OpenPype/tree/2.18.4) (2021-06-24) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.3...2.18.4) - -## [2.18.3](https://github.com/pypeclub/OpenPype/tree/2.18.3) (2021-06-23) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.2...2.18.3) - -## [2.18.2](https://github.com/pypeclub/OpenPype/tree/2.18.2) (2021-06-16) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.1.0...2.18.2) - -## [3.1.0](https://github.com/pypeclub/OpenPype/tree/3.1.0) (2021-06-15) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.0.0...3.1.0) - -### ๐Ÿ“– Documentation - -- Feature Slack integration [\#1657](https://github.com/pypeclub/OpenPype/pull/1657) - -**๐Ÿš€ Enhancements** - -- Log Viewer with OpenPype style [\#1703](https://github.com/pypeclub/OpenPype/pull/1703) -- Scrolling in OpenPype info widget [\#1702](https://github.com/pypeclub/OpenPype/pull/1702) -- OpenPype style in modules [\#1694](https://github.com/pypeclub/OpenPype/pull/1694) -- Sort applications and tools alphabetically in Settings UI [\#1689](https://github.com/pypeclub/OpenPype/pull/1689) -- \#683 - Validate Frame Range in Standalone Publisher [\#1683](https://github.com/pypeclub/OpenPype/pull/1683) -- Hiero: old container versions identify with red color [\#1682](https://github.com/pypeclub/OpenPype/pull/1682) -- Project Manger: Default name column width [\#1669](https://github.com/pypeclub/OpenPype/pull/1669) -- Remove outline in stylesheet [\#1667](https://github.com/pypeclub/OpenPype/pull/1667) -- TVPaint: Creator take layer name as default value for subset variant [\#1663](https://github.com/pypeclub/OpenPype/pull/1663) -- TVPaint custom subset template [\#1662](https://github.com/pypeclub/OpenPype/pull/1662) -- Editorial: conform assets validator [\#1659](https://github.com/pypeclub/OpenPype/pull/1659) -- Nuke - Publish simplification [\#1653](https://github.com/pypeclub/OpenPype/pull/1653) -- \#1333 - added tooltip hints to Pyblish buttons [\#1649](https://github.com/pypeclub/OpenPype/pull/1649) - -**๐Ÿ› Bug fixes** - -- Nuke: broken publishing rendered frames [\#1707](https://github.com/pypeclub/OpenPype/pull/1707) -- Standalone publisher Thumbnail export args [\#1705](https://github.com/pypeclub/OpenPype/pull/1705) -- Bad zip can break OpenPype start [\#1691](https://github.com/pypeclub/OpenPype/pull/1691) -- Hiero: published whole edit mov [\#1687](https://github.com/pypeclub/OpenPype/pull/1687) -- Ftrack subprocess handle of stdout/stderr [\#1675](https://github.com/pypeclub/OpenPype/pull/1675) -- Settings list race condifiton and mutable dict list conversion [\#1671](https://github.com/pypeclub/OpenPype/pull/1671) -- Mac launch arguments fix [\#1660](https://github.com/pypeclub/OpenPype/pull/1660) -- Fix missing dbm python module [\#1652](https://github.com/pypeclub/OpenPype/pull/1652) -- Transparent branches in view on Mac [\#1648](https://github.com/pypeclub/OpenPype/pull/1648) -- Add asset on task item [\#1646](https://github.com/pypeclub/OpenPype/pull/1646) -- Project manager save and queue [\#1645](https://github.com/pypeclub/OpenPype/pull/1645) -- New project anatomy values [\#1644](https://github.com/pypeclub/OpenPype/pull/1644) -- Farm publishing: check if published items do exist [\#1573](https://github.com/pypeclub/OpenPype/pull/1573) - -**Merged pull requests:** - -- Bump normalize-url from 4.5.0 to 4.5.1 in /website [\#1686](https://github.com/pypeclub/OpenPype/pull/1686) - - -## [3.0.0](https://github.com/pypeclub/openpype/tree/3.0.0) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.18.1...3.0.0) - -### Configuration -- Studio Settings GUI: no more json configuration files. -- OpenPype Modules can be turned on and off. -- Easy to add Application versions. -- Per Project Environment and plugin management. -- Robust profile system for creating reviewables and burnins, with filtering based on Application, Task and data family. -- Configurable publish plugins. -- Options to make any validator or extractor, optional or disabled. -- Color Management is now unified under anatomy settings. -- Subset naming and grouping is fully configurable. -- All project attributes can now be set directly in OpenPype settings. -- Studio Setting can be locked to prevent unwanted artist changes. -- You can now add per project and per task type templates for workfile initialization in most hosts. -- Too many other individual configurable option to list in this changelog :) - -### Local Settings -- Local Settings GUI where users can change certain option on individual basis. - - Application executables. - - Project roots. - - Project site sync settings. - -### Build, Installation and Deployments -- No requirements on artist machine. -- Fully distributed workflow possible. -- Self-contained installation. -- Available on all three major platforms. -- Automatic artist OpenPype updates. -- Studio OpenPype repository for updates distribution. -- Robust Build system. -- Safe studio update versioning with staging and production options. -- MacOS build generates .app and .dmg installer. -- Windows build with installer creation script. - -### Misc -- System and diagnostic info tool in the tray. -- Launching application from Launcher indicates activity. -- All project roots are now named. Single root project are now achieved by having a single named root in the project anatomy. -- Every project root is cast into environment variable as well, so it can be used in DCC instead of absolute path (depends on DCC support for env vars). -- Basic support for task types, on top of task names. -- Timer now change automatically when the context is switched inside running application. -- 'Master" versions have been renamed to "Hero". -- Extract Burnins now supports file sequences and color settings. -- Extract Review support overscan cropping, better letterboxes and background colour fill. -- Delivery tool for copying and renaming any published assets in bulk. -- Harmony, Photoshop and After Effects now connect directly with OpenPype tray instead of spawning their own terminal. - -### Project Manager GUI -- Create Projects. -- Create Shots and Assets. -- Create Tasks and assign task types. -- Fill required asset attributes. -- Validations for duplicated or unsupported names. -- Archive Assets. -- Move Asset within hierarchy. - -### Site Sync (beta) -- Synchronization of published files between workstations and central storage. -- Ability to add arbitrary storage providers to the Site Sync system. -- Default setup includes Disk and Google Drive providers as examples. -- Access to availability information from Loader and Scene Manager. -- Sync queue GUI with filtering, error and status reporting. -- Site sync can be configured on a per-project basis. -- Bulk upload and download from the loader. - -### Ftrack -- Actions have customisable roles. -- Settings on all actions are updated live and don't need openpype restart. -- Ftrack module can now be turned off completely. -- It is enough to specify ftrack server name and the URL will be formed correctly. So instead of mystudio.ftrackapp.com, it's possible to use simply: "mystudio". - -### Editorial -- Fully OTIO based editorial publishing. -- Completely re-done Hiero publishing to be a lot simpler and faster. -- Consistent conforming from Resolve, Hiero and Standalone Publisher. - -### Backend -- OpenPype and Avalon now always share the same database (in 2.x is was possible to split them). -- Major codebase refactoring to allow for better CI, versioning and control of individual integrations. -- OTIO is bundled with build. -- OIIO is bundled with build. -- FFMPEG is bundled with build. -- Rest API and host WebSocket servers have been unified into a single local webserver. -- Maya look assigner has been integrated into the main codebase. -- Publish GUI has been integrated into the main codebase. -- Studio and Project settings overrides are now stored in Mongo. -- Too many other backend fixes and tweaks to list :), you can see full changelog on github for those. -- OpenPype uses Poetry to manage it's virtual environment when running from code. -- all applications can be marked as python 2 or 3 compatible to make the switch a bit easier. - - -### Pull Requests since 3.0.0-rc.6 - - -**Implemented enhancements:** - -- settings: task types enum entity [\#1605](https://github.com/pypeclub/OpenPype/issues/1605) -- Settings: ignore keys in referenced schema [\#1600](https://github.com/pypeclub/OpenPype/issues/1600) -- Maya: support for frame steps and frame lists [\#1585](https://github.com/pypeclub/OpenPype/issues/1585) -- TVPaint: Publish workfile. [\#1548](https://github.com/pypeclub/OpenPype/issues/1548) -- Loader: Current Asset Button [\#1448](https://github.com/pypeclub/OpenPype/issues/1448) -- Hiero: publish with retiming [\#1377](https://github.com/pypeclub/OpenPype/issues/1377) -- Ask user to restart after changing global environments in settings [\#910](https://github.com/pypeclub/OpenPype/issues/910) -- add option to define paht to workfile template [\#895](https://github.com/pypeclub/OpenPype/issues/895) -- Harmony: move server console to system tray [\#676](https://github.com/pypeclub/OpenPype/issues/676) -- Standalone style [\#1630](https://github.com/pypeclub/OpenPype/pull/1630) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Faster hierarchical values push [\#1627](https://github.com/pypeclub/OpenPype/pull/1627) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Launcher tool style [\#1624](https://github.com/pypeclub/OpenPype/pull/1624) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Loader and Library loader enhancements [\#1623](https://github.com/pypeclub/OpenPype/pull/1623) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Tray style [\#1622](https://github.com/pypeclub/OpenPype/pull/1622) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Maya schemas cleanup [\#1610](https://github.com/pypeclub/OpenPype/pull/1610) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Settings: ignore keys in referenced schema [\#1608](https://github.com/pypeclub/OpenPype/pull/1608) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- settings: task types enum entity [\#1606](https://github.com/pypeclub/OpenPype/pull/1606) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Openpype style [\#1604](https://github.com/pypeclub/OpenPype/pull/1604) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- TVPaint: Publish workfile. [\#1597](https://github.com/pypeclub/OpenPype/pull/1597) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Nuke: add option to define path to workfile template [\#1571](https://github.com/pypeclub/OpenPype/pull/1571) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Crop overscan in Extract Review [\#1569](https://github.com/pypeclub/OpenPype/pull/1569) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Unreal and Blender: Material Workflow [\#1562](https://github.com/pypeclub/OpenPype/pull/1562) ([simonebarbieri](https://github.com/simonebarbieri)) -- Harmony: move server console to system tray [\#1560](https://github.com/pypeclub/OpenPype/pull/1560) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Ask user to restart after changing global environments in settings [\#1550](https://github.com/pypeclub/OpenPype/pull/1550) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Hiero: publish with retiming [\#1545](https://github.com/pypeclub/OpenPype/pull/1545) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -**Fixed bugs:** - -- Library loader load asset documents on OpenPype start [\#1603](https://github.com/pypeclub/OpenPype/issues/1603) -- Resolve: unable to load the same footage twice [\#1317](https://github.com/pypeclub/OpenPype/issues/1317) -- Resolve: unable to load footage [\#1316](https://github.com/pypeclub/OpenPype/issues/1316) -- Add required Python 2 modules [\#1291](https://github.com/pypeclub/OpenPype/issues/1291) -- GUi scaling with hires displays [\#705](https://github.com/pypeclub/OpenPype/issues/705) -- Maya: non unicode string in publish validation [\#673](https://github.com/pypeclub/OpenPype/issues/673) -- Nuke: Rendered Frame validation is triggered by multiple collections [\#156](https://github.com/pypeclub/OpenPype/issues/156) -- avalon-core debugging failing [\#80](https://github.com/pypeclub/OpenPype/issues/80) -- Only check arnold shading group if arnold is used [\#72](https://github.com/pypeclub/OpenPype/issues/72) -- Sync server Qt layout fix [\#1621](https://github.com/pypeclub/OpenPype/pull/1621) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Console Listener on Python 2 fix [\#1620](https://github.com/pypeclub/OpenPype/pull/1620) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Bug: Initialize blessed term only in console mode [\#1619](https://github.com/pypeclub/OpenPype/pull/1619) ([antirotor](https://github.com/antirotor)) -- Settings template skip paths support wrappers [\#1618](https://github.com/pypeclub/OpenPype/pull/1618) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Maya capture 'isolate\_view' fix + minor corrections [\#1617](https://github.com/pypeclub/OpenPype/pull/1617) ([2-REC](https://github.com/2-REC)) -- MacOs Fix launch of standalone publisher [\#1616](https://github.com/pypeclub/OpenPype/pull/1616) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- 'Delivery action' report fix + typos [\#1612](https://github.com/pypeclub/OpenPype/pull/1612) ([2-REC](https://github.com/2-REC)) -- List append fix in mutable dict settings [\#1599](https://github.com/pypeclub/OpenPype/pull/1599) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Documentation: Maya: fix review [\#1598](https://github.com/pypeclub/OpenPype/pull/1598) ([antirotor](https://github.com/antirotor)) -- Bugfix: Set certifi CA bundle for all platforms [\#1596](https://github.com/pypeclub/OpenPype/pull/1596) ([antirotor](https://github.com/antirotor)) - -**Merged pull requests:** - -- Bump dns-packet from 1.3.1 to 1.3.4 in /website [\#1611](https://github.com/pypeclub/OpenPype/pull/1611) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Maya: Render workflow fixes [\#1607](https://github.com/pypeclub/OpenPype/pull/1607) ([antirotor](https://github.com/antirotor)) -- Maya: support for frame steps and frame lists [\#1586](https://github.com/pypeclub/OpenPype/pull/1586) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- 3.0.0 - curated changelog [\#1284](https://github.com/pypeclub/OpenPype/pull/1284) ([mkolar](https://github.com/mkolar)) - -## [2.18.1](https://github.com/pypeclub/openpype/tree/2.18.1) (2021-06-03) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.18.0...2.18.1) - -**Enhancements:** - -- Faster hierarchical values push [\#1626](https://github.com/pypeclub/OpenPype/pull/1626) -- Feature Delivery in library loader [\#1549](https://github.com/pypeclub/OpenPype/pull/1549) -- Hiero: Initial frame publish support. [\#1172](https://github.com/pypeclub/OpenPype/pull/1172) - -**Fixed bugs:** - -- Maya capture 'isolate\_view' fix + minor corrections [\#1614](https://github.com/pypeclub/OpenPype/pull/1614) -- 'Delivery action' report fix +typos [\#1613](https://github.com/pypeclub/OpenPype/pull/1613) -- Delivery in LibraryLoader - fixed sequence issue [\#1590](https://github.com/pypeclub/OpenPype/pull/1590) -- FFmpeg filters in quote marks [\#1588](https://github.com/pypeclub/OpenPype/pull/1588) -- Ftrack delete action cause circular error [\#1581](https://github.com/pypeclub/OpenPype/pull/1581) -- Fix Maya playblast. [\#1566](https://github.com/pypeclub/OpenPype/pull/1566) -- More failsafes prevent errored runs. [\#1554](https://github.com/pypeclub/OpenPype/pull/1554) -- Celaction publishing [\#1539](https://github.com/pypeclub/OpenPype/pull/1539) -- celaction: app not starting [\#1533](https://github.com/pypeclub/OpenPype/pull/1533) - -**Merged pull requests:** - -- Maya: Render workflow fixes - 2.0 backport [\#1609](https://github.com/pypeclub/OpenPype/pull/1609) -- Maya Hardware support [\#1553](https://github.com/pypeclub/OpenPype/pull/1553) - - -## [CI/3.0.0-rc.6](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.6) (2021-05-27) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.5...CI/3.0.0-rc.6) - -**Implemented enhancements:** - -- Hiero: publish color and transformation soft-effects [\#1376](https://github.com/pypeclub/OpenPype/issues/1376) -- Get rid of `AVALON\_HIERARCHY` and `hiearchy` key on asset [\#432](https://github.com/pypeclub/OpenPype/issues/432) -- Sync to avalon do not store hierarchy key [\#1582](https://github.com/pypeclub/OpenPype/pull/1582) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Tools: launcher scripts for project manager [\#1557](https://github.com/pypeclub/OpenPype/pull/1557) ([antirotor](https://github.com/antirotor)) -- Simple tvpaint publish [\#1555](https://github.com/pypeclub/OpenPype/pull/1555) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Feature Delivery in library loader [\#1546](https://github.com/pypeclub/OpenPype/pull/1546) ([kalisp](https://github.com/kalisp)) -- Documentation: Dev and system build documentation [\#1543](https://github.com/pypeclub/OpenPype/pull/1543) ([antirotor](https://github.com/antirotor)) -- Color entity [\#1542](https://github.com/pypeclub/OpenPype/pull/1542) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Extract review bg color [\#1534](https://github.com/pypeclub/OpenPype/pull/1534) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- TVPaint loader settings [\#1530](https://github.com/pypeclub/OpenPype/pull/1530) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Blender can initialize differente user script paths [\#1528](https://github.com/pypeclub/OpenPype/pull/1528) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Blender and Unreal: Improved Animation Workflow [\#1514](https://github.com/pypeclub/OpenPype/pull/1514) ([simonebarbieri](https://github.com/simonebarbieri)) -- Hiero: publish color and transformation soft-effects [\#1511](https://github.com/pypeclub/OpenPype/pull/1511) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -**Fixed bugs:** - -- OpenPype specific version issues [\#1583](https://github.com/pypeclub/OpenPype/issues/1583) -- Ftrack login server can't work without stderr [\#1576](https://github.com/pypeclub/OpenPype/issues/1576) -- Mac application launch [\#1575](https://github.com/pypeclub/OpenPype/issues/1575) -- Settings are not propagated to Nuke write nodes [\#1538](https://github.com/pypeclub/OpenPype/issues/1538) -- Subset names settings not applied for publishing [\#1537](https://github.com/pypeclub/OpenPype/issues/1537) -- Nuke: callback at start not setting colorspace [\#1412](https://github.com/pypeclub/OpenPype/issues/1412) -- Pype 3: Missing icon for Settings [\#1272](https://github.com/pypeclub/OpenPype/issues/1272) -- Blender: cannot initialize Avalon if BLENDER\_USER\_SCRIPTS is already used [\#1050](https://github.com/pypeclub/OpenPype/issues/1050) -- Ftrack delete action cause circular error [\#206](https://github.com/pypeclub/OpenPype/issues/206) -- Build: stop cleaning of pyc files in build directory [\#1592](https://github.com/pypeclub/OpenPype/pull/1592) ([antirotor](https://github.com/antirotor)) -- Ftrack login server can't work without stderr [\#1591](https://github.com/pypeclub/OpenPype/pull/1591) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- FFmpeg filters in quote marks [\#1589](https://github.com/pypeclub/OpenPype/pull/1589) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- OpenPype specific version issues [\#1584](https://github.com/pypeclub/OpenPype/pull/1584) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Mac application launch [\#1580](https://github.com/pypeclub/OpenPype/pull/1580) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Ftrack delete action cause circular error [\#1579](https://github.com/pypeclub/OpenPype/pull/1579) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Hiero: publishing issues [\#1578](https://github.com/pypeclub/OpenPype/pull/1578) ([jezscha](https://github.com/jezscha)) -- Nuke: callback at start not setting colorspace [\#1561](https://github.com/pypeclub/OpenPype/pull/1561) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Bugfix PS subset and quick review [\#1541](https://github.com/pypeclub/OpenPype/pull/1541) ([kalisp](https://github.com/kalisp)) -- Settings are not propagated to Nuke write nodes [\#1540](https://github.com/pypeclub/OpenPype/pull/1540) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- OpenPype: Powershell scripts polishing [\#1536](https://github.com/pypeclub/OpenPype/pull/1536) ([antirotor](https://github.com/antirotor)) -- Host name collecting fix [\#1535](https://github.com/pypeclub/OpenPype/pull/1535) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Handle duplicated task names in project manager [\#1531](https://github.com/pypeclub/OpenPype/pull/1531) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Validate is file attribute in settings schema [\#1529](https://github.com/pypeclub/OpenPype/pull/1529) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -**Merged pull requests:** - -- Bump postcss from 8.2.8 to 8.3.0 in /website [\#1593](https://github.com/pypeclub/OpenPype/pull/1593) ([dependabot[bot]](https://github.com/apps/dependabot)) -- User installation documentation [\#1532](https://github.com/pypeclub/OpenPype/pull/1532) ([64qam](https://github.com/64qam)) - -## [CI/3.0.0-rc.5](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.5) (2021-05-19) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.18.0...CI/3.0.0-rc.5) - -**Implemented enhancements:** - -- OpenPype: Build - Add progress bars [\#1524](https://github.com/pypeclub/OpenPype/pull/1524) ([antirotor](https://github.com/antirotor)) -- Default environments per host imlementation [\#1522](https://github.com/pypeclub/OpenPype/pull/1522) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- OpenPype: use `semver` module for version resolution [\#1513](https://github.com/pypeclub/OpenPype/pull/1513) ([antirotor](https://github.com/antirotor)) -- Feature Aftereffects setting cleanup documentation [\#1510](https://github.com/pypeclub/OpenPype/pull/1510) ([kalisp](https://github.com/kalisp)) -- Feature Sync server settings enhancement [\#1501](https://github.com/pypeclub/OpenPype/pull/1501) ([kalisp](https://github.com/kalisp)) -- Project manager [\#1396](https://github.com/pypeclub/OpenPype/pull/1396) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -**Fixed bugs:** - -- Unified schema definition [\#874](https://github.com/pypeclub/OpenPype/issues/874) -- Maya: fix look assignment [\#1526](https://github.com/pypeclub/OpenPype/pull/1526) ([antirotor](https://github.com/antirotor)) -- Bugfix Sync server local site issues [\#1523](https://github.com/pypeclub/OpenPype/pull/1523) ([kalisp](https://github.com/kalisp)) -- Store as list dictionary check initial value with right type [\#1520](https://github.com/pypeclub/OpenPype/pull/1520) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Maya: wrong collection of playblasted frames [\#1515](https://github.com/pypeclub/OpenPype/pull/1515) ([mkolar](https://github.com/mkolar)) -- Convert pyblish logs to string at the moment of logging [\#1512](https://github.com/pypeclub/OpenPype/pull/1512) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- 3.0 | nuke: fixing start\_at with option gui [\#1509](https://github.com/pypeclub/OpenPype/pull/1509) ([jezscha](https://github.com/jezscha)) -- Tests: fix pype -\> openpype to make tests work again [\#1508](https://github.com/pypeclub/OpenPype/pull/1508) ([antirotor](https://github.com/antirotor)) - -**Merged pull requests:** - -- OpenPype: disable submodule update with `--no-submodule-update` [\#1525](https://github.com/pypeclub/OpenPype/pull/1525) ([antirotor](https://github.com/antirotor)) -- Ftrack without autosync in Pype 3 [\#1519](https://github.com/pypeclub/OpenPype/pull/1519) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Feature Harmony setting cleanup documentation [\#1506](https://github.com/pypeclub/OpenPype/pull/1506) ([kalisp](https://github.com/kalisp)) -- Sync Server beginning of documentation [\#1471](https://github.com/pypeclub/OpenPype/pull/1471) ([kalisp](https://github.com/kalisp)) -- Blender: publish layout json [\#1348](https://github.com/pypeclub/OpenPype/pull/1348) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -## [2.18.0](https://github.com/pypeclub/openpype/tree/2.18.0) (2021-05-18) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.4...2.18.0) - -**Implemented enhancements:** - -- Default environments per host imlementation [\#1405](https://github.com/pypeclub/OpenPype/issues/1405) -- Blender: publish layout json [\#1346](https://github.com/pypeclub/OpenPype/issues/1346) -- Ftrack without autosync in Pype 3 [\#1128](https://github.com/pypeclub/OpenPype/issues/1128) -- Launcher: started action indicator [\#1102](https://github.com/pypeclub/OpenPype/issues/1102) -- Launch arguments of applications [\#1094](https://github.com/pypeclub/OpenPype/issues/1094) -- Publish: instance info [\#724](https://github.com/pypeclub/OpenPype/issues/724) -- Review: ability to control review length [\#482](https://github.com/pypeclub/OpenPype/issues/482) -- Colorized recognition of creator result [\#394](https://github.com/pypeclub/OpenPype/issues/394) -- event assign user to started task [\#49](https://github.com/pypeclub/OpenPype/issues/49) -- rebuild containers from reference in maya [\#55](https://github.com/pypeclub/OpenPype/issues/55) -- nuke Load metadata [\#66](https://github.com/pypeclub/OpenPype/issues/66) -- Maya: Safer handling of expected render output names [\#1496](https://github.com/pypeclub/OpenPype/pull/1496) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- TVPaint: Increment workfile version on successfull publish. [\#1489](https://github.com/pypeclub/OpenPype/pull/1489) ([tokejepsen](https://github.com/tokejepsen)) -- Use SubsetLoader and multiple contexts for delete\_old\_versions [\#1484](https://github.com/pypeclub/OpenPype/pull/1484) ([tokejepsen](https://github.com/tokejepsen)) -- Maya: Use of multiple deadline servers [\#1483](https://github.com/pypeclub/OpenPype/pull/1483) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- Igniter version resolution doesn't consider it's own version [\#1505](https://github.com/pypeclub/OpenPype/issues/1505) -- Maya: Safer handling of expected render output names [\#1159](https://github.com/pypeclub/OpenPype/issues/1159) -- Harmony: Invalid render output from non-conventionally named instance [\#871](https://github.com/pypeclub/OpenPype/issues/871) -- Existing subsets hints in creator [\#1503](https://github.com/pypeclub/OpenPype/pull/1503) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- nuke: space in node name breaking process [\#1494](https://github.com/pypeclub/OpenPype/pull/1494) ([jezscha](https://github.com/jezscha)) -- Maya: wrong collection of playblasted frames [\#1517](https://github.com/pypeclub/OpenPype/pull/1517) ([mkolar](https://github.com/mkolar)) -- Existing subsets hints in creator [\#1502](https://github.com/pypeclub/OpenPype/pull/1502) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Use instance frame start instead of timeline. [\#1486](https://github.com/pypeclub/OpenPype/pull/1486) ([tokejepsen](https://github.com/tokejepsen)) -- Maya: Redshift - set proper start frame on proxy [\#1480](https://github.com/pypeclub/OpenPype/pull/1480) ([antirotor](https://github.com/antirotor)) - -**Closed issues:** - -- Nuke: wrong "star at" value on render load [\#1352](https://github.com/pypeclub/OpenPype/issues/1352) -- DV Resolve - loading/updating - image video [\#915](https://github.com/pypeclub/OpenPype/issues/915) - -**Merged pull requests:** - -- nuke: fixing start\_at with option gui [\#1507](https://github.com/pypeclub/OpenPype/pull/1507) ([jezscha](https://github.com/jezscha)) - -## [CI/3.0.0-rc.4](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.4) (2021-05-12) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.3...CI/3.0.0-rc.4) - -**Implemented enhancements:** - -- Resolve: documentation [\#1490](https://github.com/pypeclub/OpenPype/issues/1490) -- Hiero: audio to review [\#1378](https://github.com/pypeclub/OpenPype/issues/1378) -- nks color clips after publish [\#44](https://github.com/pypeclub/OpenPype/issues/44) -- Store data from modifiable dict as list [\#1504](https://github.com/pypeclub/OpenPype/pull/1504) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Use SubsetLoader and multiple contexts for delete\_old\_versions [\#1497](https://github.com/pypeclub/OpenPype/pull/1497) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Hiero: publish audio and add to review [\#1493](https://github.com/pypeclub/OpenPype/pull/1493) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Resolve: documentation [\#1491](https://github.com/pypeclub/OpenPype/pull/1491) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Change integratenew template profiles setting [\#1487](https://github.com/pypeclub/OpenPype/pull/1487) ([kalisp](https://github.com/kalisp)) -- Settings tool cleanup [\#1477](https://github.com/pypeclub/OpenPype/pull/1477) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Sorted Applications and Tools in Custom attribute [\#1476](https://github.com/pypeclub/OpenPype/pull/1476) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- PS - group all published instances [\#1416](https://github.com/pypeclub/OpenPype/pull/1416) ([kalisp](https://github.com/kalisp)) -- OpenPype: Support for Docker [\#1289](https://github.com/pypeclub/OpenPype/pull/1289) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- Harmony: palettes publishing [\#1439](https://github.com/pypeclub/OpenPype/issues/1439) -- Photoshop: validation for already created images [\#1435](https://github.com/pypeclub/OpenPype/issues/1435) -- Nuke Extracts Thumbnail from frame out of shot range [\#963](https://github.com/pypeclub/OpenPype/issues/963) -- Instance in same Context repairing [\#390](https://github.com/pypeclub/OpenPype/issues/390) -- User Inactivity - Start timers sets wrong time [\#91](https://github.com/pypeclub/OpenPype/issues/91) -- Use instance frame start instead of timeline [\#1499](https://github.com/pypeclub/OpenPype/pull/1499) ([mkolar](https://github.com/mkolar)) -- Various smaller fixes [\#1498](https://github.com/pypeclub/OpenPype/pull/1498) ([mkolar](https://github.com/mkolar)) -- nuke: space in node name breaking process [\#1495](https://github.com/pypeclub/OpenPype/pull/1495) ([jezscha](https://github.com/jezscha)) -- Codec determination in extract burnin [\#1492](https://github.com/pypeclub/OpenPype/pull/1492) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Undefined constant in subprocess module [\#1485](https://github.com/pypeclub/OpenPype/pull/1485) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- List entity catch add/remove item changes properly [\#1482](https://github.com/pypeclub/OpenPype/pull/1482) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Resolve: additional fixes of publishing workflow [\#1481](https://github.com/pypeclub/OpenPype/pull/1481) ([jezscha](https://github.com/jezscha)) -- Photoshop: validation for already created images [\#1436](https://github.com/pypeclub/OpenPype/pull/1436) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -**Merged pull requests:** - -- Maya: Support for looks on VRay Proxies [\#1443](https://github.com/pypeclub/OpenPype/pull/1443) ([antirotor](https://github.com/antirotor)) - -## [2.17.3](https://github.com/pypeclub/openpype/tree/2.17.3) (2021-05-06) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.3...2.17.3) - -**Fixed bugs:** - -- Nuke: workfile version synced to db version always [\#1479](https://github.com/pypeclub/OpenPype/pull/1479) ([jezscha](https://github.com/jezscha)) - -## [CI/3.0.0-rc.3](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.3) (2021-05-05) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.2...CI/3.0.0-rc.3) - -**Implemented enhancements:** - -- Path entity with placeholder [\#1473](https://github.com/pypeclub/OpenPype/pull/1473) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Burnin custom font filepath [\#1472](https://github.com/pypeclub/OpenPype/pull/1472) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Poetry: Move to OpenPype [\#1449](https://github.com/pypeclub/OpenPype/pull/1449) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- Mac SSL path needs to be relative to pype\_root [\#1469](https://github.com/pypeclub/OpenPype/issues/1469) -- Resolve: fix loading clips to timeline [\#1421](https://github.com/pypeclub/OpenPype/issues/1421) -- Wrong handling of slashes when loading on mac [\#1411](https://github.com/pypeclub/OpenPype/issues/1411) -- Nuke openpype3 [\#1342](https://github.com/pypeclub/OpenPype/issues/1342) -- Houdini launcher [\#1171](https://github.com/pypeclub/OpenPype/issues/1171) -- Fix SyncServer get\_enabled\_projects should handle global state [\#1475](https://github.com/pypeclub/OpenPype/pull/1475) ([kalisp](https://github.com/kalisp)) -- Igniter buttons enable/disable fix [\#1474](https://github.com/pypeclub/OpenPype/pull/1474) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Mac SSL path needs to be relative to pype\_root [\#1470](https://github.com/pypeclub/OpenPype/pull/1470) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Resolve: 17 compatibility issues and load image sequences [\#1422](https://github.com/pypeclub/OpenPype/pull/1422) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -## [CI/3.0.0-rc.2](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.2) (2021-05-04) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.2...CI/3.0.0-rc.2) - -**Implemented enhancements:** - -- Extract burnins with sequences [\#1467](https://github.com/pypeclub/OpenPype/pull/1467) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Extract burnins with color setting [\#1466](https://github.com/pypeclub/OpenPype/pull/1466) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -**Fixed bugs:** - -- Fix groups check in Python 2 [\#1468](https://github.com/pypeclub/OpenPype/pull/1468) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -## [2.17.2](https://github.com/pypeclub/openpype/tree/2.17.2) (2021-05-04) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.1...2.17.2) - -**Implemented enhancements:** - -- Forward/Backward compatible apps and tools with OpenPype 3 [\#1463](https://github.com/pypeclub/OpenPype/pull/1463) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -## [CI/3.0.0-rc.1](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.1) (2021-05-04) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.1...CI/3.0.0-rc.1) - -**Implemented enhancements:** - -- Only show studio settings to admins [\#1406](https://github.com/pypeclub/OpenPype/issues/1406) -- Ftrack specific settings save warning messages [\#1458](https://github.com/pypeclub/OpenPype/pull/1458) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Faster settings actions [\#1446](https://github.com/pypeclub/OpenPype/pull/1446) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Feature/sync server priority [\#1444](https://github.com/pypeclub/OpenPype/pull/1444) ([kalisp](https://github.com/kalisp)) -- Faster settings UI loading [\#1442](https://github.com/pypeclub/OpenPype/pull/1442) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Igniter re-write [\#1441](https://github.com/pypeclub/OpenPype/pull/1441) ([mkolar](https://github.com/mkolar)) -- Wrap openpype build into installers [\#1419](https://github.com/pypeclub/OpenPype/pull/1419) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Extract review first documentation [\#1404](https://github.com/pypeclub/OpenPype/pull/1404) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Blender PySide2 install guide [\#1403](https://github.com/pypeclub/OpenPype/pull/1403) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: deadline submission with gpu [\#1394](https://github.com/pypeclub/OpenPype/pull/1394) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Igniter: Reverse item filter for OpenPype version [\#1349](https://github.com/pypeclub/OpenPype/pull/1349) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- OpenPype Mongo URL definition [\#1450](https://github.com/pypeclub/OpenPype/issues/1450) -- Various typos and smaller fixes [\#1464](https://github.com/pypeclub/OpenPype/pull/1464) ([mkolar](https://github.com/mkolar)) -- Validation of dynamic items in settings [\#1462](https://github.com/pypeclub/OpenPype/pull/1462) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- List can handle new items correctly [\#1459](https://github.com/pypeclub/OpenPype/pull/1459) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Settings actions process fix [\#1457](https://github.com/pypeclub/OpenPype/pull/1457) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Add to overrides actions fix [\#1456](https://github.com/pypeclub/OpenPype/pull/1456) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- OpenPype Mongo URL definition [\#1455](https://github.com/pypeclub/OpenPype/pull/1455) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Global settings save/load out of system settings [\#1447](https://github.com/pypeclub/OpenPype/pull/1447) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Keep metadata on remove overrides [\#1445](https://github.com/pypeclub/OpenPype/pull/1445) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: fixing undo for loaded mov and sequence [\#1432](https://github.com/pypeclub/OpenPype/pull/1432) ([jezscha](https://github.com/jezscha)) -- ExtractReview skip empty strings from settings [\#1431](https://github.com/pypeclub/OpenPype/pull/1431) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Bugfix Sync server tweaks [\#1430](https://github.com/pypeclub/OpenPype/pull/1430) ([kalisp](https://github.com/kalisp)) -- Hiero: missing thumbnail in review [\#1429](https://github.com/pypeclub/OpenPype/pull/1429) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Bugfix Maya in deadline for OpenPype [\#1428](https://github.com/pypeclub/OpenPype/pull/1428) ([kalisp](https://github.com/kalisp)) -- AE - validation for duration was 1 frame shorter [\#1427](https://github.com/pypeclub/OpenPype/pull/1427) ([kalisp](https://github.com/kalisp)) -- Houdini menu filename [\#1418](https://github.com/pypeclub/OpenPype/pull/1418) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Fix Avalon plugins attribute overrides [\#1413](https://github.com/pypeclub/OpenPype/pull/1413) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: submit to Deadline fails [\#1409](https://github.com/pypeclub/OpenPype/pull/1409) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Validate MongoDB Url on start [\#1407](https://github.com/pypeclub/OpenPype/pull/1407) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: fix set colorspace with new settings [\#1386](https://github.com/pypeclub/OpenPype/pull/1386) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- MacOs build and install issues [\#1380](https://github.com/pypeclub/OpenPype/pull/1380) ([mkolar](https://github.com/mkolar)) - -**Closed issues:** - -- test [\#1452](https://github.com/pypeclub/OpenPype/issues/1452) - -**Merged pull requests:** - -- TVPaint frame range definition [\#1425](https://github.com/pypeclub/OpenPype/pull/1425) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Only show studio settings to admins [\#1420](https://github.com/pypeclub/OpenPype/pull/1420) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- TVPaint documentation [\#1305](https://github.com/pypeclub/OpenPype/pull/1305) ([64qam](https://github.com/64qam)) - -## [2.17.1](https://github.com/pypeclub/openpype/tree/2.17.1) (2021-04-30) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.0...2.17.1) - -**Enhancements:** - -- Nuke: deadline submission with gpu [\#1414](https://github.com/pypeclub/OpenPype/pull/1414) -- TVPaint frame range definition [\#1424](https://github.com/pypeclub/OpenPype/pull/1424) -- PS - group all published instances [\#1415](https://github.com/pypeclub/OpenPype/pull/1415) -- Add task name to context pop up. [\#1383](https://github.com/pypeclub/OpenPype/pull/1383) -- Enhance review letterbox feature. [\#1371](https://github.com/pypeclub/OpenPype/pull/1371) - -**Fixed bugs:** - -- Houdini menu filename [\#1417](https://github.com/pypeclub/OpenPype/pull/1417) -- AE - validation for duration was 1 frame shorter [\#1426](https://github.com/pypeclub/OpenPype/pull/1426) - -**Merged pull requests:** - -- Maya: Vray - problem getting all file nodes for look publishing [\#1399](https://github.com/pypeclub/OpenPype/pull/1399) -- Maya: Support for Redshift proxies [\#1360](https://github.com/pypeclub/OpenPype/pull/1360) - -## [2.17.0](https://github.com/pypeclub/openpype/tree/2.17.0) (2021-04-20) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-beta.2...2.17.0) - -**Enhancements:** - -- Forward compatible ftrack group [\#1243](https://github.com/pypeclub/OpenPype/pull/1243) -- Settings in mongo as dict [\#1221](https://github.com/pypeclub/OpenPype/pull/1221) -- Maya: Make tx option configurable with presets [\#1328](https://github.com/pypeclub/OpenPype/pull/1328) -- TVPaint asset name validation [\#1302](https://github.com/pypeclub/OpenPype/pull/1302) -- TV Paint: Set initial project settings. [\#1299](https://github.com/pypeclub/OpenPype/pull/1299) -- TV Paint: Validate mark in and out. [\#1298](https://github.com/pypeclub/OpenPype/pull/1298) -- Validate project settings [\#1297](https://github.com/pypeclub/OpenPype/pull/1297) -- After Effects: added SubsetManager [\#1234](https://github.com/pypeclub/OpenPype/pull/1234) -- Show error message in pyblish UI [\#1206](https://github.com/pypeclub/OpenPype/pull/1206) - -**Fixed bugs:** - -- Hiero: fixing source frame from correct object [\#1362](https://github.com/pypeclub/OpenPype/pull/1362) -- Nuke: fix colourspace, prerenders and nuke panes opening [\#1308](https://github.com/pypeclub/OpenPype/pull/1308) -- AE remove orphaned instance from workfile - fix self.stub [\#1282](https://github.com/pypeclub/OpenPype/pull/1282) -- Nuke: deadline submission with search replaced env values from preset [\#1194](https://github.com/pypeclub/OpenPype/pull/1194) -- Ftrack custom attributes in bulks [\#1312](https://github.com/pypeclub/OpenPype/pull/1312) -- Ftrack optional pypclub role [\#1303](https://github.com/pypeclub/OpenPype/pull/1303) -- After Effects: remove orphaned instances [\#1275](https://github.com/pypeclub/OpenPype/pull/1275) -- Avalon schema names [\#1242](https://github.com/pypeclub/OpenPype/pull/1242) -- Handle duplication of Task name [\#1226](https://github.com/pypeclub/OpenPype/pull/1226) -- Modified path of plugin loads for Harmony and TVPaint [\#1217](https://github.com/pypeclub/OpenPype/pull/1217) -- Regex checks in profiles filtering [\#1214](https://github.com/pypeclub/OpenPype/pull/1214) -- Bulk mov strict task [\#1204](https://github.com/pypeclub/OpenPype/pull/1204) -- Update custom ftrack session attributes [\#1202](https://github.com/pypeclub/OpenPype/pull/1202) -- Nuke: write node colorspace ignore `default\(\)` label [\#1199](https://github.com/pypeclub/OpenPype/pull/1199) -- Nuke: reverse search to make it more versatile [\#1178](https://github.com/pypeclub/OpenPype/pull/1178) - - - -## [2.16.0](https://github.com/pypeclub/pype/tree/2.16.0) (2021-03-22) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.3...2.16.0) - -**Enhancements:** - -- Nuke: deadline submit limit group filter [\#1167](https://github.com/pypeclub/pype/pull/1167) -- Maya: support for Deadline Group and Limit Groups - backport 2.x [\#1156](https://github.com/pypeclub/pype/pull/1156) -- Maya: fixes for Redshift support [\#1152](https://github.com/pypeclub/pype/pull/1152) -- Nuke: adding preset for a Read node name to all img and mov Loaders [\#1146](https://github.com/pypeclub/pype/pull/1146) -- nuke deadline submit with environ var from presets overrides [\#1142](https://github.com/pypeclub/pype/pull/1142) -- Change timers after task change [\#1138](https://github.com/pypeclub/pype/pull/1138) -- Nuke: shortcuts for Pype menu [\#1127](https://github.com/pypeclub/pype/pull/1127) -- Nuke: workfile template [\#1124](https://github.com/pypeclub/pype/pull/1124) -- Sites local settings by site name [\#1117](https://github.com/pypeclub/pype/pull/1117) -- Reset loader's asset selection on context change [\#1106](https://github.com/pypeclub/pype/pull/1106) -- Bulk mov render publishing [\#1101](https://github.com/pypeclub/pype/pull/1101) -- Photoshop: mark publishable instances [\#1093](https://github.com/pypeclub/pype/pull/1093) -- Added ability to define BG color for extract review [\#1088](https://github.com/pypeclub/pype/pull/1088) -- TVPaint extractor enhancement [\#1080](https://github.com/pypeclub/pype/pull/1080) -- Photoshop: added support for .psb in workfiles [\#1078](https://github.com/pypeclub/pype/pull/1078) -- Optionally add task to subset name [\#1072](https://github.com/pypeclub/pype/pull/1072) -- Only extend clip range when collecting. [\#1008](https://github.com/pypeclub/pype/pull/1008) -- Collect audio for farm reviews. [\#1073](https://github.com/pypeclub/pype/pull/1073) - - -**Fixed bugs:** - -- Fix path spaces in jpeg extractor [\#1174](https://github.com/pypeclub/pype/pull/1174) -- Maya: Bugfix: superclass for CreateCameraRig [\#1166](https://github.com/pypeclub/pype/pull/1166) -- Maya: Submit to Deadline - fix typo in condition [\#1163](https://github.com/pypeclub/pype/pull/1163) -- Avoid dot in repre extension [\#1125](https://github.com/pypeclub/pype/pull/1125) -- Fix versions variable usage in standalone publisher [\#1090](https://github.com/pypeclub/pype/pull/1090) -- Collect instance data fix subset query [\#1082](https://github.com/pypeclub/pype/pull/1082) -- Fix getting the camera name. [\#1067](https://github.com/pypeclub/pype/pull/1067) -- Nuke: Ensure "NUKE\_TEMP\_DIR" is not part of the Deadline job environment. [\#1064](https://github.com/pypeclub/pype/pull/1064) - -## [2.15.3](https://github.com/pypeclub/pype/tree/2.15.3) (2021-02-26) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.2...2.15.3) - -**Enhancements:** - -- Maya: speedup renderable camera collection [\#1053](https://github.com/pypeclub/pype/pull/1053) -- Harmony - add regex search to filter allowed task names for collectinโ€ฆ [\#1047](https://github.com/pypeclub/pype/pull/1047) - -**Fixed bugs:** - -- Ftrack integrate hierarchy fix [\#1085](https://github.com/pypeclub/pype/pull/1085) -- Explicit subset filter in anatomy instance data [\#1059](https://github.com/pypeclub/pype/pull/1059) -- TVPaint frame offset [\#1057](https://github.com/pypeclub/pype/pull/1057) -- Auto fix unicode strings [\#1046](https://github.com/pypeclub/pype/pull/1046) - -## [2.15.2](https://github.com/pypeclub/pype/tree/2.15.2) (2021-02-19) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.1...2.15.2) - -**Enhancements:** - -- Maya: Vray scene publishing [\#1013](https://github.com/pypeclub/pype/pull/1013) - -**Fixed bugs:** - -- Fix entity move under project [\#1040](https://github.com/pypeclub/pype/pull/1040) -- smaller nuke fixes from production [\#1036](https://github.com/pypeclub/pype/pull/1036) -- TVPaint thumbnail extract fix [\#1031](https://github.com/pypeclub/pype/pull/1031) - -## [2.15.1](https://github.com/pypeclub/pype/tree/2.15.1) (2021-02-12) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.0...2.15.1) - -**Enhancements:** - -- Delete version as loader action [\#1011](https://github.com/pypeclub/pype/pull/1011) -- Delete old versions [\#445](https://github.com/pypeclub/pype/pull/445) - -**Fixed bugs:** - -- PS - remove obsolete functions from pywin32 [\#1006](https://github.com/pypeclub/pype/pull/1006) -- Clone description of review session objects. [\#922](https://github.com/pypeclub/pype/pull/922) - -## [2.15.0](https://github.com/pypeclub/pype/tree/2.15.0) (2021-02-09) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.6...2.15.0) - -**Enhancements:** - -- Resolve - loading and updating clips [\#932](https://github.com/pypeclub/pype/pull/932) -- Release/2.15.0 [\#926](https://github.com/pypeclub/pype/pull/926) -- Photoshop: add option for template.psd and prelaunch hook [\#894](https://github.com/pypeclub/pype/pull/894) -- Nuke: deadline presets [\#993](https://github.com/pypeclub/pype/pull/993) -- Maya: Alembic only set attributes that exists. [\#986](https://github.com/pypeclub/pype/pull/986) -- Harmony: render local and handle fixes [\#981](https://github.com/pypeclub/pype/pull/981) -- PSD Bulk export of ANIM group [\#965](https://github.com/pypeclub/pype/pull/965) -- AE - added prelaunch hook for opening last or workfile from template [\#944](https://github.com/pypeclub/pype/pull/944) -- PS - safer handling of loading of workfile [\#941](https://github.com/pypeclub/pype/pull/941) -- Maya: Handling Arnold referenced AOVs [\#938](https://github.com/pypeclub/pype/pull/938) -- TVPaint: switch layer IDs for layer names during identification [\#903](https://github.com/pypeclub/pype/pull/903) -- TVPaint audio/sound loader [\#893](https://github.com/pypeclub/pype/pull/893) -- Clone review session with children. [\#891](https://github.com/pypeclub/pype/pull/891) -- Simple compositing data packager for freelancers [\#884](https://github.com/pypeclub/pype/pull/884) -- Harmony deadline submission [\#881](https://github.com/pypeclub/pype/pull/881) -- Maya: Optionally hide image planes from reviews. [\#840](https://github.com/pypeclub/pype/pull/840) -- Maya: handle referenced AOVs for Vray [\#824](https://github.com/pypeclub/pype/pull/824) -- DWAA/DWAB support on windows [\#795](https://github.com/pypeclub/pype/pull/795) -- Unreal: animation, layout and setdress updates [\#695](https://github.com/pypeclub/pype/pull/695) - -**Fixed bugs:** - -- Maya: Looks - disable hardlinks [\#995](https://github.com/pypeclub/pype/pull/995) -- Fix Ftrack custom attribute update [\#982](https://github.com/pypeclub/pype/pull/982) -- Prores ks in burnin script [\#960](https://github.com/pypeclub/pype/pull/960) -- terminal.py crash on import [\#839](https://github.com/pypeclub/pype/pull/839) -- Extract review handle bizarre pixel aspect ratio [\#990](https://github.com/pypeclub/pype/pull/990) -- Nuke: add nuke related env var to sumbission [\#988](https://github.com/pypeclub/pype/pull/988) -- Nuke: missing preset's variable [\#984](https://github.com/pypeclub/pype/pull/984) -- Get creator by name fix [\#979](https://github.com/pypeclub/pype/pull/979) -- Fix update of project's tasks on Ftrack sync [\#972](https://github.com/pypeclub/pype/pull/972) -- nuke: wrong frame offset in mov loader [\#971](https://github.com/pypeclub/pype/pull/971) -- Create project structure action fix multiroot [\#967](https://github.com/pypeclub/pype/pull/967) -- PS: remove pywin installation from hook [\#964](https://github.com/pypeclub/pype/pull/964) -- Prores ks in burnin script [\#959](https://github.com/pypeclub/pype/pull/959) -- Subset family is now stored in subset document [\#956](https://github.com/pypeclub/pype/pull/956) -- DJV new version arguments [\#954](https://github.com/pypeclub/pype/pull/954) -- TV Paint: Fix single frame Sequence [\#953](https://github.com/pypeclub/pype/pull/953) -- nuke: missing `file` knob update [\#933](https://github.com/pypeclub/pype/pull/933) -- Photoshop: Create from single layer was failing [\#920](https://github.com/pypeclub/pype/pull/920) -- Nuke: baking mov with correct colorspace inherited from write [\#909](https://github.com/pypeclub/pype/pull/909) -- Launcher fix actions discover [\#896](https://github.com/pypeclub/pype/pull/896) -- Get the correct file path for the updated mov. [\#889](https://github.com/pypeclub/pype/pull/889) -- Maya: Deadline submitter - shared data access violation [\#831](https://github.com/pypeclub/pype/pull/831) -- Maya: Take into account vray master AOV switch [\#822](https://github.com/pypeclub/pype/pull/822) - -**Merged pull requests:** - -- Refactor blender to 3.0 format [\#934](https://github.com/pypeclub/pype/pull/934) - -## [2.14.6](https://github.com/pypeclub/pype/tree/2.14.6) (2021-01-15) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.5...2.14.6) - -**Fixed bugs:** - -- Nuke: improving of hashing path [\#885](https://github.com/pypeclub/pype/pull/885) - -**Merged pull requests:** - -- Hiero: cut videos with correct secons [\#892](https://github.com/pypeclub/pype/pull/892) -- Faster sync to avalon preparation [\#869](https://github.com/pypeclub/pype/pull/869) - -## [2.14.5](https://github.com/pypeclub/pype/tree/2.14.5) (2021-01-06) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.4...2.14.5) - -**Merged pull requests:** - -- Pype logger refactor [\#866](https://github.com/pypeclub/pype/pull/866) - -## [2.14.4](https://github.com/pypeclub/pype/tree/2.14.4) (2020-12-18) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.3...2.14.4) - -**Merged pull requests:** - -- Fix - AE - added explicit cast to int [\#837](https://github.com/pypeclub/pype/pull/837) - -## [2.14.3](https://github.com/pypeclub/pype/tree/2.14.3) (2020-12-16) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.2...2.14.3) - -**Fixed bugs:** - -- TVPaint repair invalid metadata [\#809](https://github.com/pypeclub/pype/pull/809) -- Feature/push hier value to nonhier action [\#807](https://github.com/pypeclub/pype/pull/807) -- Harmony: fix palette and image sequence loader [\#806](https://github.com/pypeclub/pype/pull/806) - -**Merged pull requests:** - -- respecting space in path [\#823](https://github.com/pypeclub/pype/pull/823) - -## [2.14.2](https://github.com/pypeclub/pype/tree/2.14.2) (2020-12-04) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.1...2.14.2) - -**Enhancements:** - -- Collapsible wrapper in settings [\#767](https://github.com/pypeclub/pype/pull/767) - -**Fixed bugs:** - -- Harmony: template extraction and palettes thumbnails on mac [\#768](https://github.com/pypeclub/pype/pull/768) -- TVPaint store context to workfile metadata \(764\) [\#766](https://github.com/pypeclub/pype/pull/766) -- Extract review audio cut fix [\#763](https://github.com/pypeclub/pype/pull/763) - -**Merged pull requests:** - -- AE: fix publish after background load [\#781](https://github.com/pypeclub/pype/pull/781) -- TVPaint store members key [\#769](https://github.com/pypeclub/pype/pull/769) - -## [2.14.1](https://github.com/pypeclub/pype/tree/2.14.1) (2020-11-27) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.0...2.14.1) - -**Enhancements:** - -- Settings required keys in modifiable dict [\#770](https://github.com/pypeclub/pype/pull/770) -- Extract review may not add audio to output [\#761](https://github.com/pypeclub/pype/pull/761) - -**Fixed bugs:** - -- After Effects: frame range, file format and render source scene fixes [\#760](https://github.com/pypeclub/pype/pull/760) -- Hiero: trimming review with clip event number [\#754](https://github.com/pypeclub/pype/pull/754) -- TVPaint: fix updating of loaded subsets [\#752](https://github.com/pypeclub/pype/pull/752) -- Maya: Vray handling of default aov [\#748](https://github.com/pypeclub/pype/pull/748) -- Maya: multiple renderable cameras in layer didn't work [\#744](https://github.com/pypeclub/pype/pull/744) -- Ftrack integrate custom attributes fix [\#742](https://github.com/pypeclub/pype/pull/742) - -## [2.14.0](https://github.com/pypeclub/pype/tree/2.14.0) (2020-11-23) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.7...2.14.0) - -**Enhancements:** - -- Render publish plugins abstraction [\#687](https://github.com/pypeclub/pype/pull/687) -- Shot asset build trigger status [\#736](https://github.com/pypeclub/pype/pull/736) -- Maya: add camera rig publishing option [\#721](https://github.com/pypeclub/pype/pull/721) -- Sort instances by label in pyblish gui [\#719](https://github.com/pypeclub/pype/pull/719) -- Synchronize ftrack hierarchical and shot attributes [\#716](https://github.com/pypeclub/pype/pull/716) -- 686 standalonepublisher editorial from image sequences [\#699](https://github.com/pypeclub/pype/pull/699) -- Ask user to select non-default camera from scene or create a new. [\#678](https://github.com/pypeclub/pype/pull/678) -- TVPaint: image loader with options [\#675](https://github.com/pypeclub/pype/pull/675) -- Maya: Camera name can be added to burnins. [\#674](https://github.com/pypeclub/pype/pull/674) -- After Effects: base integration with loaders [\#667](https://github.com/pypeclub/pype/pull/667) -- Harmony: Javascript refactoring and overall stability improvements [\#666](https://github.com/pypeclub/pype/pull/666) - -**Fixed bugs:** - -- Bugfix Hiero Review / Plate representation publish [\#743](https://github.com/pypeclub/pype/pull/743) -- Asset fetch second fix [\#726](https://github.com/pypeclub/pype/pull/726) -- TVPaint extract review fix [\#740](https://github.com/pypeclub/pype/pull/740) -- After Effects: Review were not being sent to ftrack [\#738](https://github.com/pypeclub/pype/pull/738) -- Maya: vray proxy was not loading [\#722](https://github.com/pypeclub/pype/pull/722) -- Maya: Vray expected file fixes [\#682](https://github.com/pypeclub/pype/pull/682) -- Missing audio on farm submission. [\#639](https://github.com/pypeclub/pype/pull/639) - -**Deprecated:** - -- Removed artist view from pyblish gui [\#717](https://github.com/pypeclub/pype/pull/717) -- Maya: disable legacy override check for cameras [\#715](https://github.com/pypeclub/pype/pull/715) - -**Merged pull requests:** - -- Application manager [\#728](https://github.com/pypeclub/pype/pull/728) -- Feature \#664 3.0 lib refactor [\#706](https://github.com/pypeclub/pype/pull/706) -- Lib from illicit part 2 [\#700](https://github.com/pypeclub/pype/pull/700) -- 3.0 lib refactor - path tools [\#697](https://github.com/pypeclub/pype/pull/697) - -## [2.13.7](https://github.com/pypeclub/pype/tree/2.13.7) (2020-11-19) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.6...2.13.7) - -**Fixed bugs:** - -- Standalone Publisher: getting fps from context instead of nonexistent entity [\#729](https://github.com/pypeclub/pype/pull/729) - -## [2.13.6](https://github.com/pypeclub/pype/tree/2.13.6) (2020-11-15) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.5...2.13.6) - -**Fixed bugs:** - -- Maya workfile version wasn't syncing with renders properly [\#711](https://github.com/pypeclub/pype/pull/711) -- Maya: Fix for publishing multiple cameras with review from the same scene [\#710](https://github.com/pypeclub/pype/pull/710) - -## [2.13.5](https://github.com/pypeclub/pype/tree/2.13.5) (2020-11-12) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.4...2.13.5) - -**Enhancements:** - -- 3.0 lib refactor [\#664](https://github.com/pypeclub/pype/issues/664) - -**Fixed bugs:** - -- Wrong thumbnail file was picked when publishing sequence in standalone publisher [\#703](https://github.com/pypeclub/pype/pull/703) -- Fix: Burnin data pass and FFmpeg tool check [\#701](https://github.com/pypeclub/pype/pull/701) - -## [2.13.4](https://github.com/pypeclub/pype/tree/2.13.4) (2020-11-09) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.3...2.13.4) - -**Enhancements:** - -- AfterEffects integration with Websocket [\#663](https://github.com/pypeclub/pype/issues/663) - -**Fixed bugs:** - -- Photoshop uhiding hidden layers [\#688](https://github.com/pypeclub/pype/issues/688) -- \#688 - Fix publishing hidden layers [\#692](https://github.com/pypeclub/pype/pull/692) - -**Closed issues:** - -- Nuke Favorite directories "shot dir" "project dir" - not working [\#684](https://github.com/pypeclub/pype/issues/684) - -**Merged pull requests:** - -- Nuke Favorite directories "shot dir" "project dir" - not working \#684 [\#685](https://github.com/pypeclub/pype/pull/685) - -## [2.13.3](https://github.com/pypeclub/pype/tree/2.13.3) (2020-11-03) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.2...2.13.3) - -**Enhancements:** - -- TV paint base integration [\#612](https://github.com/pypeclub/pype/issues/612) - -**Fixed bugs:** - -- Fix ffmpeg executable path with spaces [\#680](https://github.com/pypeclub/pype/pull/680) -- Hotfix: Added default version number [\#679](https://github.com/pypeclub/pype/pull/679) - -## [2.13.2](https://github.com/pypeclub/pype/tree/2.13.2) (2020-10-28) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.1...2.13.2) - -**Fixed bugs:** - -- Nuke: wrong conditions when fixing legacy write nodes [\#665](https://github.com/pypeclub/pype/pull/665) - -## [2.13.1](https://github.com/pypeclub/pype/tree/2.13.1) (2020-10-23) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.0...2.13.1) - -**Enhancements:** - -- move maya look assigner to pype menu [\#292](https://github.com/pypeclub/pype/issues/292) - -**Fixed bugs:** - -- Layer name is not propagating to metadata in Photoshop [\#654](https://github.com/pypeclub/pype/issues/654) -- Loader in Photoshop fails with "can't set attribute" [\#650](https://github.com/pypeclub/pype/issues/650) -- Nuke Load mp4 wrong frame range [\#661](https://github.com/pypeclub/pype/issues/661) -- Hiero: Review video file adding one frame to the end [\#659](https://github.com/pypeclub/pype/issues/659) - -## [2.13.0](https://github.com/pypeclub/pype/tree/2.13.0) (2020-10-18) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.5...2.13.0) - -**Enhancements:** - -- Deadline Output Folder [\#636](https://github.com/pypeclub/pype/issues/636) -- Nuke Camera Loader [\#565](https://github.com/pypeclub/pype/issues/565) -- Deadline publish job shows publishing output folder [\#649](https://github.com/pypeclub/pype/pull/649) -- Get latest version in lib [\#642](https://github.com/pypeclub/pype/pull/642) -- Improved publishing of multiple representation from SP [\#638](https://github.com/pypeclub/pype/pull/638) -- Launch TvPaint shot work file from within Ftrack [\#631](https://github.com/pypeclub/pype/pull/631) -- Add mp4 support for RV action. [\#628](https://github.com/pypeclub/pype/pull/628) -- Maya: allow renders to have version synced with workfile [\#618](https://github.com/pypeclub/pype/pull/618) -- Renaming nukestudio host folder to hiero [\#617](https://github.com/pypeclub/pype/pull/617) -- Harmony: More efficient publishing [\#615](https://github.com/pypeclub/pype/pull/615) -- Ftrack server action improvement [\#608](https://github.com/pypeclub/pype/pull/608) -- Deadline user defaults to pype username if present [\#607](https://github.com/pypeclub/pype/pull/607) -- Standalone publisher now has icon [\#606](https://github.com/pypeclub/pype/pull/606) -- Nuke render write targeting knob improvement [\#603](https://github.com/pypeclub/pype/pull/603) -- Animated pyblish gui [\#602](https://github.com/pypeclub/pype/pull/602) -- Maya: Deadline - make use of asset dependencies optional [\#591](https://github.com/pypeclub/pype/pull/591) -- Nuke: Publishing, loading and updating alembic cameras [\#575](https://github.com/pypeclub/pype/pull/575) -- Maya: add look assigner to pype menu even if scriptsmenu is not available [\#573](https://github.com/pypeclub/pype/pull/573) -- Store task types in the database [\#572](https://github.com/pypeclub/pype/pull/572) -- Maya: Tiled EXRs to scanline EXRs render option [\#512](https://github.com/pypeclub/pype/pull/512) -- Fusion basic integration [\#452](https://github.com/pypeclub/pype/pull/452) - -**Fixed bugs:** - -- Burnin script did not propagate ffmpeg output [\#640](https://github.com/pypeclub/pype/issues/640) -- Pyblish-pype spacer in terminal wasn't transparent [\#646](https://github.com/pypeclub/pype/pull/646) -- Lib subprocess without logger [\#645](https://github.com/pypeclub/pype/pull/645) -- Nuke: prevent crash if we only have single frame in sequence [\#644](https://github.com/pypeclub/pype/pull/644) -- Burnin script logs better output [\#641](https://github.com/pypeclub/pype/pull/641) -- Missing audio on farm submission. [\#639](https://github.com/pypeclub/pype/pull/639) -- review from imagesequence error [\#633](https://github.com/pypeclub/pype/pull/633) -- Hiero: wrong order of fps clip instance data collecting [\#627](https://github.com/pypeclub/pype/pull/627) -- Add source for review instances. [\#625](https://github.com/pypeclub/pype/pull/625) -- Task processing in event sync [\#623](https://github.com/pypeclub/pype/pull/623) -- sync to avalon doesn t remove renamed task [\#619](https://github.com/pypeclub/pype/pull/619) -- Intent publish setting wasn't working with default value [\#562](https://github.com/pypeclub/pype/pull/562) -- Maya: Updating a look where the shader name changed, leaves the geo without a shader [\#514](https://github.com/pypeclub/pype/pull/514) - -**Merged pull requests:** - -- Avalon module without Qt [\#581](https://github.com/pypeclub/pype/pull/581) -- Ftrack module without Qt [\#577](https://github.com/pypeclub/pype/pull/577) - -## [2.12.5](https://github.com/pypeclub/pype/tree/2.12.5) (2020-10-14) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.4...2.12.5) - -**Enhancements:** - -- Launch TvPaint shot work file from within Ftrack [\#629](https://github.com/pypeclub/pype/issues/629) - -**Merged pull requests:** - -- Harmony: Disable application launch logic [\#637](https://github.com/pypeclub/pype/pull/637) - -## [2.12.4](https://github.com/pypeclub/pype/tree/2.12.4) (2020-10-08) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.3...2.12.4) - -**Enhancements:** - -- convert nukestudio to hiero host [\#616](https://github.com/pypeclub/pype/issues/616) -- Fusion basic integration [\#451](https://github.com/pypeclub/pype/issues/451) - -**Fixed bugs:** - -- Sync to avalon doesn't remove renamed task [\#605](https://github.com/pypeclub/pype/issues/605) -- NukeStudio: FPS collecting into clip instances [\#624](https://github.com/pypeclub/pype/pull/624) - -**Merged pull requests:** - -- NukeStudio: small fixes [\#622](https://github.com/pypeclub/pype/pull/622) -- NukeStudio: broken order of plugins [\#620](https://github.com/pypeclub/pype/pull/620) - -## [2.12.3](https://github.com/pypeclub/pype/tree/2.12.3) (2020-10-06) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.2...2.12.3) - -**Enhancements:** - -- Nuke Publish Camera [\#567](https://github.com/pypeclub/pype/issues/567) -- Harmony: open xstage file no matter of its name [\#526](https://github.com/pypeclub/pype/issues/526) -- Stop integration of unwanted data [\#387](https://github.com/pypeclub/pype/issues/387) -- Move avalon-launcher functionality to pype [\#229](https://github.com/pypeclub/pype/issues/229) -- avalon workfiles api [\#214](https://github.com/pypeclub/pype/issues/214) -- Store task types [\#180](https://github.com/pypeclub/pype/issues/180) -- Avalon Mongo Connection split [\#136](https://github.com/pypeclub/pype/issues/136) -- nk camera workflow [\#71](https://github.com/pypeclub/pype/issues/71) -- Hiero integration added [\#590](https://github.com/pypeclub/pype/pull/590) -- Anatomy instance data collection is substantially faster for many instances [\#560](https://github.com/pypeclub/pype/pull/560) - -**Fixed bugs:** - -- test issue [\#596](https://github.com/pypeclub/pype/issues/596) -- Harmony: empty scene contamination [\#583](https://github.com/pypeclub/pype/issues/583) -- Edit publishing in SP doesn't respect shot selection for publishing [\#542](https://github.com/pypeclub/pype/issues/542) -- Pathlib breaks compatibility with python2 hosts [\#281](https://github.com/pypeclub/pype/issues/281) -- Updating a look where the shader name changed leaves the geo without a shader [\#237](https://github.com/pypeclub/pype/issues/237) -- Better error handling [\#84](https://github.com/pypeclub/pype/issues/84) -- Harmony: function signature [\#609](https://github.com/pypeclub/pype/pull/609) -- Nuke: gizmo publishing error [\#594](https://github.com/pypeclub/pype/pull/594) -- Harmony: fix clashing namespace of called js functions [\#584](https://github.com/pypeclub/pype/pull/584) -- Maya: fix maya scene type preset exception [\#569](https://github.com/pypeclub/pype/pull/569) - -**Closed issues:** - -- Nuke Gizmo publishing [\#597](https://github.com/pypeclub/pype/issues/597) -- nuke gizmo publishing error [\#592](https://github.com/pypeclub/pype/issues/592) -- Publish EDL [\#579](https://github.com/pypeclub/pype/issues/579) -- Publish render from SP [\#576](https://github.com/pypeclub/pype/issues/576) -- rename ftrack custom attribute group to `pype` [\#184](https://github.com/pypeclub/pype/issues/184) - -**Merged pull requests:** - -- Audio file existence check [\#614](https://github.com/pypeclub/pype/pull/614) -- NKS small fixes [\#587](https://github.com/pypeclub/pype/pull/587) -- Standalone publisher editorial plugins interfering [\#580](https://github.com/pypeclub/pype/pull/580) - -## [2.12.2](https://github.com/pypeclub/pype/tree/2.12.2) (2020-09-25) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.1...2.12.2) - -**Enhancements:** - -- pype config GUI [\#241](https://github.com/pypeclub/pype/issues/241) - -**Fixed bugs:** - -- Harmony: Saving heavy scenes will crash [\#507](https://github.com/pypeclub/pype/issues/507) -- Extract review a representation name with `\*\_burnin` [\#388](https://github.com/pypeclub/pype/issues/388) -- Hierarchy data was not considering active isntances [\#551](https://github.com/pypeclub/pype/pull/551) - -## [2.12.1](https://github.com/pypeclub/pype/tree/2.12.1) (2020-09-15) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.0...2.12.1) - -**Fixed bugs:** - -- Pype: changelog.md is outdated [\#503](https://github.com/pypeclub/pype/issues/503) -- dependency security alert ! [\#484](https://github.com/pypeclub/pype/issues/484) -- Maya: RenderSetup is missing update [\#106](https://github.com/pypeclub/pype/issues/106) -- \ extract effects creates new instance [\#78](https://github.com/pypeclub/pype/issues/78) - -## [2.12.0](https://github.com/pypeclub/pype/tree/2.12.0) (2020-09-10) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.8...2.12.0) - -**Enhancements:** - -- Less mongo connections [\#509](https://github.com/pypeclub/pype/pull/509) -- Nuke: adding image loader [\#499](https://github.com/pypeclub/pype/pull/499) -- Move launcher window to top if launcher action is clicked [\#450](https://github.com/pypeclub/pype/pull/450) -- Maya: better tile rendering support in Pype [\#446](https://github.com/pypeclub/pype/pull/446) -- Implementation of non QML launcher [\#443](https://github.com/pypeclub/pype/pull/443) -- Optional skip review on renders. [\#441](https://github.com/pypeclub/pype/pull/441) -- Ftrack: Option to push status from task to latest version [\#440](https://github.com/pypeclub/pype/pull/440) -- Properly containerize image plane loads. [\#434](https://github.com/pypeclub/pype/pull/434) -- Option to keep the review files. [\#426](https://github.com/pypeclub/pype/pull/426) -- Isolate view on instance members. [\#425](https://github.com/pypeclub/pype/pull/425) -- Maya: Publishing of tile renderings on Deadline [\#398](https://github.com/pypeclub/pype/pull/398) -- Feature/little bit better logging gui [\#383](https://github.com/pypeclub/pype/pull/383) - -**Fixed bugs:** - -- Maya: Fix tile order for Draft Tile Assembler [\#511](https://github.com/pypeclub/pype/pull/511) -- Remove extra dash [\#501](https://github.com/pypeclub/pype/pull/501) -- Fix: strip dot from repre names in single frame renders [\#498](https://github.com/pypeclub/pype/pull/498) -- Better handling of destination during integrating [\#485](https://github.com/pypeclub/pype/pull/485) -- Fix: allow thumbnail creation for single frame renders [\#460](https://github.com/pypeclub/pype/pull/460) -- added missing argument to launch\_application in ftrack app handler [\#453](https://github.com/pypeclub/pype/pull/453) -- Burnins: Copy bit rate of input video to match quality. [\#448](https://github.com/pypeclub/pype/pull/448) -- Standalone publisher is now independent from tray [\#442](https://github.com/pypeclub/pype/pull/442) -- Bugfix/empty enumerator attributes [\#436](https://github.com/pypeclub/pype/pull/436) -- Fixed wrong order of "other" category collapssing in publisher [\#435](https://github.com/pypeclub/pype/pull/435) -- Multiple reviews where being overwritten to one. [\#424](https://github.com/pypeclub/pype/pull/424) -- Cleanup plugin fail on instances without staging dir [\#420](https://github.com/pypeclub/pype/pull/420) -- deprecated -intra parameter in ffmpeg to new `-g` [\#417](https://github.com/pypeclub/pype/pull/417) -- Delivery action can now work with entered path [\#397](https://github.com/pypeclub/pype/pull/397) - -**Merged pull requests:** - -- Review on instance.data [\#473](https://github.com/pypeclub/pype/pull/473) - -## [2.11.8](https://github.com/pypeclub/pype/tree/2.11.8) (2020-08-27) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.7...2.11.8) - -**Enhancements:** - -- DWAA support for Maya [\#382](https://github.com/pypeclub/pype/issues/382) -- Isolate View on Playblast [\#367](https://github.com/pypeclub/pype/issues/367) -- Maya: Tile rendering [\#297](https://github.com/pypeclub/pype/issues/297) -- single pype instance running [\#47](https://github.com/pypeclub/pype/issues/47) -- PYPE-649: projects don't guarantee backwards compatible environment [\#8](https://github.com/pypeclub/pype/issues/8) -- PYPE-663: separate venv for each deployed version [\#7](https://github.com/pypeclub/pype/issues/7) - -**Fixed bugs:** - -- pyblish pype - other group is collapsed before plugins are done [\#431](https://github.com/pypeclub/pype/issues/431) -- Alpha white edges in harmony on PNGs [\#412](https://github.com/pypeclub/pype/issues/412) -- harmony image loader picks wrong representations [\#404](https://github.com/pypeclub/pype/issues/404) -- Clockify crash when response contain symbol not allowed by UTF-8 [\#81](https://github.com/pypeclub/pype/issues/81) - -## [2.11.7](https://github.com/pypeclub/pype/tree/2.11.7) (2020-08-21) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.6...2.11.7) - -**Fixed bugs:** - -- Clean Up Baked Movie [\#369](https://github.com/pypeclub/pype/issues/369) -- celaction last workfile [\#459](https://github.com/pypeclub/pype/pull/459) - -## [2.11.6](https://github.com/pypeclub/pype/tree/2.11.6) (2020-08-18) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.5...2.11.6) - -**Enhancements:** - -- publisher app [\#56](https://github.com/pypeclub/pype/issues/56) - -## [2.11.5](https://github.com/pypeclub/pype/tree/2.11.5) (2020-08-13) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.4...2.11.5) - -**Enhancements:** - -- Switch from master to equivalent [\#220](https://github.com/pypeclub/pype/issues/220) -- Standalone publisher now only groups sequence if the extension is known [\#439](https://github.com/pypeclub/pype/pull/439) - -**Fixed bugs:** - -- Logs have been disable for editorial by default to speed up publishing [\#433](https://github.com/pypeclub/pype/pull/433) -- additional fixes for celaction [\#430](https://github.com/pypeclub/pype/pull/430) -- Harmony: invalid variable scope in validate scene settings [\#428](https://github.com/pypeclub/pype/pull/428) -- new representation name for audio was not accepted [\#427](https://github.com/pypeclub/pype/pull/427) - -## [2.11.4](https://github.com/pypeclub/pype/tree/2.11.4) (2020-08-10) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.3...2.11.4) - -**Enhancements:** - -- WebSocket server [\#135](https://github.com/pypeclub/pype/issues/135) -- standalonepublisher: editorial family features expansion \[master branch\] [\#411](https://github.com/pypeclub/pype/pull/411) - -## [2.11.3](https://github.com/pypeclub/pype/tree/2.11.3) (2020-08-04) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.2...2.11.3) - -**Fixed bugs:** - -- Harmony: publishing performance issues [\#408](https://github.com/pypeclub/pype/pull/408) - -## [2.11.2](https://github.com/pypeclub/pype/tree/2.11.2) (2020-07-31) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.1...2.11.2) - -**Fixed bugs:** - -- Ftrack to Avalon bug [\#406](https://github.com/pypeclub/pype/issues/406) - -## [2.11.1](https://github.com/pypeclub/pype/tree/2.11.1) (2020-07-29) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.0...2.11.1) - -**Merged pull requests:** - -- Celaction: metadata json folder fixes on path [\#393](https://github.com/pypeclub/pype/pull/393) -- CelAction - version up method taken fro pype.lib [\#391](https://github.com/pypeclub/pype/pull/391) - - -## 2.11.0 ## - -_**release date:** 27 July 2020_ - -**new:** -- _(blender)_ namespace support [\#341](https://github.com/pypeclub/pype/pull/341) -- _(blender)_ start end frames [\#330](https://github.com/pypeclub/pype/pull/330) -- _(blender)_ camera asset [\#322](https://github.com/pypeclub/pype/pull/322) -- _(pype)_ toggle instances per family in pyblish GUI [\#320](https://github.com/pypeclub/pype/pull/320) -- _(pype)_ current release version is now shown in the tray menu [#379](https://github.com/pypeclub/pype/pull/379) - - -**improved:** -- _(resolve)_ tagging for publish [\#239](https://github.com/pypeclub/pype/issues/239) -- _(pype)_ Support publishing a subset of shots with standalone editorial [\#336](https://github.com/pypeclub/pype/pull/336) -- _(harmony)_ Basic support for palettes [\#324](https://github.com/pypeclub/pype/pull/324) -- _(photoshop)_ Flag outdated containers on startup and publish. [\#309](https://github.com/pypeclub/pype/pull/309) -- _(harmony)_ Flag Outdated containers [\#302](https://github.com/pypeclub/pype/pull/302) -- _(photoshop)_ Publish review [\#298](https://github.com/pypeclub/pype/pull/298) -- _(pype)_ Optional Last workfile launch [\#365](https://github.com/pypeclub/pype/pull/365) - - -**fixed:** -- _(premiere)_ workflow fixes [\#346](https://github.com/pypeclub/pype/pull/346) -- _(pype)_ pype-setup does not work with space in path [\#327](https://github.com/pypeclub/pype/issues/327) -- _(ftrack)_ Ftrack delete action cause circular error [\#206](https://github.com/pypeclub/pype/issues/206) -- _(nuke)_ Priority was forced to 50 [\#345](https://github.com/pypeclub/pype/pull/345) -- _(nuke)_ Fix ValidateNukeWriteKnobs [\#340](https://github.com/pypeclub/pype/pull/340) -- _(maya)_ If camera attributes are connected, we can ignore them. [\#339](https://github.com/pypeclub/pype/pull/339) -- _(pype)_ stop appending of tools environment to existing env [\#337](https://github.com/pypeclub/pype/pull/337) -- _(ftrack)_ Ftrack timeout needs to look at AVALON\_TIMEOUT [\#325](https://github.com/pypeclub/pype/pull/325) -- _(harmony)_ Only zip files are supported. [\#310](https://github.com/pypeclub/pype/pull/310) -- _(pype)_ hotfix/Fix event server mongo uri [\#305](https://github.com/pypeclub/pype/pull/305) -- _(photoshop)_ Subset was not named or validated correctly. [\#304](https://github.com/pypeclub/pype/pull/304) - - - - -## 2.10.0 ## - -_**release date:** 17 June 2020_ - -**new:** -- _(harmony)_ **Toon Boom Harmony** has been greatly extended to support rigging, scene build, animation and rendering workflows. [#270](https://github.com/pypeclub/pype/issues/270) [#271](https://github.com/pypeclub/pype/issues/271) [#190](https://github.com/pypeclub/pype/issues/190) [#191](https://github.com/pypeclub/pype/issues/191) [#172](https://github.com/pypeclub/pype/issues/172) [#168](https://github.com/pypeclub/pype/issues/168) -- _(pype)_ Added support for rudimentary **edl publishing** into individual shots. [#265](https://github.com/pypeclub/pype/issues/265) -- _(celaction)_ Simple **Celaction** integration has been added with support for workfiles and rendering. [#255](https://github.com/pypeclub/pype/issues/255) -- _(maya)_ Support for multiple job types when submitting to the farm. We can now render Maya or Standalone render jobs for Vray and Arnold (limited support for arnold) [#204](https://github.com/pypeclub/pype/issues/204) -- _(photoshop)_ Added initial support for Photoshop [#232](https://github.com/pypeclub/pype/issues/232) - -**improved:** -- _(blender)_ Updated support for rigs and added support Layout family [#233](https://github.com/pypeclub/pype/issues/233) [#226](https://github.com/pypeclub/pype/issues/226) -- _(premiere)_ It is now possible to choose different storage root for workfiles of different task types. [#255](https://github.com/pypeclub/pype/issues/255) -- _(maya)_ Support for unmerged AOVs in Redshift multipart EXRs [#197](https://github.com/pypeclub/pype/issues/197) -- _(pype)_ Pype repository has been refactored in preparation for 3.0 release [#169](https://github.com/pypeclub/pype/issues/169) -- _(deadline)_ All file dependencies are now passed to deadline from maya to prevent premature start of rendering if caches or textures haven't been coppied over yet. [#195](https://github.com/pypeclub/pype/issues/195) -- _(nuke)_ Script validation can now be made optional. [#194](https://github.com/pypeclub/pype/issues/194) -- _(pype)_ Publishing can now be stopped at any time. [#194](https://github.com/pypeclub/pype/issues/194) - -**fix:** -- _(pype)_ Pyblish-lite has been integrated into pype repository, plus various publishing GUI fixes. [#274](https://github.com/pypeclub/pype/issues/274) [#275](https://github.com/pypeclub/pype/issues/275) [#268](https://github.com/pypeclub/pype/issues/268) [#227](https://github.com/pypeclub/pype/issues/227) [#238](https://github.com/pypeclub/pype/issues/238) -- _(maya)_ Alembic extractor was getting wrong frame range type in certain scenarios [#254](https://github.com/pypeclub/pype/issues/254) -- _(maya)_ Attaching a render to subset in maya was not passing validation in certain scenarios [#256](https://github.com/pypeclub/pype/issues/256) -- _(ftrack)_ Various small fixes to ftrack sync [#263](https://github.com/pypeclub/pype/issues/263) [#259](https://github.com/pypeclub/pype/issues/259) -- _(maya)_ Look extraction is now able to skp invalid connections in shaders [#207](https://github.com/pypeclub/pype/issues/207) - - - - -## 2.9.0 ## - -_**release date:** 25 May 2020_ - -**new:** -- _(pype)_ Support for **Multiroot projects**. You can now store project data on multiple physical or virtual storages and target individual publishes to these locations. For instance render can be stored on a faster storage than the rest of the project. [#145](https://github.com/pypeclub/pype/issues/145), [#38](https://github.com/pypeclub/pype/issues/38) -- _(harmony)_ Basic implementation of **Toon Boom Harmony** has been added. [#142](https://github.com/pypeclub/pype/issues/142) -- _(pype)_ OSX support is in public beta now. There are issues to be expected, but the main implementation should be functional. [#141](https://github.com/pypeclub/pype/issues/141) - - -**improved:** - -- _(pype)_ **Review extractor** has been completely rebuilt. It now supports granular filtering so you can create **multiple outputs** for different tasks, families or hosts. [#103](https://github.com/pypeclub/pype/issues/103), [#166](https://github.com/pypeclub/pype/issues/166), [#165](https://github.com/pypeclub/pype/issues/165) -- _(pype)_ **Burnin** generation had been extended to **support same multi-output filtering** as review extractor [#103](https://github.com/pypeclub/pype/issues/103) -- _(pype)_ Publishing file templates can now be specified in config for each individual family [#114](https://github.com/pypeclub/pype/issues/114) -- _(pype)_ Studio specific plugins can now be appended to pype standard publishing plugins. [#112](https://github.com/pypeclub/pype/issues/112) -- _(nukestudio)_ Reviewable clips no longer need to be previously cut, exported and re-imported to timeline. **Pype can now dynamically cut reviewable quicktimes** from continuous offline footage during publishing. [#23](https://github.com/pypeclub/pype/issues/23) -- _(deadline)_ Deadline can now correctly differentiate between staging and production pype. [#154](https://github.com/pypeclub/pype/issues/154) -- _(deadline)_ `PYPE_PYTHON_EXE` env variable can now be used to direct publishing to explicit python installation. [#120](https://github.com/pypeclub/pype/issues/120) -- _(nuke)_ Nuke now check for new version of loaded data on file open. [#140](https://github.com/pypeclub/pype/issues/140) -- _(nuke)_ frame range and limit checkboxes are now exposed on write node. [#119](https://github.com/pypeclub/pype/issues/119) - - - -**fix:** - -- _(nukestudio)_ Project Location was using backslashes which was breaking nukestudio native exporting in certains configurations [#82](https://github.com/pypeclub/pype/issues/82) -- _(nukestudio)_ Duplicity in hierarchy tags was prone to throwing publishing error [#130](https://github.com/pypeclub/pype/issues/130), [#144](https://github.com/pypeclub/pype/issues/144) -- _(ftrack)_ multiple stability improvements [#157](https://github.com/pypeclub/pype/issues/157), [#159](https://github.com/pypeclub/pype/issues/159), [#128](https://github.com/pypeclub/pype/issues/128), [#118](https://github.com/pypeclub/pype/issues/118), [#127](https://github.com/pypeclub/pype/issues/127) -- _(deadline)_ multipart EXRs were stopping review publishing on the farm. They are still not supported for automatic review generation, but the publish will go through correctly without the quicktime. [#155](https://github.com/pypeclub/pype/issues/155) -- _(deadline)_ If deadline is non-responsive it will no longer freeze host when publishing [#149](https://github.com/pypeclub/pype/issues/149) -- _(deadline)_ Sometimes deadline was trying to launch render before all the source data was coppied over. [#137](https://github.com/pypeclub/pype/issues/137) _(harmony)_ Basic implementation of **Toon Boom Harmony** has been added. [#142](https://github.com/pypeclub/pype/issues/142) -- _(nuke)_ Filepath knob wasn't updated properly. [#131](https://github.com/pypeclub/pype/issues/131) -- _(maya)_ When extracting animation, the "Write Color Set" options on the instance were not respected. [#108](https://github.com/pypeclub/pype/issues/108) -- _(maya)_ Attribute overrides for AOV only worked for the legacy render layers. Now it works for new render setup as well [#132](https://github.com/pypeclub/pype/issues/132) -- _(maya)_ Stability and usability improvements in yeti workflow [#104](https://github.com/pypeclub/pype/issues/104) - - - - -## 2.8.0 ## - -_**release date:** 20 April 2020_ - -**new:** - -- _(pype)_ Option to generate slates from json templates. [PYPE-628] [#26](https://github.com/pypeclub/pype/issues/26) -- _(pype)_ It is now possible to automate loading of published subsets into any scene. Documentation will follow :). [PYPE-611] [#24](https://github.com/pypeclub/pype/issues/24) - -**fix:** - -- _(maya)_ Some Redshift render tokens could break publishing. [PYPE-778] [#33](https://github.com/pypeclub/pype/issues/33) -- _(maya)_ Publish was not preserving maya file extension. [#39](https://github.com/pypeclub/pype/issues/39) -- _(maya)_ Rig output validator was failing on nodes without shapes. [#40](https://github.com/pypeclub/pype/issues/40) -- _(maya)_ Yeti caches can now be properly versioned up in the scene inventory. [#40](https://github.com/pypeclub/pype/issues/40) -- _(nuke)_ Build first workfiles was not accepting jpeg sequences. [#34](https://github.com/pypeclub/pype/issues/34) -- _(deadline)_ Trying to generate ffmpeg review from multipart EXRs no longer crashes publishing. [PYPE-781] -- _(deadline)_ Render publishing is more stable in multiplatform environments. [PYPE-775] - - - - -## 2.7.0 ## - -_**release date:** 30 March 2020_ - -**new:** - -- _(maya)_ Artist can now choose to load multiple references of the same subset at once [PYPE-646, PYPS-81] -- _(nuke)_ Option to use named OCIO colorspaces for review colour baking. [PYPS-82] -- _(pype)_ Pype can now work with `master` versions for publishing and loading. These are non-versioned publishes that are overwritten with the latest version during publish. These are now supported in all the GUIs, but their publishing is deactivated by default. [PYPE-653] -- _(blender)_ Added support for basic blender workflow. We currently support `rig`, `model` and `animation` families. [PYPE-768] -- _(pype)_ Source timecode can now be used in burn-ins. [PYPE-777] -- _(pype)_ Review outputs profiles can now specify delivery resolution different than project setting [PYPE-759] -- _(nuke)_ Bookmark to current context is now added automatically to all nuke browser windows. [PYPE-712] - -**change:** - -- _(maya)_ It is now possible to publish camera without. baking. Keep in mind that unbaked cameras can't be guaranteed to work in other hosts. [PYPE-595] -- _(maya)_ All the renders from maya are now grouped in the loader by their Layer name. [PYPE-482] -- _(nuke/hiero)_ Any publishes from nuke and hiero can now be versioned independently of the workfile. [PYPE-728] - - -**fix:** - -- _(nuke)_ Mixed slashes caused issues in ocio config path. -- _(pype)_ Intent field in pyblish GUI was passing label instead of value to ftrack. [PYPE-733] -- _(nuke)_ Publishing of pre-renders was inconsistent. [PYPE-766] -- _(maya)_ Handles and frame ranges were inconsistent in various places during publishing. -- _(nuke)_ Nuke was crashing if it ran into certain missing knobs. For example DPX output missing `autocrop` [PYPE-774] -- _(deadline)_ Project overrides were not working properly with farm render publishing. -- _(hiero)_ Problems with single frame plates publishing. -- _(maya)_ Redshift RenderPass token were breaking render publishing. [PYPE-778] -- _(nuke)_ Build first workfile was not accepting jpeg sequences. -- _(maya)_ Multipart (Multilayer) EXRs were breaking review publishing due to FFMPEG incompatiblity [PYPE-781] - - - -## 2.6.0 ## - -_**release date:** 9 March 2020_ - -**change:** -- _(maya)_ render publishing has been simplified and made more robust. Render setup layers are now automatically added to publishing subsets and `render globals` family has been replaced with simple `render` [PYPE-570] -- _(avalon)_ change context and workfiles apps, have been merged into one, that allows both actions to be performed at the same time. [PYPE-747] -- _(pype)_ thumbnails are now automatically propagate to asset from the last published subset in the loader -- _(ftrack)_ publishing comment and intent are now being published to ftrack note as well as describtion. [PYPE-727] -- _(pype)_ when overriding existing version new old representations are now overriden, instead of the new ones just being appended. (to allow this behaviour, the version validator need to be disabled. [PYPE-690]) -- _(pype)_ burnin preset has been significantly simplified. It now doesn't require passing function to each field, but only need the actual text template. to use this, all the current burnin PRESETS MUST BE UPDATED for all the projects. -- _(ftrack)_ credentials are now stored on a per server basis, so it's possible to switch between ftrack servers without having to log in and out. [PYPE-723] - - -**new:** -- _(pype)_ production and development deployments now have different colour of the tray icon. Orange for Dev and Green for production [PYPE-718] -- _(maya)_ renders can now be attached to a publishable subset rather than creating their own subset. For example it is possible to create a reviewable `look` or `model` render and have it correctly attached as a representation of the subsets [PYPE-451] -- _(maya)_ after saving current scene into a new context (as a new shot for instance), all the scene publishing subsets data gets re-generated automatically to match the new context [PYPE-532] -- _(pype)_ we now support project specific publish, load and create plugins [PYPE-740] -- _(ftrack)_ new action that allow archiving/deleting old published versions. User can keep how many of the latest version to keep when the action is ran. [PYPE-748, PYPE-715] -- _(ftrack)_ it is now possible to monitor and restart ftrack event server using ftrack action. [PYPE-658] -- _(pype)_ validator that prevent accidental overwrites of previously published versions. [PYPE-680] -- _(avalon)_ avalon core updated to version 5.6.0 -- _(maya)_ added validator to make sure that relative paths are used when publishing arnold standins. -- _(nukestudio)_ it is now possible to extract and publish audio family from clip in nuke studio [PYPE-682] - -**fix**: -- _(maya)_ maya set framerange button was ignoring handles [PYPE-719] -- _(ftrack)_ sync to avalon was sometime crashing when ran on empty project -- _(nukestudio)_ publishing same shots after they've been previously archived/deleted would result in a crash. [PYPE-737] -- _(nuke)_ slate workflow was breaking in certain scenarios. [PYPE-730] -- _(pype)_ rendering publish workflow has been significantly improved to prevent error resulting from implicit render collection. [PYPE-665, PYPE-746] -- _(pype)_ launching application on a non-synced project resulted in obscure [PYPE-528] -- _(pype)_ missing keys in burnins no longer result in an error. [PYPE-706] -- _(ftrack)_ create folder structure action was sometimes failing for project managers due to wrong permissions. -- _(Nukestudio)_ using `source` in the start frame tag could result in wrong frame range calculation -- _(ftrack)_ sync to avalon action and event have been improved by catching more edge cases and provessing them properly. - - - -## 2.5.0 ## - -_**release date:** 11 Feb 2020_ - -**change:** -- _(pype)_ added many logs for easier debugging -- _(pype)_ review presets can now be separated between 2d and 3d renders [PYPE-693] -- _(pype)_ anatomy module has been greatly improved to allow for more dynamic pulblishing and faster debugging [PYPE-685] -- _(pype)_ avalon schemas have been moved from `pype-config` to `pype` repository, for simplification. [PYPE-670] -- _(ftrack)_ updated to latest ftrack API -- _(ftrack)_ publishing comments now appear in ftrack also as a note on version with customisable category [PYPE-645] -- _(ftrack)_ delete asset/subset action had been improved. It is now able to remove multiple entities and descendants of the selected entities [PYPE-361, PYPS-72] -- _(workfiles)_ added date field to workfiles app [PYPE-603] -- _(maya)_ old deprecated loader have been removed in favour of a single unified reference loader (old scenes will upgrade automatically to the new loader upon opening) [PYPE-633, PYPE-697] -- _(avalon)_ core updated to 5.5.15 [PYPE-671] -- _(nuke)_ library loader is now available in nuke [PYPE-698] - - -**new:** -- _(pype)_ added pype render wrapper to allow rendering on mixed platform farms. [PYPE-634] -- _(pype)_ added `pype launch` command. It let's admin run applications with dynamically built environment based on the given context. [PYPE-634] -- _(pype)_ added support for extracting review sequences with burnins [PYPE-657] -- _(publish)_ users can now set intent next to a comment when publishing. This will then be reflected on an attribute in ftrack. [PYPE-632] -- _(burnin)_ timecode can now be added to burnin -- _(burnin)_ datetime keys can now be added to burnin and anatomy [PYPE-651] -- _(burnin)_ anatomy templates can now be used in burnins. [PYPE=626] -- _(nuke)_ new validator for render resolution -- _(nuke)_ support for attach slate to nuke renders [PYPE-630] -- _(nuke)_ png sequences were added to loaders -- _(maya)_ added maya 2020 compatibility [PYPE-677] -- _(maya)_ ability to publish and load .ASS standin sequences [PYPS-54] -- _(pype)_ thumbnails can now be published and are visible in the loader. `AVALON_THUMBNAIL_ROOT` environment variable needs to be set for this to work [PYPE-573, PYPE-132] -- _(blender)_ base implementation of blender was added with publishing and loading of .blend files [PYPE-612] -- _(ftrack)_ new action for preparing deliveries [PYPE-639] - - -**fix**: -- _(burnin)_ more robust way of finding ffmpeg for burnins. -- _(pype)_ improved UNC paths remapping when sending to farm. -- _(pype)_ float frames sometimes made their way to representation context in database, breaking loaders [PYPE-668] -- _(pype)_ `pype install --force` was failing sometimes [PYPE-600] -- _(pype)_ padding in published files got calculated wrongly sometimes. It is now instead being always read from project anatomy. [PYPE-667] -- _(publish)_ comment publishing was failing in certain situations -- _(ftrack)_ multiple edge case scenario fixes in auto sync and sync-to-avalon action -- _(ftrack)_ sync to avalon now works on empty projects -- _(ftrack)_ thumbnail update event was failing when deleting entities [PYPE-561] -- _(nuke)_ loader applies proper colorspaces from Presets -- _(nuke)_ publishing handles didn't always work correctly [PYPE-686] -- _(maya)_ assembly publishing and loading wasn't working correctly - - - - - -## 2.4.0 ## - -_**release date:** 9 Dec 2019_ - -**change:** -- _(ftrack)_ version to status ftrack event can now be configured from Presets - - based on preset `presets/ftracc/ftrack_config.json["status_version_to_task"]` -- _(ftrack)_ sync to avalon event has been completely re-written. It now supports most of the project management situations on ftrack including moving, renaming and deleting entities, updating attributes and working with tasks. -- _(ftrack)_ sync to avalon action has been also re-writen. It is now much faster (up to 100 times depending on a project structure), has much better logging and reporting on encountered problems, and is able to handle much more complex situations. -- _(ftrack)_ sync to avalon trigger by checking `auto-sync` toggle on ftrack [PYPE-504] -- _(pype)_ various new features in the REST api -- _(pype)_ new visual identity used across pype -- _(pype)_ started moving all requirements to pip installation rather than vendorising them in pype repository. Due to a few yet unreleased packages, this means that pype can temporarily be only installed in the offline mode. - -**new:** -- _(nuke)_ support for publishing gizmos and loading them as viewer processes -- _(nuke)_ support for publishing nuke nodes from backdrops and loading them back -- _(pype)_ burnins can now work with start and end frames as keys - - use keys `{frame_start}`, `{frame_end}` and `{current_frame}` in burnin preset to use them. [PYPS-44,PYPS-73, PYPE-602] -- _(pype)_ option to filter logs by user and level in loggin GUI -- _(pype)_ image family added to standalone publisher [PYPE-574] -- _(pype)_ matchmove family added to standalone publisher [PYPE-574] -- _(nuke)_ validator for comparing arbitrary knobs with values from presets -- _(maya)_ option to force maya to copy textures in the new look publish rather than hardlinking them -- _(pype)_ comments from pyblish GUI are now being added to ftrack version -- _(maya)_ validator for checking outdated containers in the scene -- _(maya)_ option to publish and load arnold standin sequence [PYPE-579, PYPS-54] - -**fix**: -- _(pype)_ burnins were not respecting codec of the input video -- _(nuke)_ lot's of various nuke and nuke studio fixes across the board [PYPS-45] -- _(pype)_ workfiles app is not launching with the start of the app by default [PYPE-569] -- _(ftrack)_ ftrack integration during publishing was failing under certain situations [PYPS-66] -- _(pype)_ minor fixes in REST api -- _(ftrack)_ status change event was crashing when the target status was missing [PYPS-68] -- _(ftrack)_ actions will try to reconnect if they fail for some reason -- _(maya)_ problems with fps mapping when using float FPS values -- _(deadline)_ overall improvements to deadline publishing -- _(setup)_ environment variables are now remapped on the fly based on the platform pype is running on. This fixes many issues in mixed platform environments. - - - -## 2.3.6 # - -_**release date:** 27 Nov 2019_ - -**hotfix**: -- _(ftrack)_ was hiding important debug logo -- _(nuke)_ crashes during workfile publishing -- _(ftrack)_ event server crashes because of signal problems -- _(muster)_ problems with muster render submissions -- _(ftrack)_ thumbnail update event syntax errors - - -## 2.3.0 ## -_release date: 6 Oct 2019_ - -**new**: -- _(maya)_ support for yeti rigs and yeti caches -- _(maya)_ validator for comparing arbitrary attributes against ftrack -- _(pype)_ burnins can now show current date and time -- _(muster)_ pools can now be set in render globals in maya -- _(pype)_ Rest API has been implemented in beta stage -- _(nuke)_ LUT loader has been added -- _(pype)_ rudimentary user module has been added as preparation for user management -- _(pype)_ a simple logging GUI has been added to pype tray -- _(nuke)_ nuke can now bake input process into mov -- _(maya)_ imported models now have selection handle displayed by defaulting -- _(avalon)_ it's is now possible to load multiple assets at once using loader -- _(maya)_ added ability to automatically connect yeti rig to a mesh upon loading - -**changed**: -- _(ftrack)_ event server now runs two parallel processes and is able to keep queue of events to process. -- _(nuke)_ task name is now added to all rendered subsets -- _(pype)_ adding more families to standalone publisher -- _(pype)_ standalone publisher now uses pyblish-lite -- _(pype)_ standalone publisher can now create review quicktimes -- _(ftrack)_ queries to ftrack were sped up -- _(ftrack)_ multiple ftrack action have been deprecated -- _(avalon)_ avalon upstream has been updated to 5.5.0 -- _(nukestudio)_ published transforms can now be animated -- - -**fix**: -- _(maya)_ fps popup button didn't work in some cases -- _(maya)_ geometry instances and references in maya were losing shader assignments -- _(muster)_ muster rendering templates were not working correctly -- _(maya)_ arnold tx texture conversion wasn't respecting colorspace set by the artist -- _(pype)_ problems with avalon db sync -- _(maya)_ ftrack was rounding FPS making it inconsistent -- _(pype)_ wrong icon names in Creator -- _(maya)_ scene inventory wasn't showing anything if representation was removed from database after it's been loaded to the scene -- _(nukestudio)_ multiple bugs squashed -- _(loader)_ loader was taking long time to show all the loading action when first launcher in maya - -## 2.2.0 ## -_release date: 8 Sept 2019_ - -**new**: -- _(pype)_ add customisable workflow for creating quicktimes from renders or playblasts -- _(nuke)_ option to choose deadline chunk size on write nodes -- _(nukestudio)_ added option to publish soft effects (subTrackItems) from NukeStudio as subsets including LUT files. these can then be loaded in nuke or NukeStudio -- _(nuke)_ option to build nuke script from previously published latest versions of plate and render subsets. -- _(nuke)_ nuke writes now have deadline tab. -- _(ftrack)_ Prepare Project action can now be used for creating the base folder structure on disk and in ftrack, setting up all the initial project attributes and it automatically prepares `pype_project_config` folder for the given project. -- _(clockify)_ Added support for time tracking in clockify. This currently in addition to ftrack time logs, but does not completely replace them. -- _(pype)_ any attributes in Creator and Loader plugins can now be customised using pype preset system - -**changed**: -- nukestudio now uses workio API for workfiles -- _(maya)_ "FIX FPS" prompt in maya now appears in the middle of the screen -- _(muster)_ can now be configured with custom templates -- _(pype)_ global publishing plugins can now be configured using presets as well as host specific ones - - -**fix**: -- wrong version retrieval from path in certain scenarios -- nuke reset resolution wasn't working in certain scenarios - -## 2.1.0 ## -_release date: 6 Aug 2019_ - -A large cleanup release. Most of the change are under the hood. - -**new**: -- _(pype)_ add customisable workflow for creating quicktimes from renders or playblasts -- _(pype)_ Added configurable option to add burnins to any generated quicktimes -- _(ftrack)_ Action that identifies what machines pype is running on. -- _(system)_ unify subprocess calls -- _(maya)_ add audio to review quicktimes -- _(nuke)_ add crop before write node to prevent overscan problems in ffmpeg -- **Nuke Studio** publishing and workfiles support -- **Muster** render manager support -- _(nuke)_ Framerange, FPS and Resolution are set automatically at startup -- _(maya)_ Ability to load published sequences as image planes -- _(system)_ Ftrack event that sets asset folder permissions based on task assignees in ftrack. -- _(maya)_ Pyblish plugin that allow validation of maya attributes -- _(system)_ added better startup logging to tray debug, including basic connection information -- _(avalon)_ option to group published subsets to groups in the loader -- _(avalon)_ loader family filters are working now - -**changed**: -- change multiple key attributes to unify their behaviour across the pipeline - - `frameRate` to `fps` - - `startFrame` to `frameStart` - - `endFrame` to `frameEnd` - - `fstart` to `frameStart` - - `fend` to `frameEnd` - - `handle_start` to `handleStart` - - `handle_end` to `handleEnd` - - `resolution_width` to `resolutionWidth` - - `resolution_height` to `resolutionHeight` - - `pixel_aspect` to `pixelAspect` - -- _(nuke)_ write nodes are now created inside group with only some attributes editable by the artist -- rendered frames are now deleted from temporary location after their publishing is finished. -- _(ftrack)_ RV action can now be launched from any entity -- after publishing only refresh button is now available in pyblish UI -- added context instance pyblish-lite so that artist knows if context plugin fails -- _(avalon)_ allow opening selected files using enter key -- _(avalon)_ core updated to v5.2.9 with our forked changes on top - -**fix**: -- faster hierarchy retrieval from db -- _(nuke)_ A lot of stability enhancements -- _(nuke studio)_ A lot of stability enhancements -- _(nuke)_ now only renders a single write node on farm -- _(ftrack)_ pype would crash when launcher project level task -- work directory was sometimes not being created correctly -- major pype.lib cleanup. Removing of unused functions, merging those that were doing the same and general house cleaning. -- _(avalon)_ subsets in maya 2019 weren't behaving correctly in the outliner - - -\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 46dd9e5c0a..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,82 +0,0 @@ -# Build Pype docker image -FROM ubuntu:focal AS builder -ARG OPENPYPE_PYTHON_VERSION=3.9.12 -ARG BUILD_DATE -ARG VERSION - -LABEL maintainer="info@openpype.io" -LABEL description="Docker Image to build and run OpenPype under Ubuntu 20.04" -LABEL org.opencontainers.image.name="pypeclub/openpype" -LABEL org.opencontainers.image.title="OpenPype Docker Image" -LABEL org.opencontainers.image.url="https://openpype.io/" -LABEL org.opencontainers.image.source="https://github.com/pypeclub/OpenPype" -LABEL org.opencontainers.image.documentation="https://openpype.io/docs/system_introduction" -LABEL org.opencontainers.image.created=$BUILD_DATE -LABEL org.opencontainers.image.version=$VERSION - -USER root - -ARG DEBIAN_FRONTEND=noninteractive - -# update base -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - ca-certificates \ - bash \ - git \ - cmake \ - make \ - curl \ - wget \ - build-essential \ - checkinstall \ - libssl-dev \ - zlib1g-dev \ - libbz2-dev \ - libreadline-dev \ - libsqlite3-dev \ - llvm \ - libncursesw5-dev \ - xz-utils \ - tk-dev \ - libxml2-dev \ - libxmlsec1-dev \ - libffi-dev \ - liblzma-dev \ - patchelf - -SHELL ["/bin/bash", "-c"] - - -RUN mkdir /opt/openpype - -# download and install pyenv -RUN curl https://pyenv.run | bash \ - && echo 'export PATH="$HOME/.pyenv/bin:$PATH"'>> $HOME/init_pyenv.sh \ - && echo 'eval "$(pyenv init -)"' >> $HOME/init_pyenv.sh \ - && echo 'eval "$(pyenv virtualenv-init -)"' >> $HOME/init_pyenv.sh \ - && echo 'eval "$(pyenv init --path)"' >> $HOME/init_pyenv.sh - -# install python with pyenv -RUN source $HOME/init_pyenv.sh \ - && pyenv install ${OPENPYPE_PYTHON_VERSION} - -COPY . /opt/openpype/ - -RUN chmod +x /opt/openpype/tools/create_env.sh && chmod +x /opt/openpype/tools/build.sh - -WORKDIR /opt/openpype - -# set local python version -RUN cd /opt/openpype \ - && source $HOME/init_pyenv.sh \ - && pyenv local ${OPENPYPE_PYTHON_VERSION} - -# fetch third party tools/libraries -RUN source $HOME/init_pyenv.sh \ - && ./tools/create_env.sh \ - && ./tools/fetch_thirdparty_libs.sh - -# build openpype -RUN source $HOME/init_pyenv.sh \ - && bash ./tools/build.sh diff --git a/Dockerfile.centos7 b/Dockerfile.centos7 deleted file mode 100644 index ab1d3f8253..0000000000 --- a/Dockerfile.centos7 +++ /dev/null @@ -1,118 +0,0 @@ -# Build Pype docker image -FROM centos:7 AS builder -ARG OPENPYPE_PYTHON_VERSION=3.9.12 - -LABEL org.opencontainers.image.name="pypeclub/openpype" -LABEL org.opencontainers.image.title="OpenPype Docker Image" -LABEL org.opencontainers.image.url="https://openpype.io/" -LABEL org.opencontainers.image.source="https://github.com/pypeclub/pype" -LABEL org.opencontainers.image.documentation="https://openpype.io/docs/system_introduction" -LABEL org.opencontainers.image.created=$BUILD_DATE -LABEL org.opencontainers.image.version=$VERSION - - -USER root - -# update base -RUN yum -y install deltarpm \ - && yum -y update \ - && yum clean all - -# add tools we need -RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \ - && yum -y install centos-release-scl \ - && yum -y install \ - bash \ - which \ - git \ - make \ - devtoolset-7 \ - cmake \ - curl \ - wget \ - gcc \ - zlib-devel \ - pcre-devel \ - perl-core \ - bzip2 \ - bzip2-devel \ - readline-devel \ - sqlite sqlite-devel \ - openssl-devel \ - openssl-libs \ - openssl11-devel \ - openssl11-libs \ - tk-devel libffi-devel \ - patchelf \ - automake \ - autoconf \ - patch \ - ncurses \ - ncurses-devel \ - qt5-qtbase-devel \ - xcb-util-wm \ - xcb-util-renderutil \ - && yum clean all - -# we need to build our own patchelf -WORKDIR /temp-patchelf -RUN git clone -b 0.17.0 --single-branch https://github.com/NixOS/patchelf.git . \ - && source scl_source enable devtoolset-7 \ - && ./bootstrap.sh \ - && ./configure \ - && make \ - && make install - -RUN mkdir /opt/openpype -# RUN useradd -m pype -# RUN chown pype /opt/openpype -# USER pype - -RUN curl https://pyenv.run | bash -# ENV PYTHON_CONFIGURE_OPTS --enable-shared - -RUN echo 'export PATH="$HOME/.pyenv/bin:$PATH"'>> $HOME/.bashrc \ - && echo 'eval "$(pyenv init -)"' >> $HOME/.bashrc \ - && echo 'eval "$(pyenv virtualenv-init -)"' >> $HOME/.bashrc \ - && echo 'eval "$(pyenv init --path)"' >> $HOME/.bashrc -RUN source $HOME/.bashrc \ - && export CPPFLAGS="-I/usr/include/openssl11" \ - && export LDFLAGS="-L/usr/lib64/openssl11 -lssl -lcrypto" \ - && export PATH=/usr/local/openssl/bin:$PATH \ - && export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH \ - && pyenv install ${OPENPYPE_PYTHON_VERSION} - -COPY . /opt/openpype/ -RUN rm -rf /openpype/.poetry || echo "No Poetry installed yet." -# USER root -# RUN chown -R pype /opt/openpype -RUN chmod +x /opt/openpype/tools/create_env.sh && chmod +x /opt/openpype/tools/build.sh - -# USER pype - -WORKDIR /opt/openpype - -RUN cd /opt/openpype \ - && source $HOME/.bashrc \ - && pyenv local ${OPENPYPE_PYTHON_VERSION} - -RUN source $HOME/.bashrc \ - && ./tools/create_env.sh - -RUN source $HOME/.bashrc \ - && ./tools/fetch_thirdparty_libs.sh - -RUN echo 'export PYTHONPATH="/opt/openpype/vendor/python:$PYTHONPATH"'>> $HOME/.bashrc -RUN source $HOME/.bashrc \ - && bash ./tools/build.sh - -RUN cp /usr/lib64/libffi* ./build/exe.linux-x86_64-3.9/lib \ - && cp /usr/lib64/openssl11/libssl* ./build/exe.linux-x86_64-3.9/lib \ - && cp /usr/lib64/openssl11/libcrypto* ./build/exe.linux-x86_64-3.9/lib \ - && ln -sr ./build/exe.linux-x86_64-3.9/lib/libssl.so ./build/exe.linux-x86_64-3.9/lib/libssl.1.1.so \ - && ln -sr ./build/exe.linux-x86_64-3.9/lib/libcrypto.so ./build/exe.linux-x86_64-3.9/lib/libcrypto.1.1.so \ - && cp /root/.pyenv/versions/${OPENPYPE_PYTHON_VERSION}/lib/libpython* ./build/exe.linux-x86_64-3.9/lib \ - && cp /usr/lib64/libxcb* ./build/exe.linux-x86_64-3.9/vendor/python/PySide2/Qt/lib - -RUN cd /opt/openpype \ - rm -rf ./vendor/bin diff --git a/Dockerfile.debian b/Dockerfile.debian deleted file mode 100644 index a53b5aa769..0000000000 --- a/Dockerfile.debian +++ /dev/null @@ -1,81 +0,0 @@ -# Build Pype docker image -FROM debian:bullseye AS builder -ARG OPENPYPE_PYTHON_VERSION=3.9.12 -ARG BUILD_DATE -ARG VERSION - -LABEL maintainer="info@openpype.io" -LABEL description="Docker Image to build and run OpenPype under Ubuntu 20.04" -LABEL org.opencontainers.image.name="pypeclub/openpype" -LABEL org.opencontainers.image.title="OpenPype Docker Image" -LABEL org.opencontainers.image.url="https://openpype.io/" -LABEL org.opencontainers.image.source="https://github.com/pypeclub/OpenPype" -LABEL org.opencontainers.image.documentation="https://openpype.io/docs/system_introduction" -LABEL org.opencontainers.image.created=$BUILD_DATE -LABEL org.opencontainers.image.version=$VERSION - -USER root - -ARG DEBIAN_FRONTEND=noninteractive - -# update base -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - ca-certificates \ - bash \ - git \ - cmake \ - make \ - curl \ - wget \ - build-essential \ - libssl-dev \ - zlib1g-dev \ - libbz2-dev \ - libreadline-dev \ - libsqlite3-dev \ - llvm \ - libncursesw5-dev \ - xz-utils \ - tk-dev \ - libxml2-dev \ - libxmlsec1-dev \ - libffi-dev \ - liblzma-dev \ - patchelf - -SHELL ["/bin/bash", "-c"] - - -RUN mkdir /opt/openpype - -# download and install pyenv -RUN curl https://pyenv.run | bash \ - && echo 'export PATH="$HOME/.pyenv/bin:$PATH"'>> $HOME/init_pyenv.sh \ - && echo 'eval "$(pyenv init -)"' >> $HOME/init_pyenv.sh \ - && echo 'eval "$(pyenv virtualenv-init -)"' >> $HOME/init_pyenv.sh \ - && echo 'eval "$(pyenv init --path)"' >> $HOME/init_pyenv.sh - -# install python with pyenv -RUN source $HOME/init_pyenv.sh \ - && pyenv install ${OPENPYPE_PYTHON_VERSION} - -COPY . /opt/openpype/ - -RUN chmod +x /opt/openpype/tools/create_env.sh && chmod +x /opt/openpype/tools/build.sh - -WORKDIR /opt/openpype - -# set local python version -RUN cd /opt/openpype \ - && source $HOME/init_pyenv.sh \ - && pyenv local ${OPENPYPE_PYTHON_VERSION} - -# fetch third party tools/libraries -RUN source $HOME/init_pyenv.sh \ - && ./tools/create_env.sh \ - && ./tools/fetch_thirdparty_libs.sh - -# build openpype -RUN source $HOME/init_pyenv.sh \ - && bash ./tools/build.sh diff --git a/HISTORY.md b/HISTORY.md deleted file mode 100644 index 543cf11513..0000000000 --- a/HISTORY.md +++ /dev/null @@ -1,3808 +0,0 @@ -# Changelog - -## [3.15.0](https://github.com/ynput/OpenPype/tree/3.15.0) - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.14.10...3.15.0) - -**Deprecated:** - -- General: Fill default values of new publish template profiles [\#4245](https://github.com/ynput/OpenPype/pull/4245) - -### ๐Ÿ“– Documentation - -- documentation: Split tools into separate entries [\#4342](https://github.com/ynput/OpenPype/pull/4342) -- Documentation: Fix harmony docs [\#4301](https://github.com/ynput/OpenPype/pull/4301) -- Remove staging logic set by OpenPype version [\#3979](https://github.com/ynput/OpenPype/pull/3979) - -**๐Ÿ†• New features** - -- General: Push to studio library [\#4284](https://github.com/ynput/OpenPype/pull/4284) -- Colorspace Management and Distribution [\#4195](https://github.com/ynput/OpenPype/pull/4195) -- Nuke: refactor to latest publisher workfow [\#4006](https://github.com/ynput/OpenPype/pull/4006) -- Update to Python 3.9 [\#3546](https://github.com/ynput/OpenPype/pull/3546) - -**๐Ÿš€ Enhancements** - -- Unreal: Don't use mongo queries in 'ExistingLayoutLoader' [\#4356](https://github.com/ynput/OpenPype/pull/4356) -- General: Loader and Creator plugins can be disabled [\#4310](https://github.com/ynput/OpenPype/pull/4310) -- General: Unbind poetry version [\#4306](https://github.com/ynput/OpenPype/pull/4306) -- General: Enhanced enum def items [\#4295](https://github.com/ynput/OpenPype/pull/4295) -- Git: add pre-commit hooks [\#4289](https://github.com/ynput/OpenPype/pull/4289) -- Tray Publisher: Improve Online family functionality [\#4263](https://github.com/ynput/OpenPype/pull/4263) -- General: Update MacOs to PySide6 [\#4255](https://github.com/ynput/OpenPype/pull/4255) -- Build: update to Gazu in toml [\#4208](https://github.com/ynput/OpenPype/pull/4208) -- Global: adding imageio to settings [\#4158](https://github.com/ynput/OpenPype/pull/4158) -- Blender: added project settings for validator no colons in name [\#4149](https://github.com/ynput/OpenPype/pull/4149) -- Dockerfile for Debian Bullseye [\#4108](https://github.com/ynput/OpenPype/pull/4108) -- AfterEffects: publish multiple compositions [\#4092](https://github.com/ynput/OpenPype/pull/4092) -- AfterEffects: make new publisher default [\#4056](https://github.com/ynput/OpenPype/pull/4056) -- Photoshop: make new publisher default [\#4051](https://github.com/ynput/OpenPype/pull/4051) -- Feature/multiverse [\#4046](https://github.com/ynput/OpenPype/pull/4046) -- Tests: add support for deadline for automatic tests [\#3989](https://github.com/ynput/OpenPype/pull/3989) -- Add version to shortcut name [\#3906](https://github.com/ynput/OpenPype/pull/3906) -- TrayPublisher: Removed from experimental tools [\#3667](https://github.com/ynput/OpenPype/pull/3667) - -**๐Ÿ› Bug fixes** - -- change 3.7 to 3.9 in folder name [\#4354](https://github.com/ynput/OpenPype/pull/4354) -- PushToProject: Fix hierarchy of project change [\#4350](https://github.com/ynput/OpenPype/pull/4350) -- Fix photoshop workfile save-as [\#4347](https://github.com/ynput/OpenPype/pull/4347) -- Nuke Input process node sourcing improvements [\#4341](https://github.com/ynput/OpenPype/pull/4341) -- New publisher: Some validation plugin tweaks [\#4339](https://github.com/ynput/OpenPype/pull/4339) -- Harmony: fix unable to change workfile on Mac [\#4334](https://github.com/ynput/OpenPype/pull/4334) -- Global: fixing in-place source publishing for editorial [\#4333](https://github.com/ynput/OpenPype/pull/4333) -- General: Use class constants of QMessageBox [\#4332](https://github.com/ynput/OpenPype/pull/4332) -- TVPaint: Fix plugin for TVPaint 11.7 [\#4328](https://github.com/ynput/OpenPype/pull/4328) -- Exctract OTIO review has improved quality [\#4325](https://github.com/ynput/OpenPype/pull/4325) -- Ftrack: fix typos causing bugs in sync [\#4322](https://github.com/ynput/OpenPype/pull/4322) -- General: Python 2 compatibility of instance collector [\#4320](https://github.com/ynput/OpenPype/pull/4320) -- Slack: user groups speedup [\#4318](https://github.com/ynput/OpenPype/pull/4318) -- Maya: Bug - Multiverse extractor executed on plain animation family [\#4315](https://github.com/ynput/OpenPype/pull/4315) -- Fix run\_documentation.ps1 [\#4312](https://github.com/ynput/OpenPype/pull/4312) -- Nuke: new creators fixes [\#4308](https://github.com/ynput/OpenPype/pull/4308) -- General: missing comment on standalone and tray publisher [\#4303](https://github.com/ynput/OpenPype/pull/4303) -- AfterEffects: Fix for audio from mp4 layer [\#4296](https://github.com/ynput/OpenPype/pull/4296) -- General: Update gazu in poetry lock [\#4247](https://github.com/ynput/OpenPype/pull/4247) -- Bug: Fixing version detection and filtering in Igniter [\#3914](https://github.com/ynput/OpenPype/pull/3914) -- Bug: Create missing version dir [\#3903](https://github.com/ynput/OpenPype/pull/3903) - -**๐Ÿ”€ Refactored code** - -- Remove redundant export\_alembic method. [\#4293](https://github.com/ynput/OpenPype/pull/4293) -- Igniter: Use qtpy modules instead of Qt [\#4237](https://github.com/ynput/OpenPype/pull/4237) - -**Merged pull requests:** - -- Sort families by alphabetical order in the Create plugin [\#4346](https://github.com/ynput/OpenPype/pull/4346) -- Global: Validate unique subsets [\#4336](https://github.com/ynput/OpenPype/pull/4336) -- Maya: Collect instances preserve handles even if frameStart + frameEnd matches context [\#3437](https://github.com/ynput/OpenPype/pull/3437) - - -## [3.14.10](https://github.com/ynput/OpenPype/tree/3.14.10) - -[Full Changelog](https://github.com/ynput/OpenPype/compare/3.14.9...3.14.10) - -**๐Ÿ†• New features** - -- Global | Nuke: Creator placeholders in workfile template builder [\#4266](https://github.com/ynput/OpenPype/pull/4266) -- Slack: Added dynamic message [\#4265](https://github.com/ynput/OpenPype/pull/4265) -- Blender: Workfile Loader [\#4234](https://github.com/ynput/OpenPype/pull/4234) -- Unreal: Publishing and Loading for UAssets [\#4198](https://github.com/ynput/OpenPype/pull/4198) -- Publish: register publishes without copying them [\#4157](https://github.com/ynput/OpenPype/pull/4157) - -**๐Ÿš€ Enhancements** - -- General: Added install method with docstring to HostBase [\#4298](https://github.com/ynput/OpenPype/pull/4298) -- Traypublisher: simple editorial multiple edl [\#4248](https://github.com/ynput/OpenPype/pull/4248) -- General: Extend 'IPluginPaths' to have more available methods [\#4214](https://github.com/ynput/OpenPype/pull/4214) -- Refactorization of folder coloring [\#4211](https://github.com/ynput/OpenPype/pull/4211) -- Flame - loading multilayer with controlled layer names [\#4204](https://github.com/ynput/OpenPype/pull/4204) - -**๐Ÿ› Bug fixes** - -- Unreal: fix missing `maintained_selection` call [\#4300](https://github.com/ynput/OpenPype/pull/4300) -- Ftrack: Fix receive of host ip on MacOs [\#4288](https://github.com/ynput/OpenPype/pull/4288) -- SiteSync: sftp connection failing when shouldnt be tested [\#4278](https://github.com/ynput/OpenPype/pull/4278) -- Deadline: fix default value for passing mongo url [\#4275](https://github.com/ynput/OpenPype/pull/4275) -- Scene Manager: Fix variable name [\#4268](https://github.com/ynput/OpenPype/pull/4268) -- Slack: notification fails because of missing published path [\#4264](https://github.com/ynput/OpenPype/pull/4264) -- hiero: creator gui with min max [\#4257](https://github.com/ynput/OpenPype/pull/4257) -- NiceCheckbox: Fix checker positioning in Python 2 [\#4253](https://github.com/ynput/OpenPype/pull/4253) -- Publisher: Fix 'CreatorType' not equal for Python 2 DCCs [\#4249](https://github.com/ynput/OpenPype/pull/4249) -- Deadline: fix dependencies [\#4242](https://github.com/ynput/OpenPype/pull/4242) -- Houdini: hotfix instance data access [\#4236](https://github.com/ynput/OpenPype/pull/4236) -- bugfix/image plane load error [\#4222](https://github.com/ynput/OpenPype/pull/4222) -- Hiero: thumbnail from multilayer exr [\#4209](https://github.com/ynput/OpenPype/pull/4209) - -**๐Ÿ”€ Refactored code** - -- Resolve: Use qtpy in Resolve [\#4254](https://github.com/ynput/OpenPype/pull/4254) -- Houdini: Use qtpy in Houdini [\#4252](https://github.com/ynput/OpenPype/pull/4252) -- Max: Use qtpy in Max [\#4251](https://github.com/ynput/OpenPype/pull/4251) -- Maya: Use qtpy in Maya [\#4250](https://github.com/ynput/OpenPype/pull/4250) -- Hiero: Use qtpy in Hiero [\#4240](https://github.com/ynput/OpenPype/pull/4240) -- Nuke: Use qtpy in Nuke [\#4239](https://github.com/ynput/OpenPype/pull/4239) -- Flame: Use qtpy in flame [\#4238](https://github.com/ynput/OpenPype/pull/4238) -- General: Legacy io not used in global plugins [\#4134](https://github.com/ynput/OpenPype/pull/4134) - -**Merged pull requests:** - -- Bump json5 from 1.0.1 to 1.0.2 in /website [\#4292](https://github.com/ynput/OpenPype/pull/4292) -- Maya: Fix validate frame range repair + fix create render with deadline disabled [\#4279](https://github.com/ynput/OpenPype/pull/4279) - - -## [3.14.9](https://github.com/pypeclub/OpenPype/tree/3.14.9) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.8...3.14.9) - -### ๐Ÿ“– Documentation - -- Documentation: Testing on Deadline [\#4185](https://github.com/pypeclub/OpenPype/pull/4185) -- Consistent Python version [\#4160](https://github.com/pypeclub/OpenPype/pull/4160) - -**๐Ÿ†• New features** - -- Feature/op 4397 gl tf extractor for maya [\#4192](https://github.com/pypeclub/OpenPype/pull/4192) -- Maya: Extractor for Unreal SkeletalMesh [\#4174](https://github.com/pypeclub/OpenPype/pull/4174) -- 3dsmax: integration [\#4168](https://github.com/pypeclub/OpenPype/pull/4168) -- Blender: Extract Alembic Animations [\#4128](https://github.com/pypeclub/OpenPype/pull/4128) -- Unreal: Load Alembic Animations [\#4127](https://github.com/pypeclub/OpenPype/pull/4127) - -**๐Ÿš€ Enhancements** - -- Houdini: Use new interface class name for publish host [\#4220](https://github.com/pypeclub/OpenPype/pull/4220) -- General: Default command for headless mode is interactive [\#4203](https://github.com/pypeclub/OpenPype/pull/4203) -- Maya: Enhanced ASS publishing [\#4196](https://github.com/pypeclub/OpenPype/pull/4196) -- Feature/op 3924 implement ass extractor [\#4188](https://github.com/pypeclub/OpenPype/pull/4188) -- File transactions: Source path is destination path [\#4184](https://github.com/pypeclub/OpenPype/pull/4184) -- Deadline: improve environment processing [\#4182](https://github.com/pypeclub/OpenPype/pull/4182) -- General: Comment per instance in Publisher [\#4178](https://github.com/pypeclub/OpenPype/pull/4178) -- Ensure Mongo database directory exists in Windows. [\#4166](https://github.com/pypeclub/OpenPype/pull/4166) -- Note about unrestricted execution on Windows. [\#4161](https://github.com/pypeclub/OpenPype/pull/4161) -- Maya: Enable thumbnail transparency on extraction. [\#4147](https://github.com/pypeclub/OpenPype/pull/4147) -- Maya: Disable viewport Pan/Zoom on playblast extraction. [\#4146](https://github.com/pypeclub/OpenPype/pull/4146) -- Maya: Optional viewport refresh on pointcache extraction [\#4144](https://github.com/pypeclub/OpenPype/pull/4144) -- CelAction: refactory integration to current openpype [\#4140](https://github.com/pypeclub/OpenPype/pull/4140) -- Maya: create and publish bounding box geometry [\#4131](https://github.com/pypeclub/OpenPype/pull/4131) -- Changed the UOpenPypePublishInstance to use the UDataAsset class [\#4124](https://github.com/pypeclub/OpenPype/pull/4124) -- General: Collection Audio speed up [\#4110](https://github.com/pypeclub/OpenPype/pull/4110) -- Maya: keep existing AOVs when creating render instance [\#4087](https://github.com/pypeclub/OpenPype/pull/4087) -- General: Oiio conversion multipart fix [\#4060](https://github.com/pypeclub/OpenPype/pull/4060) - -**๐Ÿ› Bug fixes** - -- Publisher: Signal type issues in Python 2 DCCs [\#4230](https://github.com/pypeclub/OpenPype/pull/4230) -- Blender: Fix Layout Family Versioning [\#4228](https://github.com/pypeclub/OpenPype/pull/4228) -- Blender: Fix Create Camera "Use selection" [\#4226](https://github.com/pypeclub/OpenPype/pull/4226) -- TrayPublisher - join needs list [\#4224](https://github.com/pypeclub/OpenPype/pull/4224) -- General: Event callbacks pass event to callbacks as expected [\#4210](https://github.com/pypeclub/OpenPype/pull/4210) -- Build:Revert .toml update of Gazu [\#4207](https://github.com/pypeclub/OpenPype/pull/4207) -- Nuke: fixed imageio node overrides subset filter [\#4202](https://github.com/pypeclub/OpenPype/pull/4202) -- Maya: pointcache [\#4201](https://github.com/pypeclub/OpenPype/pull/4201) -- Unreal: Support for Unreal Engine 5.1 [\#4199](https://github.com/pypeclub/OpenPype/pull/4199) -- General: Integrate thumbnail looks for thumbnail to multiple places [\#4181](https://github.com/pypeclub/OpenPype/pull/4181) -- Various minor bugfixes [\#4172](https://github.com/pypeclub/OpenPype/pull/4172) -- Nuke/Hiero: Remove tkinter library paths before launch [\#4171](https://github.com/pypeclub/OpenPype/pull/4171) -- Flame: vertical alignment of layers [\#4169](https://github.com/pypeclub/OpenPype/pull/4169) -- Nuke: correct detection of viewer and display [\#4165](https://github.com/pypeclub/OpenPype/pull/4165) -- Settings UI: Don't create QApplication if already exists [\#4156](https://github.com/pypeclub/OpenPype/pull/4156) -- General: Extract review handle start offset of sequences [\#4152](https://github.com/pypeclub/OpenPype/pull/4152) -- Maya: Maintain time connections on Alembic update. [\#4143](https://github.com/pypeclub/OpenPype/pull/4143) - -**๐Ÿ”€ Refactored code** - -- General: Use qtpy in modules and hosts UIs which are running in OpenPype process [\#4225](https://github.com/pypeclub/OpenPype/pull/4225) -- Tools: Use qtpy instead of Qt in standalone tools [\#4223](https://github.com/pypeclub/OpenPype/pull/4223) -- General: Use qtpy in settings UI [\#4215](https://github.com/pypeclub/OpenPype/pull/4215) - -**Merged pull requests:** - -- layout publish more than one container issue [\#4098](https://github.com/pypeclub/OpenPype/pull/4098) - -## [3.14.8](https://github.com/pypeclub/OpenPype/tree/3.14.8) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.7...3.14.8) - -**๐Ÿš€ Enhancements** - -- General: Refactored extract hierarchy plugin [\#4139](https://github.com/pypeclub/OpenPype/pull/4139) -- General: Find executable enhancement [\#4137](https://github.com/pypeclub/OpenPype/pull/4137) -- Ftrack: Reset session before instance processing [\#4129](https://github.com/pypeclub/OpenPype/pull/4129) -- Ftrack: Editorial asset sync issue [\#4126](https://github.com/pypeclub/OpenPype/pull/4126) -- Deadline: Build version resolving [\#4115](https://github.com/pypeclub/OpenPype/pull/4115) -- Houdini: New Publisher [\#3046](https://github.com/pypeclub/OpenPype/pull/3046) -- Fix: Standalone Publish Directories [\#4148](https://github.com/pypeclub/OpenPype/pull/4148) - -**๐Ÿ› Bug fixes** - -- Ftrack: Fix occational double parents issue [\#4153](https://github.com/pypeclub/OpenPype/pull/4153) -- General: Maketx executable issue [\#4136](https://github.com/pypeclub/OpenPype/pull/4136) -- Maya: Looks - add all connections [\#4135](https://github.com/pypeclub/OpenPype/pull/4135) -- General: Fix variable check in collect anatomy instance data [\#4117](https://github.com/pypeclub/OpenPype/pull/4117) - -## [3.14.7](https://github.com/pypeclub/OpenPype/tree/3.14.7) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.6...3.14.7) - -**๐Ÿ†• New features** - -- Hiero: loading effect family to timeline [\#4055](https://github.com/pypeclub/OpenPype/pull/4055) - -**๐Ÿš€ Enhancements** - -- Photoshop: bug with pop-up window on Instance Creator [\#4121](https://github.com/pypeclub/OpenPype/pull/4121) -- Publisher: Open on specific tab [\#4120](https://github.com/pypeclub/OpenPype/pull/4120) -- Publisher: Hide unknown publish values [\#4116](https://github.com/pypeclub/OpenPype/pull/4116) -- Ftrack: Event server status give more information about version locations [\#4112](https://github.com/pypeclub/OpenPype/pull/4112) -- General: Allow higher numbers in frames and clips [\#4101](https://github.com/pypeclub/OpenPype/pull/4101) -- Publisher: Settings for validate frame range [\#4097](https://github.com/pypeclub/OpenPype/pull/4097) -- Publisher: Ignore escape button [\#4090](https://github.com/pypeclub/OpenPype/pull/4090) -- Flame: Loading clip with native colorspace resolved from mapping [\#4079](https://github.com/pypeclub/OpenPype/pull/4079) -- General: Extract review single frame output [\#4064](https://github.com/pypeclub/OpenPype/pull/4064) -- Publisher: Prepared common function for instance data cache [\#4063](https://github.com/pypeclub/OpenPype/pull/4063) -- Publisher: Easy access to publish page from create page [\#4058](https://github.com/pypeclub/OpenPype/pull/4058) -- General/TVPaint: Attribute defs dialog [\#4052](https://github.com/pypeclub/OpenPype/pull/4052) -- Publisher: Better reset defer [\#4048](https://github.com/pypeclub/OpenPype/pull/4048) -- Publisher: Add thumbnail sources [\#4042](https://github.com/pypeclub/OpenPype/pull/4042) - -**๐Ÿ› Bug fixes** - -- General: Move default settings for template name [\#4119](https://github.com/pypeclub/OpenPype/pull/4119) -- Slack: notification fail in new tray publisher [\#4118](https://github.com/pypeclub/OpenPype/pull/4118) -- Nuke: loaded nodes set to first tab [\#4114](https://github.com/pypeclub/OpenPype/pull/4114) -- Nuke: load image first frame [\#4113](https://github.com/pypeclub/OpenPype/pull/4113) -- Files Widget: Ignore case sensitivity of extensions [\#4096](https://github.com/pypeclub/OpenPype/pull/4096) -- Webpublisher: extension is lowercased in Setting and in uploaded files [\#4095](https://github.com/pypeclub/OpenPype/pull/4095) -- Publish Report Viewer: Fix small bugs [\#4086](https://github.com/pypeclub/OpenPype/pull/4086) -- Igniter: fix regex to match semver better [\#4085](https://github.com/pypeclub/OpenPype/pull/4085) -- Maya: aov filtering [\#4083](https://github.com/pypeclub/OpenPype/pull/4083) -- Flame/Flare: Loading to multiple batches [\#4080](https://github.com/pypeclub/OpenPype/pull/4080) -- hiero: creator from settings with set maximum [\#4077](https://github.com/pypeclub/OpenPype/pull/4077) -- Nuke: resolve hashes in file name only for frame token [\#4074](https://github.com/pypeclub/OpenPype/pull/4074) -- Publisher: Fix cache of asset docs [\#4070](https://github.com/pypeclub/OpenPype/pull/4070) -- Webpublisher: cleanup wp extract thumbnail [\#4067](https://github.com/pypeclub/OpenPype/pull/4067) -- Settings UI: Locked setting can't bypass lock [\#4066](https://github.com/pypeclub/OpenPype/pull/4066) -- Loader: Fix comparison of repre name [\#4053](https://github.com/pypeclub/OpenPype/pull/4053) -- Deadline: Extract environment subprocess failure [\#4050](https://github.com/pypeclub/OpenPype/pull/4050) - -**๐Ÿ”€ Refactored code** - -- General: Collect entities plugin minor changes [\#4089](https://github.com/pypeclub/OpenPype/pull/4089) -- General: Direct interfaces import [\#4065](https://github.com/pypeclub/OpenPype/pull/4065) - -**Merged pull requests:** - -- Bump loader-utils from 1.4.1 to 1.4.2 in /website [\#4100](https://github.com/pypeclub/OpenPype/pull/4100) -- Online family for Tray Publisher [\#4093](https://github.com/pypeclub/OpenPype/pull/4093) -- Bump loader-utils from 1.4.0 to 1.4.1 in /website [\#4081](https://github.com/pypeclub/OpenPype/pull/4081) -- remove underscore from subset name [\#4059](https://github.com/pypeclub/OpenPype/pull/4059) -- Alembic Loader as Arnold Standin [\#4047](https://github.com/pypeclub/OpenPype/pull/4047) - -## [3.14.6](https://github.com/pypeclub/OpenPype/tree/3.14.6) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.5...3.14.6) - -### ๐Ÿ“– Documentation - -- Documentation: Minor updates to dev\_requirements.md [\#4025](https://github.com/pypeclub/OpenPype/pull/4025) - -**๐Ÿ†• New features** - -- Nuke: add 13.2 variant [\#4041](https://github.com/pypeclub/OpenPype/pull/4041) - -**๐Ÿš€ Enhancements** - -- Publish Report Viewer: Store reports locally on machine [\#4040](https://github.com/pypeclub/OpenPype/pull/4040) -- General: More specific error in burnins script [\#4026](https://github.com/pypeclub/OpenPype/pull/4026) -- General: Extract review does not crash with old settings overrides [\#4023](https://github.com/pypeclub/OpenPype/pull/4023) -- Publisher: Convertors for legacy instances [\#4020](https://github.com/pypeclub/OpenPype/pull/4020) -- workflows: adding milestone creator and assigner [\#4018](https://github.com/pypeclub/OpenPype/pull/4018) -- Publisher: Catch creator errors [\#4015](https://github.com/pypeclub/OpenPype/pull/4015) - -**๐Ÿ› Bug fixes** - -- Hiero - effect collection fixes [\#4038](https://github.com/pypeclub/OpenPype/pull/4038) -- Nuke - loader clip correct hash conversion in path [\#4037](https://github.com/pypeclub/OpenPype/pull/4037) -- Maya: Soft fail when applying capture preset [\#4034](https://github.com/pypeclub/OpenPype/pull/4034) -- Igniter: handle missing directory [\#4032](https://github.com/pypeclub/OpenPype/pull/4032) -- StandalonePublisher: Fix thumbnail publishing [\#4029](https://github.com/pypeclub/OpenPype/pull/4029) -- Experimental Tools: Fix publisher import [\#4027](https://github.com/pypeclub/OpenPype/pull/4027) -- Houdini: fix wrong path in ASS loader [\#4016](https://github.com/pypeclub/OpenPype/pull/4016) - -**๐Ÿ”€ Refactored code** - -- General: Import lib functions from lib [\#4017](https://github.com/pypeclub/OpenPype/pull/4017) - -## [3.14.5](https://github.com/pypeclub/OpenPype/tree/3.14.5) (2022-10-24) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.4...3.14.5) - -**๐Ÿš€ Enhancements** - -- Maya: add OBJ extractor to model family [\#4021](https://github.com/pypeclub/OpenPype/pull/4021) -- Publish report viewer tool [\#4010](https://github.com/pypeclub/OpenPype/pull/4010) -- Nuke | Global: adding custom tags representation filtering [\#4009](https://github.com/pypeclub/OpenPype/pull/4009) -- Publisher: Create context has shared data for collection phase [\#3995](https://github.com/pypeclub/OpenPype/pull/3995) -- Resolve: updating to v18 compatibility [\#3986](https://github.com/pypeclub/OpenPype/pull/3986) - -**๐Ÿ› Bug fixes** - -- TrayPublisher: Fix missing argument [\#4019](https://github.com/pypeclub/OpenPype/pull/4019) -- General: Fix python 2 compatibility of ffmpeg and oiio tools discovery [\#4011](https://github.com/pypeclub/OpenPype/pull/4011) - -**๐Ÿ”€ Refactored code** - -- Maya: Removed unused imports [\#4008](https://github.com/pypeclub/OpenPype/pull/4008) -- Unreal: Fix import of moved function [\#4007](https://github.com/pypeclub/OpenPype/pull/4007) -- Houdini: Change import of RepairAction [\#4005](https://github.com/pypeclub/OpenPype/pull/4005) -- Nuke/Hiero: Refactor openpype.api imports [\#4000](https://github.com/pypeclub/OpenPype/pull/4000) -- TVPaint: Defined with HostBase [\#3994](https://github.com/pypeclub/OpenPype/pull/3994) - -**Merged pull requests:** - -- Unreal: Remove redundant Creator stub [\#4012](https://github.com/pypeclub/OpenPype/pull/4012) -- Unreal: add `uproject` extension to Unreal project template [\#4004](https://github.com/pypeclub/OpenPype/pull/4004) -- Unreal: fix order of includes [\#4002](https://github.com/pypeclub/OpenPype/pull/4002) -- Fusion: Implement backwards compatibility \(+/- Fusion 17.2\) [\#3958](https://github.com/pypeclub/OpenPype/pull/3958) - -## [3.14.4](https://github.com/pypeclub/OpenPype/tree/3.14.4) (2022-10-19) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.3...3.14.4) - -**๐Ÿ†• New features** - -- Webpublisher: use max next published version number for all items in batch [\#3961](https://github.com/pypeclub/OpenPype/pull/3961) -- General: Control Thumbnail integration via explicit configuration profiles [\#3951](https://github.com/pypeclub/OpenPype/pull/3951) - -**๐Ÿš€ Enhancements** - -- Publisher: Multiselection in card view [\#3993](https://github.com/pypeclub/OpenPype/pull/3993) -- TrayPublisher: Original Basename cause crash too early [\#3990](https://github.com/pypeclub/OpenPype/pull/3990) -- Tray Publisher: add `originalBasename` data to simple creators [\#3988](https://github.com/pypeclub/OpenPype/pull/3988) -- General: Custom paths to ffmpeg and OpenImageIO tools [\#3982](https://github.com/pypeclub/OpenPype/pull/3982) -- Integrate: Preserve existing subset group if instance does not set it for new version [\#3976](https://github.com/pypeclub/OpenPype/pull/3976) -- Publisher: Prepare publisher controller for remote publishing [\#3972](https://github.com/pypeclub/OpenPype/pull/3972) -- Maya: new style dataclasses in maya deadline submitter plugin [\#3968](https://github.com/pypeclub/OpenPype/pull/3968) -- Maya: Define preffered Qt bindings for Qt.py and qtpy [\#3963](https://github.com/pypeclub/OpenPype/pull/3963) -- Settings: Move imageio from project anatomy to project settings \[pypeclub\] [\#3959](https://github.com/pypeclub/OpenPype/pull/3959) -- TrayPublisher: Extract thumbnail for other families [\#3952](https://github.com/pypeclub/OpenPype/pull/3952) -- Publisher: Pass instance to subset name method on update [\#3949](https://github.com/pypeclub/OpenPype/pull/3949) -- General: Set root environments before DCC launch [\#3947](https://github.com/pypeclub/OpenPype/pull/3947) -- Refactor: changed legacy way to update database for Hero version integrate [\#3941](https://github.com/pypeclub/OpenPype/pull/3941) -- Maya: Moved plugin from global to maya [\#3939](https://github.com/pypeclub/OpenPype/pull/3939) -- Publisher: Create dialog is part of main window [\#3936](https://github.com/pypeclub/OpenPype/pull/3936) -- Fusion: Implement Alembic and FBX mesh loader [\#3927](https://github.com/pypeclub/OpenPype/pull/3927) - -**๐Ÿ› Bug fixes** - -- TrayPublisher: Disable sequences in batch mov creator [\#3996](https://github.com/pypeclub/OpenPype/pull/3996) -- Fix - tags might be missing on representation [\#3985](https://github.com/pypeclub/OpenPype/pull/3985) -- Resolve: Fix usage of functions from lib [\#3983](https://github.com/pypeclub/OpenPype/pull/3983) -- Maya: remove invalid prefix token for non-multipart outputs [\#3981](https://github.com/pypeclub/OpenPype/pull/3981) -- Ftrack: Fix schema cache for Python 2 [\#3980](https://github.com/pypeclub/OpenPype/pull/3980) -- Maya: add object to attr.s declaration [\#3973](https://github.com/pypeclub/OpenPype/pull/3973) -- Maya: Deadline OutputFilePath hack regression for Renderman [\#3950](https://github.com/pypeclub/OpenPype/pull/3950) -- Houdini: Fix validate workfile paths for non-parm file references [\#3948](https://github.com/pypeclub/OpenPype/pull/3948) -- Photoshop: missed sync published version of workfile with workfile [\#3946](https://github.com/pypeclub/OpenPype/pull/3946) -- Maya: Set default value for RenderSetupIncludeLights option [\#3944](https://github.com/pypeclub/OpenPype/pull/3944) -- Maya: fix regression of Renderman Deadline hack [\#3943](https://github.com/pypeclub/OpenPype/pull/3943) -- Kitsu: 2 fixes, nb\_frames and Shot type error [\#3940](https://github.com/pypeclub/OpenPype/pull/3940) -- Tray: Change order of attribute changes [\#3938](https://github.com/pypeclub/OpenPype/pull/3938) -- AttributeDefs: Fix crashing multivalue of files widget [\#3937](https://github.com/pypeclub/OpenPype/pull/3937) -- General: Fix links query on hero version [\#3900](https://github.com/pypeclub/OpenPype/pull/3900) -- Publisher: Files Drag n Drop cleanup [\#3888](https://github.com/pypeclub/OpenPype/pull/3888) - -**๐Ÿ”€ Refactored code** - -- Flame: Import lib functions from lib [\#3992](https://github.com/pypeclub/OpenPype/pull/3992) -- General: Fix deprecated warning in legacy creator [\#3978](https://github.com/pypeclub/OpenPype/pull/3978) -- Blender: Remove openpype api imports [\#3977](https://github.com/pypeclub/OpenPype/pull/3977) -- General: Use direct import of resources [\#3964](https://github.com/pypeclub/OpenPype/pull/3964) -- General: Direct settings imports [\#3934](https://github.com/pypeclub/OpenPype/pull/3934) -- General: import 'Logger' from 'openpype.lib' [\#3926](https://github.com/pypeclub/OpenPype/pull/3926) -- General: Remove deprecated functions from lib [\#3907](https://github.com/pypeclub/OpenPype/pull/3907) - -**Merged pull requests:** - -- Maya + Yeti: Load Yeti Cache fix frame number recognition [\#3942](https://github.com/pypeclub/OpenPype/pull/3942) -- Fusion: Implement callbacks to Fusion's event system thread [\#3928](https://github.com/pypeclub/OpenPype/pull/3928) -- Photoshop: create single frame image in Ftrack as review [\#3908](https://github.com/pypeclub/OpenPype/pull/3908) - -## [3.14.3](https://github.com/pypeclub/OpenPype/tree/3.14.3) (2022-10-03) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.2...3.14.3) - -**๐Ÿš€ Enhancements** - -- Publisher: Enhancement proposals [\#3897](https://github.com/pypeclub/OpenPype/pull/3897) - -**๐Ÿ› Bug fixes** - -- Maya: Fix Render single camera validator [\#3929](https://github.com/pypeclub/OpenPype/pull/3929) -- Flame: loading multilayer exr to batch/reel is working [\#3901](https://github.com/pypeclub/OpenPype/pull/3901) -- Hiero: Fix inventory check on launch [\#3895](https://github.com/pypeclub/OpenPype/pull/3895) -- WebPublisher: Fix import after refactor [\#3891](https://github.com/pypeclub/OpenPype/pull/3891) - -**๐Ÿ”€ Refactored code** - -- Maya: Remove unused 'openpype.api' imports in plugins [\#3925](https://github.com/pypeclub/OpenPype/pull/3925) -- Resolve: Use new Extractor location [\#3918](https://github.com/pypeclub/OpenPype/pull/3918) -- Unreal: Use new Extractor location [\#3917](https://github.com/pypeclub/OpenPype/pull/3917) -- Flame: Use new Extractor location [\#3916](https://github.com/pypeclub/OpenPype/pull/3916) -- Houdini: Use new Extractor location [\#3894](https://github.com/pypeclub/OpenPype/pull/3894) -- Harmony: Use new Extractor location [\#3893](https://github.com/pypeclub/OpenPype/pull/3893) - -**Merged pull requests:** - -- Maya: Fix Scene Inventory possibly starting off-screen due to maya preferences [\#3923](https://github.com/pypeclub/OpenPype/pull/3923) - -## [3.14.2](https://github.com/pypeclub/OpenPype/tree/3.14.2) (2022-09-12) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.1...3.14.2) - -### ๐Ÿ“– Documentation - -- Documentation: Anatomy templates [\#3618](https://github.com/pypeclub/OpenPype/pull/3618) - -**๐Ÿ†• New features** - -- Nuke: Build workfile by template [\#3763](https://github.com/pypeclub/OpenPype/pull/3763) -- Houdini: Publishing workfiles [\#3697](https://github.com/pypeclub/OpenPype/pull/3697) -- Global: making collect audio plugin global [\#3679](https://github.com/pypeclub/OpenPype/pull/3679) - -**๐Ÿš€ Enhancements** - -- Flame: Adding Creator's retimed shot and handles switch [\#3826](https://github.com/pypeclub/OpenPype/pull/3826) -- Flame: OpenPype submenu to batch and media manager [\#3825](https://github.com/pypeclub/OpenPype/pull/3825) -- General: Better pixmap scaling [\#3809](https://github.com/pypeclub/OpenPype/pull/3809) -- Photoshop: attempt to speed up ExtractImage [\#3793](https://github.com/pypeclub/OpenPype/pull/3793) -- SyncServer: Added cli commands for sync server [\#3765](https://github.com/pypeclub/OpenPype/pull/3765) -- Kitsu: Drop 'entities root' setting. [\#3739](https://github.com/pypeclub/OpenPype/pull/3739) -- git: update gitignore [\#3722](https://github.com/pypeclub/OpenPype/pull/3722) -- Blender: Publisher collect workfile representation [\#3670](https://github.com/pypeclub/OpenPype/pull/3670) -- Maya: move set render settings menu entry [\#3669](https://github.com/pypeclub/OpenPype/pull/3669) -- Scene Inventory: Maya add actions to select from or to scene [\#3659](https://github.com/pypeclub/OpenPype/pull/3659) -- Scene Inventory: Add subsetGroup column [\#3658](https://github.com/pypeclub/OpenPype/pull/3658) - -**๐Ÿ› Bug fixes** - -- General: Fix Pattern access in client code [\#3828](https://github.com/pypeclub/OpenPype/pull/3828) -- Launcher: Skip opening last work file works for groups [\#3822](https://github.com/pypeclub/OpenPype/pull/3822) -- Maya: Publishing data key change [\#3811](https://github.com/pypeclub/OpenPype/pull/3811) -- Igniter: Fix status handling when version is already installed [\#3804](https://github.com/pypeclub/OpenPype/pull/3804) -- Resolve: Addon import is Python 2 compatible [\#3798](https://github.com/pypeclub/OpenPype/pull/3798) -- Hiero: retimed clip publishing is working [\#3792](https://github.com/pypeclub/OpenPype/pull/3792) -- nuke: validate write node is not failing due wrong type [\#3780](https://github.com/pypeclub/OpenPype/pull/3780) -- Fix - changed format of version string in pyproject.toml [\#3777](https://github.com/pypeclub/OpenPype/pull/3777) -- Ftrack status fix typo prgoress -\> progress [\#3761](https://github.com/pypeclub/OpenPype/pull/3761) -- Fix version resolution [\#3757](https://github.com/pypeclub/OpenPype/pull/3757) -- Maya: `containerise` dont skip empty values [\#3674](https://github.com/pypeclub/OpenPype/pull/3674) - -**๐Ÿ”€ Refactored code** - -- Photoshop: Use new Extractor location [\#3789](https://github.com/pypeclub/OpenPype/pull/3789) -- Blender: Use new Extractor location [\#3787](https://github.com/pypeclub/OpenPype/pull/3787) -- AfterEffects: Use new Extractor location [\#3784](https://github.com/pypeclub/OpenPype/pull/3784) -- General: Remove unused teshost [\#3773](https://github.com/pypeclub/OpenPype/pull/3773) -- General: Copied 'Extractor' plugin to publish pipeline [\#3771](https://github.com/pypeclub/OpenPype/pull/3771) -- General: Move queries of asset and representation links [\#3770](https://github.com/pypeclub/OpenPype/pull/3770) -- General: Move create project folders to pipeline [\#3768](https://github.com/pypeclub/OpenPype/pull/3768) -- General: Create project function moved to client code [\#3766](https://github.com/pypeclub/OpenPype/pull/3766) -- Maya: Refactor submit deadline to use AbstractSubmitDeadline [\#3759](https://github.com/pypeclub/OpenPype/pull/3759) -- General: Change publish template settings location [\#3755](https://github.com/pypeclub/OpenPype/pull/3755) -- General: Move hostdirname functionality into host [\#3749](https://github.com/pypeclub/OpenPype/pull/3749) -- General: Move publish utils to pipeline [\#3745](https://github.com/pypeclub/OpenPype/pull/3745) -- Houdini: Define houdini as addon [\#3735](https://github.com/pypeclub/OpenPype/pull/3735) -- Fusion: Defined fusion as addon [\#3733](https://github.com/pypeclub/OpenPype/pull/3733) -- Flame: Defined flame as addon [\#3732](https://github.com/pypeclub/OpenPype/pull/3732) -- Resolve: Define resolve as addon [\#3727](https://github.com/pypeclub/OpenPype/pull/3727) - -**Merged pull requests:** - -- Standalone Publisher: Ignore empty labels, then still use name like other asset models [\#3779](https://github.com/pypeclub/OpenPype/pull/3779) -- Kitsu - sync\_all\_project - add list ignore\_projects [\#3776](https://github.com/pypeclub/OpenPype/pull/3776) - -## [3.14.1](https://github.com/pypeclub/OpenPype/tree/3.14.1) (2022-08-30) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.14.0...3.14.1) - -### ๐Ÿ“– Documentation - -- Documentation: Few updates [\#3698](https://github.com/pypeclub/OpenPype/pull/3698) -- Documentation: Settings development [\#3660](https://github.com/pypeclub/OpenPype/pull/3660) - -**๐Ÿ†• New features** - -- Webpublisher:change create flatten image into tri state [\#3678](https://github.com/pypeclub/OpenPype/pull/3678) -- Blender: validators code correction with settings and defaults [\#3662](https://github.com/pypeclub/OpenPype/pull/3662) - -**๐Ÿš€ Enhancements** - -- General: Thumbnail can use project roots [\#3750](https://github.com/pypeclub/OpenPype/pull/3750) -- Settings: Remove settings lock on tray exit [\#3720](https://github.com/pypeclub/OpenPype/pull/3720) -- General: Added helper getters to modules manager [\#3712](https://github.com/pypeclub/OpenPype/pull/3712) -- Unreal: Define unreal as module and use host class [\#3701](https://github.com/pypeclub/OpenPype/pull/3701) -- Settings: Lock settings UI session [\#3700](https://github.com/pypeclub/OpenPype/pull/3700) -- General: Benevolent context label collector [\#3686](https://github.com/pypeclub/OpenPype/pull/3686) -- Ftrack: Store ftrack entities on hierarchy integration to instances [\#3677](https://github.com/pypeclub/OpenPype/pull/3677) -- Ftrack: More logs related to auto sync value change [\#3671](https://github.com/pypeclub/OpenPype/pull/3671) -- Blender: ops refresh manager after process events [\#3663](https://github.com/pypeclub/OpenPype/pull/3663) - -**๐Ÿ› Bug fixes** - -- Maya: Fix typo in getPanel argument `with_focus` -\> `withFocus` [\#3753](https://github.com/pypeclub/OpenPype/pull/3753) -- General: Smaller fixes of imports [\#3748](https://github.com/pypeclub/OpenPype/pull/3748) -- General: Logger tweaks [\#3741](https://github.com/pypeclub/OpenPype/pull/3741) -- Nuke: missing job dependency if multiple bake streams [\#3737](https://github.com/pypeclub/OpenPype/pull/3737) -- Nuke: color-space settings from anatomy is working [\#3721](https://github.com/pypeclub/OpenPype/pull/3721) -- Settings: Fix studio default anatomy save [\#3716](https://github.com/pypeclub/OpenPype/pull/3716) -- Maya: Use project name instead of project code [\#3709](https://github.com/pypeclub/OpenPype/pull/3709) -- Settings: Fix project overrides save [\#3708](https://github.com/pypeclub/OpenPype/pull/3708) -- Workfiles tool: Fix published workfile filtering [\#3704](https://github.com/pypeclub/OpenPype/pull/3704) -- PS, AE: Provide default variant value for workfile subset [\#3703](https://github.com/pypeclub/OpenPype/pull/3703) -- RoyalRender: handle host name that is not set [\#3695](https://github.com/pypeclub/OpenPype/pull/3695) -- Flame: retime is working on clip publishing [\#3684](https://github.com/pypeclub/OpenPype/pull/3684) -- Webpublisher: added check for empty context [\#3682](https://github.com/pypeclub/OpenPype/pull/3682) - -**๐Ÿ”€ Refactored code** - -- General: Move delivery logic to pipeline [\#3751](https://github.com/pypeclub/OpenPype/pull/3751) -- General: Host addons cleanup [\#3744](https://github.com/pypeclub/OpenPype/pull/3744) -- Webpublisher: Webpublisher is used as addon [\#3740](https://github.com/pypeclub/OpenPype/pull/3740) -- Photoshop: Defined photoshop as addon [\#3736](https://github.com/pypeclub/OpenPype/pull/3736) -- Harmony: Defined harmony as addon [\#3734](https://github.com/pypeclub/OpenPype/pull/3734) -- General: Module interfaces cleanup [\#3731](https://github.com/pypeclub/OpenPype/pull/3731) -- AfterEffects: Move AE functions from general lib [\#3730](https://github.com/pypeclub/OpenPype/pull/3730) -- Blender: Define blender as module [\#3729](https://github.com/pypeclub/OpenPype/pull/3729) -- AfterEffects: Define AfterEffects as module [\#3728](https://github.com/pypeclub/OpenPype/pull/3728) -- General: Replace PypeLogger with Logger [\#3725](https://github.com/pypeclub/OpenPype/pull/3725) -- Nuke: Define nuke as module [\#3724](https://github.com/pypeclub/OpenPype/pull/3724) -- General: Move subset name functionality [\#3723](https://github.com/pypeclub/OpenPype/pull/3723) -- General: Move creators plugin getter [\#3714](https://github.com/pypeclub/OpenPype/pull/3714) -- General: Move constants from lib to client [\#3713](https://github.com/pypeclub/OpenPype/pull/3713) -- Loader: Subset groups using client operations [\#3710](https://github.com/pypeclub/OpenPype/pull/3710) -- TVPaint: Defined as module [\#3707](https://github.com/pypeclub/OpenPype/pull/3707) -- StandalonePublisher: Define StandalonePublisher as module [\#3706](https://github.com/pypeclub/OpenPype/pull/3706) -- TrayPublisher: Define TrayPublisher as module [\#3705](https://github.com/pypeclub/OpenPype/pull/3705) -- General: Move context specific functions to context tools [\#3702](https://github.com/pypeclub/OpenPype/pull/3702) - -**Merged pull requests:** - -- Hiero: Define hiero as module [\#3717](https://github.com/pypeclub/OpenPype/pull/3717) -- Deadline: better logging for DL webservice failures [\#3694](https://github.com/pypeclub/OpenPype/pull/3694) -- Photoshop: resize saved images in ExtractReview for ffmpeg [\#3676](https://github.com/pypeclub/OpenPype/pull/3676) -- Nuke: Validation refactory to new publisher [\#3567](https://github.com/pypeclub/OpenPype/pull/3567) - -## [3.14.0](https://github.com/pypeclub/OpenPype/tree/3.14.0) (2022-08-18) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.13.0...3.14.0) - -**๐Ÿ†• New features** - -- Maya: Build workfile by template [\#3578](https://github.com/pypeclub/OpenPype/pull/3578) -- Maya: Implementation of JSON layout for Unreal workflow [\#3353](https://github.com/pypeclub/OpenPype/pull/3353) -- Maya: Build workfile by template [\#3315](https://github.com/pypeclub/OpenPype/pull/3315) - -**๐Ÿš€ Enhancements** - -- Ftrack: Addiotional component metadata [\#3685](https://github.com/pypeclub/OpenPype/pull/3685) -- Ftrack: Set task status on farm publishing [\#3680](https://github.com/pypeclub/OpenPype/pull/3680) -- Ftrack: Set task status on task creation in integrate hierarchy [\#3675](https://github.com/pypeclub/OpenPype/pull/3675) -- Maya: Disable rendering of all lights for render instances submitted through Deadline. [\#3661](https://github.com/pypeclub/OpenPype/pull/3661) -- General: Optimized OCIO configs [\#3650](https://github.com/pypeclub/OpenPype/pull/3650) - -**๐Ÿ› Bug fixes** - -- General: Switch from hero version to versioned works [\#3691](https://github.com/pypeclub/OpenPype/pull/3691) -- General: Fix finding of last version [\#3656](https://github.com/pypeclub/OpenPype/pull/3656) -- General: Extract Review can scale with pixel aspect ratio [\#3644](https://github.com/pypeclub/OpenPype/pull/3644) -- Maya: Refactor moved usage of CreateRender settings [\#3643](https://github.com/pypeclub/OpenPype/pull/3643) -- General: Hero version representations have full context [\#3638](https://github.com/pypeclub/OpenPype/pull/3638) -- Nuke: color settings for render write node is working now [\#3632](https://github.com/pypeclub/OpenPype/pull/3632) -- Maya: FBX support for update in reference loader [\#3631](https://github.com/pypeclub/OpenPype/pull/3631) - -**๐Ÿ”€ Refactored code** - -- General: Use client projects getter [\#3673](https://github.com/pypeclub/OpenPype/pull/3673) -- Resolve: Match folder structure to other hosts [\#3653](https://github.com/pypeclub/OpenPype/pull/3653) -- Maya: Hosts as modules [\#3647](https://github.com/pypeclub/OpenPype/pull/3647) -- TimersManager: Plugins are in timers manager module [\#3639](https://github.com/pypeclub/OpenPype/pull/3639) -- General: Move workfiles functions into pipeline [\#3637](https://github.com/pypeclub/OpenPype/pull/3637) -- General: Workfiles builder using query functions [\#3598](https://github.com/pypeclub/OpenPype/pull/3598) - -**Merged pull requests:** - -- Deadline: Global job pre load is not Pype 2 compatible [\#3666](https://github.com/pypeclub/OpenPype/pull/3666) -- Maya: Remove unused get current renderer logic [\#3645](https://github.com/pypeclub/OpenPype/pull/3645) -- Kitsu|Fix: Movie project type fails & first loop children names [\#3636](https://github.com/pypeclub/OpenPype/pull/3636) -- fix the bug of failing to extract look when UDIMs format used in AiImage [\#3628](https://github.com/pypeclub/OpenPype/pull/3628) - -## [3.13.0](https://github.com/pypeclub/OpenPype/tree/3.13.0) (2022-08-09) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.12.2...3.13.0) - -**๐Ÿ†• New features** - -- Support for mutliple installed versions - 3.13 [\#3605](https://github.com/pypeclub/OpenPype/pull/3605) -- Traypublisher: simple editorial publishing [\#3492](https://github.com/pypeclub/OpenPype/pull/3492) - -**๐Ÿš€ Enhancements** - -- Editorial: Mix audio use side file for ffmpeg filters [\#3630](https://github.com/pypeclub/OpenPype/pull/3630) -- Ftrack: Comment template can contain optional keys [\#3615](https://github.com/pypeclub/OpenPype/pull/3615) -- Ftrack: Add more metadata to ftrack components [\#3612](https://github.com/pypeclub/OpenPype/pull/3612) -- General: Add context to pyblish context [\#3594](https://github.com/pypeclub/OpenPype/pull/3594) -- Kitsu: Shot&Sequence name with prefix over appends [\#3593](https://github.com/pypeclub/OpenPype/pull/3593) -- Photoshop: implemented {layer} placeholder in subset template [\#3591](https://github.com/pypeclub/OpenPype/pull/3591) -- General: Python module appdirs from git [\#3589](https://github.com/pypeclub/OpenPype/pull/3589) -- Ftrack: Update ftrack api to 2.3.3 [\#3588](https://github.com/pypeclub/OpenPype/pull/3588) -- General: New Integrator small fixes [\#3583](https://github.com/pypeclub/OpenPype/pull/3583) -- Maya: Render Creator has configurable options. [\#3097](https://github.com/pypeclub/OpenPype/pull/3097) - -**๐Ÿ› Bug fixes** - -- Maya: fix aov separator in Redshift [\#3625](https://github.com/pypeclub/OpenPype/pull/3625) -- Fix for multi-version build on Mac [\#3622](https://github.com/pypeclub/OpenPype/pull/3622) -- Ftrack: Sync hierarchical attributes can handle new created entities [\#3621](https://github.com/pypeclub/OpenPype/pull/3621) -- General: Extract review aspect ratio scale is calculated by ffmpeg [\#3620](https://github.com/pypeclub/OpenPype/pull/3620) -- Maya: Fix types of default settings [\#3617](https://github.com/pypeclub/OpenPype/pull/3617) -- Integrator: Don't force to have dot before frame [\#3611](https://github.com/pypeclub/OpenPype/pull/3611) -- AfterEffects: refactored integrate doesnt work formulti frame publishes [\#3610](https://github.com/pypeclub/OpenPype/pull/3610) -- Maya look data contents fails with custom attribute on group [\#3607](https://github.com/pypeclub/OpenPype/pull/3607) -- TrayPublisher: Fix wrong conflict merge [\#3600](https://github.com/pypeclub/OpenPype/pull/3600) -- Bugfix: Add OCIO as submodule to prepare for handling `maketx` color space conversion. [\#3590](https://github.com/pypeclub/OpenPype/pull/3590) -- Fix general settings environment variables resolution [\#3587](https://github.com/pypeclub/OpenPype/pull/3587) -- Editorial publishing workflow improvements [\#3580](https://github.com/pypeclub/OpenPype/pull/3580) -- General: Update imports in start script [\#3579](https://github.com/pypeclub/OpenPype/pull/3579) -- Nuke: render family integration consistency [\#3576](https://github.com/pypeclub/OpenPype/pull/3576) -- Ftrack: Handle missing published path in integrator [\#3570](https://github.com/pypeclub/OpenPype/pull/3570) -- Nuke: publish existing frames with slate with correct range [\#3555](https://github.com/pypeclub/OpenPype/pull/3555) - -**๐Ÿ”€ Refactored code** - -- General: Plugin settings handled by plugins [\#3623](https://github.com/pypeclub/OpenPype/pull/3623) -- General: Naive implementation of document create, update, delete [\#3601](https://github.com/pypeclub/OpenPype/pull/3601) -- General: Use query functions in general code [\#3596](https://github.com/pypeclub/OpenPype/pull/3596) -- General: Separate extraction of template data into more functions [\#3574](https://github.com/pypeclub/OpenPype/pull/3574) -- General: Lib cleanup [\#3571](https://github.com/pypeclub/OpenPype/pull/3571) - -**Merged pull requests:** - -- Webpublisher: timeout for PS studio processing [\#3619](https://github.com/pypeclub/OpenPype/pull/3619) -- Core: translated validate\_containers.py into New publisher style [\#3614](https://github.com/pypeclub/OpenPype/pull/3614) -- Enable write color sets on animation publish automatically [\#3582](https://github.com/pypeclub/OpenPype/pull/3582) - -## [3.12.2](https://github.com/pypeclub/OpenPype/tree/3.12.2) (2022-07-27) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.12.1...3.12.2) - -### ๐Ÿ“– Documentation - -- Update website with more studios [\#3554](https://github.com/pypeclub/OpenPype/pull/3554) -- Documentation: Update publishing dev docs [\#3549](https://github.com/pypeclub/OpenPype/pull/3549) - -**๐Ÿš€ Enhancements** - -- General: Global thumbnail extractor is ready for more cases [\#3561](https://github.com/pypeclub/OpenPype/pull/3561) -- Maya: add additional validators to Settings [\#3540](https://github.com/pypeclub/OpenPype/pull/3540) -- General: Interactive console in cli [\#3526](https://github.com/pypeclub/OpenPype/pull/3526) -- Ftrack: Automatic daily review session creation can define trigger hour [\#3516](https://github.com/pypeclub/OpenPype/pull/3516) -- Ftrack: add source into Note [\#3509](https://github.com/pypeclub/OpenPype/pull/3509) -- Ftrack: Trigger custom ftrack topic of project structure creation [\#3506](https://github.com/pypeclub/OpenPype/pull/3506) -- Settings UI: Add extract to file action on project view [\#3505](https://github.com/pypeclub/OpenPype/pull/3505) -- Add pack and unpack convenience scripts [\#3502](https://github.com/pypeclub/OpenPype/pull/3502) -- General: Event system [\#3499](https://github.com/pypeclub/OpenPype/pull/3499) -- NewPublisher: Keep plugins with mismatch target in report [\#3498](https://github.com/pypeclub/OpenPype/pull/3498) -- Nuke: load clip with options from settings [\#3497](https://github.com/pypeclub/OpenPype/pull/3497) -- TrayPublisher: implemented render\_mov\_batch [\#3486](https://github.com/pypeclub/OpenPype/pull/3486) -- Migrate basic families to the new Tray Publisher [\#3469](https://github.com/pypeclub/OpenPype/pull/3469) -- Enhance powershell build scripts [\#1827](https://github.com/pypeclub/OpenPype/pull/1827) - -**๐Ÿ› Bug fixes** - -- Maya: fix Review image plane attribute [\#3569](https://github.com/pypeclub/OpenPype/pull/3569) -- Maya: Fix animated attributes \(ie. overscan\) on loaded cameras breaking review publishing. [\#3562](https://github.com/pypeclub/OpenPype/pull/3562) -- NewPublisher: Python 2 compatible html escape [\#3559](https://github.com/pypeclub/OpenPype/pull/3559) -- Remove invalid submodules from `/vendor` [\#3557](https://github.com/pypeclub/OpenPype/pull/3557) -- General: Remove hosts filter on integrator plugins [\#3556](https://github.com/pypeclub/OpenPype/pull/3556) -- Settings: Clean default values of environments [\#3550](https://github.com/pypeclub/OpenPype/pull/3550) -- Module interfaces: Fix import error [\#3547](https://github.com/pypeclub/OpenPype/pull/3547) -- Workfiles tool: Show of tool and it's flags [\#3539](https://github.com/pypeclub/OpenPype/pull/3539) -- General: Create workfile documents works again [\#3538](https://github.com/pypeclub/OpenPype/pull/3538) -- Additional fixes for powershell scripts [\#3525](https://github.com/pypeclub/OpenPype/pull/3525) -- Maya: Added wrapper around cmds.setAttr [\#3523](https://github.com/pypeclub/OpenPype/pull/3523) -- Nuke: double slate [\#3521](https://github.com/pypeclub/OpenPype/pull/3521) -- General: Fix hash of centos oiio archive [\#3519](https://github.com/pypeclub/OpenPype/pull/3519) -- Maya: Renderman display output fix [\#3514](https://github.com/pypeclub/OpenPype/pull/3514) -- TrayPublisher: Simple creation enhancements and fixes [\#3513](https://github.com/pypeclub/OpenPype/pull/3513) -- NewPublisher: Publish attributes are properly collected [\#3510](https://github.com/pypeclub/OpenPype/pull/3510) -- TrayPublisher: Make sure host name is filled [\#3504](https://github.com/pypeclub/OpenPype/pull/3504) -- NewPublisher: Groups work and enum multivalue [\#3501](https://github.com/pypeclub/OpenPype/pull/3501) - -**๐Ÿ”€ Refactored code** - -- General: Use query functions in integrator [\#3563](https://github.com/pypeclub/OpenPype/pull/3563) -- General: Mongo core connection moved to client [\#3531](https://github.com/pypeclub/OpenPype/pull/3531) -- Refactor Integrate Asset [\#3530](https://github.com/pypeclub/OpenPype/pull/3530) -- General: Client docstrings cleanup [\#3529](https://github.com/pypeclub/OpenPype/pull/3529) -- General: Move load related functions into pipeline [\#3527](https://github.com/pypeclub/OpenPype/pull/3527) -- General: Get current context document functions [\#3522](https://github.com/pypeclub/OpenPype/pull/3522) -- Kitsu: Use query function from client [\#3496](https://github.com/pypeclub/OpenPype/pull/3496) -- TimersManager: Use query functions [\#3495](https://github.com/pypeclub/OpenPype/pull/3495) -- Deadline: Use query functions [\#3466](https://github.com/pypeclub/OpenPype/pull/3466) -- Refactor Integrate Asset [\#2898](https://github.com/pypeclub/OpenPype/pull/2898) - -**Merged pull requests:** - -- Maya: fix active pane loss [\#3566](https://github.com/pypeclub/OpenPype/pull/3566) - -## [3.12.1](https://github.com/pypeclub/OpenPype/tree/3.12.1) (2022-07-13) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.12.0...3.12.1) - -### ๐Ÿ“– Documentation - -- Docs: Added minimal permissions for MongoDB [\#3441](https://github.com/pypeclub/OpenPype/pull/3441) - -**๐Ÿ†• New features** - -- Maya: Add VDB to Arnold loader [\#3433](https://github.com/pypeclub/OpenPype/pull/3433) - -**๐Ÿš€ Enhancements** - -- TrayPublisher: Added more options for grouping of instances [\#3494](https://github.com/pypeclub/OpenPype/pull/3494) -- NewPublisher: Align creator attributes from top to bottom [\#3487](https://github.com/pypeclub/OpenPype/pull/3487) -- NewPublisher: Added ability to use label of instance [\#3484](https://github.com/pypeclub/OpenPype/pull/3484) -- General: Creator Plugins have access to project [\#3476](https://github.com/pypeclub/OpenPype/pull/3476) -- General: Better arguments order in creator init [\#3475](https://github.com/pypeclub/OpenPype/pull/3475) -- Ftrack: Trigger custom ftrack events on project creation and preparation [\#3465](https://github.com/pypeclub/OpenPype/pull/3465) -- Windows installer: Clean old files and add version subfolder [\#3445](https://github.com/pypeclub/OpenPype/pull/3445) -- Blender: Bugfix - Set fps properly on open [\#3426](https://github.com/pypeclub/OpenPype/pull/3426) -- Hiero: Add custom scripts menu [\#3425](https://github.com/pypeclub/OpenPype/pull/3425) -- Blender: pre pyside install for all platforms [\#3400](https://github.com/pypeclub/OpenPype/pull/3400) -- Maya: Add additional playblast options to review Extractor. [\#3384](https://github.com/pypeclub/OpenPype/pull/3384) -- Maya: Ability to set resolution for playblasts from asset, and override through review instance. [\#3360](https://github.com/pypeclub/OpenPype/pull/3360) -- Maya: Redshift Volume Loader Implement update, remove, switch + fix vdb sequence support [\#3197](https://github.com/pypeclub/OpenPype/pull/3197) -- Maya: Implement `iter_visible_nodes_in_range` for extracting Alembics [\#3100](https://github.com/pypeclub/OpenPype/pull/3100) - -**๐Ÿ› Bug fixes** - -- TrayPublisher: Keep use instance label in list view [\#3493](https://github.com/pypeclub/OpenPype/pull/3493) -- General: Extract review use first frame of input sequence [\#3491](https://github.com/pypeclub/OpenPype/pull/3491) -- General: Fix Plist loading for application launch [\#3485](https://github.com/pypeclub/OpenPype/pull/3485) -- Nuke: Workfile tools open on start [\#3479](https://github.com/pypeclub/OpenPype/pull/3479) -- New Publisher: Disabled context change allows creation [\#3478](https://github.com/pypeclub/OpenPype/pull/3478) -- General: thumbnail extractor fix [\#3474](https://github.com/pypeclub/OpenPype/pull/3474) -- Kitsu: bugfix with sync-service ans publish plugins [\#3473](https://github.com/pypeclub/OpenPype/pull/3473) -- Flame: solved problem with multi-selected loading [\#3470](https://github.com/pypeclub/OpenPype/pull/3470) -- General: Fix query function in update logic [\#3468](https://github.com/pypeclub/OpenPype/pull/3468) -- Resolve: removed few bugs [\#3464](https://github.com/pypeclub/OpenPype/pull/3464) -- General: Delete old versions is safer when ftrack is disabled [\#3462](https://github.com/pypeclub/OpenPype/pull/3462) -- Nuke: fixing metadata slate TC difference [\#3455](https://github.com/pypeclub/OpenPype/pull/3455) -- Nuke: prerender reviewable fails [\#3450](https://github.com/pypeclub/OpenPype/pull/3450) -- Maya: fix hashing in Python 3 for tile rendering [\#3447](https://github.com/pypeclub/OpenPype/pull/3447) -- LogViewer: Escape html characters in log message [\#3443](https://github.com/pypeclub/OpenPype/pull/3443) -- Nuke: Slate frame is integrated [\#3427](https://github.com/pypeclub/OpenPype/pull/3427) -- Maya: Camera extra data - additional fix for \#3304 [\#3386](https://github.com/pypeclub/OpenPype/pull/3386) -- Maya: Handle excluding `model` family from frame range validator. [\#3370](https://github.com/pypeclub/OpenPype/pull/3370) - -**๐Ÿ”€ Refactored code** - -- Maya: Merge animation + pointcache extractor logic [\#3461](https://github.com/pypeclub/OpenPype/pull/3461) -- Maya: Re-use `maintained_time` from lib [\#3460](https://github.com/pypeclub/OpenPype/pull/3460) -- General: Use query functions in global plugins [\#3459](https://github.com/pypeclub/OpenPype/pull/3459) -- Clockify: Use query functions in clockify actions [\#3458](https://github.com/pypeclub/OpenPype/pull/3458) -- General: Use query functions in rest api calls [\#3457](https://github.com/pypeclub/OpenPype/pull/3457) -- General: Use query functions in openpype lib functions [\#3454](https://github.com/pypeclub/OpenPype/pull/3454) -- General: Use query functions in load utils [\#3446](https://github.com/pypeclub/OpenPype/pull/3446) -- General: Move publish plugin and publish render abstractions [\#3442](https://github.com/pypeclub/OpenPype/pull/3442) -- General: Use Anatomy after move to pipeline [\#3436](https://github.com/pypeclub/OpenPype/pull/3436) -- General: Anatomy moved to pipeline [\#3435](https://github.com/pypeclub/OpenPype/pull/3435) -- Fusion: Use client query functions [\#3380](https://github.com/pypeclub/OpenPype/pull/3380) -- Resolve: Use client query functions [\#3379](https://github.com/pypeclub/OpenPype/pull/3379) -- General: Host implementation defined with class [\#3337](https://github.com/pypeclub/OpenPype/pull/3337) - -## [3.12.0](https://github.com/pypeclub/OpenPype/tree/3.12.0) (2022-06-28) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.11.1...3.12.0) - -### ๐Ÿ“– Documentation - -- Fix typo in documentation: pyenv on mac [\#3417](https://github.com/pypeclub/OpenPype/pull/3417) -- Linux: update OIIO package [\#3401](https://github.com/pypeclub/OpenPype/pull/3401) - -**๐Ÿ†• New features** - -- Shotgrid: Add production beta of shotgrid integration [\#2921](https://github.com/pypeclub/OpenPype/pull/2921) - -**๐Ÿš€ Enhancements** - -- Webserver: Added CORS middleware [\#3422](https://github.com/pypeclub/OpenPype/pull/3422) -- Attribute Defs UI: Files widget show what is allowed to drop in [\#3411](https://github.com/pypeclub/OpenPype/pull/3411) -- General: Add ability to change user value for templates [\#3366](https://github.com/pypeclub/OpenPype/pull/3366) -- Hosts: More options for in-host callbacks [\#3357](https://github.com/pypeclub/OpenPype/pull/3357) -- Multiverse: expose some settings to GUI [\#3350](https://github.com/pypeclub/OpenPype/pull/3350) -- Maya: Allow more data to be published along camera ๐ŸŽฅ [\#3304](https://github.com/pypeclub/OpenPype/pull/3304) -- Add root keys and project keys to create starting folder [\#2755](https://github.com/pypeclub/OpenPype/pull/2755) - -**๐Ÿ› Bug fixes** - -- NewPublisher: Fix subset name change on change of creator plugin [\#3420](https://github.com/pypeclub/OpenPype/pull/3420) -- Bug: fix invalid avalon import [\#3418](https://github.com/pypeclub/OpenPype/pull/3418) -- Nuke: Fix keyword argument in query function [\#3414](https://github.com/pypeclub/OpenPype/pull/3414) -- Houdini: fix loading and updating vbd/bgeo sequences [\#3408](https://github.com/pypeclub/OpenPype/pull/3408) -- Nuke: Collect representation files based on Write [\#3407](https://github.com/pypeclub/OpenPype/pull/3407) -- General: Filter representations before integration start [\#3398](https://github.com/pypeclub/OpenPype/pull/3398) -- Maya: look collector typo [\#3392](https://github.com/pypeclub/OpenPype/pull/3392) -- TVPaint: Make sure exit code is set to not None [\#3382](https://github.com/pypeclub/OpenPype/pull/3382) -- Maya: vray device aspect ratio fix [\#3381](https://github.com/pypeclub/OpenPype/pull/3381) -- Flame: bunch of publishing issues [\#3377](https://github.com/pypeclub/OpenPype/pull/3377) -- Harmony: added unc path to zifile command in Harmony [\#3372](https://github.com/pypeclub/OpenPype/pull/3372) -- Standalone: settings improvements [\#3355](https://github.com/pypeclub/OpenPype/pull/3355) -- Nuke: Load full model hierarchy by default [\#3328](https://github.com/pypeclub/OpenPype/pull/3328) -- Nuke: multiple baking streams with correct slate [\#3245](https://github.com/pypeclub/OpenPype/pull/3245) -- Maya: fix image prefix warning in validator [\#3128](https://github.com/pypeclub/OpenPype/pull/3128) - -**๐Ÿ”€ Refactored code** - -- Unreal: Use client query functions [\#3421](https://github.com/pypeclub/OpenPype/pull/3421) -- General: Move editorial lib to pipeline [\#3419](https://github.com/pypeclub/OpenPype/pull/3419) -- Kitsu: renaming to plural func sync\_all\_projects [\#3397](https://github.com/pypeclub/OpenPype/pull/3397) -- Houdini: Use client query functions [\#3395](https://github.com/pypeclub/OpenPype/pull/3395) -- Hiero: Use client query functions [\#3393](https://github.com/pypeclub/OpenPype/pull/3393) -- Nuke: Use client query functions [\#3391](https://github.com/pypeclub/OpenPype/pull/3391) -- Maya: Use client query functions [\#3385](https://github.com/pypeclub/OpenPype/pull/3385) -- Harmony: Use client query functions [\#3378](https://github.com/pypeclub/OpenPype/pull/3378) -- Celaction: Use client query functions [\#3376](https://github.com/pypeclub/OpenPype/pull/3376) -- Photoshop: Use client query functions [\#3375](https://github.com/pypeclub/OpenPype/pull/3375) -- AfterEffects: Use client query functions [\#3374](https://github.com/pypeclub/OpenPype/pull/3374) -- TVPaint: Use client query functions [\#3340](https://github.com/pypeclub/OpenPype/pull/3340) -- Ftrack: Use client query functions [\#3339](https://github.com/pypeclub/OpenPype/pull/3339) -- Standalone Publisher: Use client query functions [\#3330](https://github.com/pypeclub/OpenPype/pull/3330) - -**Merged pull requests:** - -- Sync Queue: Added far future value for null values for dates [\#3371](https://github.com/pypeclub/OpenPype/pull/3371) -- Maya - added support for single frame playblast review [\#3369](https://github.com/pypeclub/OpenPype/pull/3369) -- Houdini: Implement Redshift Proxy Export [\#3196](https://github.com/pypeclub/OpenPype/pull/3196) - -## [3.11.1](https://github.com/pypeclub/OpenPype/tree/3.11.1) (2022-06-20) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.11.0...3.11.1) - -**๐Ÿ†• New features** - -- Flame: custom export temp folder [\#3346](https://github.com/pypeclub/OpenPype/pull/3346) -- Nuke: removing third-party plugins [\#3344](https://github.com/pypeclub/OpenPype/pull/3344) - -**๐Ÿš€ Enhancements** - -- Pyblish Pype: Hiding/Close issues [\#3367](https://github.com/pypeclub/OpenPype/pull/3367) -- Ftrack: Removed requirement of pypeclub role from default settings [\#3354](https://github.com/pypeclub/OpenPype/pull/3354) -- Kitsu: Prevent crash on missing frames information [\#3352](https://github.com/pypeclub/OpenPype/pull/3352) -- Ftrack: Open browser from tray [\#3320](https://github.com/pypeclub/OpenPype/pull/3320) -- Enhancement: More control over thumbnail processing. [\#3259](https://github.com/pypeclub/OpenPype/pull/3259) - -**๐Ÿ› Bug fixes** - -- Nuke: bake streams with slate on farm [\#3368](https://github.com/pypeclub/OpenPype/pull/3368) -- Harmony: audio validator has wrong logic [\#3364](https://github.com/pypeclub/OpenPype/pull/3364) -- Nuke: Fix missing variable in extract thumbnail [\#3363](https://github.com/pypeclub/OpenPype/pull/3363) -- Nuke: Fix precollect writes [\#3361](https://github.com/pypeclub/OpenPype/pull/3361) -- AE- fix validate\_scene\_settings and renderLocal [\#3358](https://github.com/pypeclub/OpenPype/pull/3358) -- deadline: fixing misidentification of revieables [\#3356](https://github.com/pypeclub/OpenPype/pull/3356) -- General: Create only one thumbnail per instance [\#3351](https://github.com/pypeclub/OpenPype/pull/3351) -- nuke: adding extract thumbnail settings 3.10 [\#3347](https://github.com/pypeclub/OpenPype/pull/3347) -- General: Fix last version function [\#3345](https://github.com/pypeclub/OpenPype/pull/3345) -- Deadline: added OPENPYPE\_MONGO to filter [\#3336](https://github.com/pypeclub/OpenPype/pull/3336) -- Nuke: fixing farm publishing if review is disabled [\#3306](https://github.com/pypeclub/OpenPype/pull/3306) -- Maya: Fix Yeti errors on Create, Publish and Load [\#3198](https://github.com/pypeclub/OpenPype/pull/3198) - -**๐Ÿ”€ Refactored code** - -- Webpublisher: Use client query functions [\#3333](https://github.com/pypeclub/OpenPype/pull/3333) - -## [3.11.0](https://github.com/pypeclub/OpenPype/tree/3.11.0) (2022-06-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.10.0...3.11.0) - -### ๐Ÿ“– Documentation - -- Documentation: Add app key to template documentation [\#3299](https://github.com/pypeclub/OpenPype/pull/3299) -- doc: adding royal render and multiverse to the web site [\#3285](https://github.com/pypeclub/OpenPype/pull/3285) -- Module: Kitsu module [\#2650](https://github.com/pypeclub/OpenPype/pull/2650) - -**๐Ÿ†• New features** - -- Multiverse: fixed composition write, full docs, cosmetics [\#3178](https://github.com/pypeclub/OpenPype/pull/3178) - -**๐Ÿš€ Enhancements** - -- Settings: Settings can be extracted from UI [\#3323](https://github.com/pypeclub/OpenPype/pull/3323) -- updated poetry installation source [\#3316](https://github.com/pypeclub/OpenPype/pull/3316) -- Ftrack: Action to easily create daily review session [\#3310](https://github.com/pypeclub/OpenPype/pull/3310) -- TVPaint: Extractor use mark in/out range to render [\#3309](https://github.com/pypeclub/OpenPype/pull/3309) -- Ftrack: Delivery action can work on ReviewSessions [\#3307](https://github.com/pypeclub/OpenPype/pull/3307) -- Maya: Look assigner UI improvements [\#3298](https://github.com/pypeclub/OpenPype/pull/3298) -- Ftrack: Action to transfer values of hierarchical attributes [\#3284](https://github.com/pypeclub/OpenPype/pull/3284) -- Maya: better handling of legacy review subsets names [\#3269](https://github.com/pypeclub/OpenPype/pull/3269) -- General: Updated windows oiio tool [\#3268](https://github.com/pypeclub/OpenPype/pull/3268) -- Unreal: add support for skeletalMesh and staticMesh to loaders [\#3267](https://github.com/pypeclub/OpenPype/pull/3267) -- Maya: reference loaders could store placeholder in referenced url [\#3264](https://github.com/pypeclub/OpenPype/pull/3264) -- TVPaint: Init file for TVPaint worker also handle guideline images [\#3250](https://github.com/pypeclub/OpenPype/pull/3250) -- Nuke: Change default icon path in settings [\#3247](https://github.com/pypeclub/OpenPype/pull/3247) -- Maya: publishing of animation and pointcache on a farm [\#3225](https://github.com/pypeclub/OpenPype/pull/3225) -- Maya: Look assigner UI improvements [\#3208](https://github.com/pypeclub/OpenPype/pull/3208) -- Nuke: add pointcache and animation to loader [\#3186](https://github.com/pypeclub/OpenPype/pull/3186) -- Nuke: Add a gizmo menu [\#3172](https://github.com/pypeclub/OpenPype/pull/3172) -- Support for Unreal 5 [\#3122](https://github.com/pypeclub/OpenPype/pull/3122) - -**๐Ÿ› Bug fixes** - -- General: Handle empty source key on instance [\#3342](https://github.com/pypeclub/OpenPype/pull/3342) -- Houdini: Fix Houdini VDB manage update wrong file attribute name [\#3322](https://github.com/pypeclub/OpenPype/pull/3322) -- Nuke: anatomy compatibility issue hacks [\#3321](https://github.com/pypeclub/OpenPype/pull/3321) -- hiero: otio p3 compatibility issue - metadata on effect use update 3.11 [\#3314](https://github.com/pypeclub/OpenPype/pull/3314) -- General: Vendorized modules for Python 2 and update poetry lock [\#3305](https://github.com/pypeclub/OpenPype/pull/3305) -- Fix - added local targets to install host [\#3303](https://github.com/pypeclub/OpenPype/pull/3303) -- Settings: Add missing default settings for nuke gizmo [\#3301](https://github.com/pypeclub/OpenPype/pull/3301) -- Maya: Fix swaped width and height in reviews [\#3300](https://github.com/pypeclub/OpenPype/pull/3300) -- Maya: point cache publish handles Maya instances [\#3297](https://github.com/pypeclub/OpenPype/pull/3297) -- Global: extract review slate issues [\#3286](https://github.com/pypeclub/OpenPype/pull/3286) -- Webpublisher: return only active projects in ProjectsEndpoint [\#3281](https://github.com/pypeclub/OpenPype/pull/3281) -- Hiero: add support for task tags 3.10.x [\#3279](https://github.com/pypeclub/OpenPype/pull/3279) -- General: Fix Oiio tool path resolving [\#3278](https://github.com/pypeclub/OpenPype/pull/3278) -- Maya: Fix udim support for e.g. uppercase \ tag [\#3266](https://github.com/pypeclub/OpenPype/pull/3266) -- Nuke: bake reformat was failing on string type [\#3261](https://github.com/pypeclub/OpenPype/pull/3261) -- Maya: hotfix Pxr multitexture in looks [\#3260](https://github.com/pypeclub/OpenPype/pull/3260) -- Unreal: Fix Camera Loading if Layout is missing [\#3255](https://github.com/pypeclub/OpenPype/pull/3255) -- Unreal: Fixed Animation loading in UE5 [\#3240](https://github.com/pypeclub/OpenPype/pull/3240) -- Unreal: Fixed Render creation in UE5 [\#3239](https://github.com/pypeclub/OpenPype/pull/3239) -- Unreal: Fixed Camera loading in UE5 [\#3238](https://github.com/pypeclub/OpenPype/pull/3238) -- Flame: debugging [\#3224](https://github.com/pypeclub/OpenPype/pull/3224) -- add silent audio to slate [\#3162](https://github.com/pypeclub/OpenPype/pull/3162) -- Add timecode to slate [\#2929](https://github.com/pypeclub/OpenPype/pull/2929) - -**๐Ÿ”€ Refactored code** - -- Blender: Use client query functions [\#3331](https://github.com/pypeclub/OpenPype/pull/3331) -- General: Define query functions [\#3288](https://github.com/pypeclub/OpenPype/pull/3288) - -**Merged pull requests:** - -- Maya: add pointcache family to gpu cache loader [\#3318](https://github.com/pypeclub/OpenPype/pull/3318) -- Maya look: skip empty file attributes [\#3274](https://github.com/pypeclub/OpenPype/pull/3274) - -## [3.10.0](https://github.com/pypeclub/OpenPype/tree/3.10.0) (2022-05-26) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.8...3.10.0) - -### ๐Ÿ“– Documentation - -- Docs: add all-contributors config and initial list [\#3094](https://github.com/pypeclub/OpenPype/pull/3094) -- Nuke docs with videos [\#3052](https://github.com/pypeclub/OpenPype/pull/3052) - -**๐Ÿ†• New features** - -- General: OpenPype modules publish plugins are registered in host [\#3180](https://github.com/pypeclub/OpenPype/pull/3180) -- General: Creator plugins from addons can be registered [\#3179](https://github.com/pypeclub/OpenPype/pull/3179) -- Ftrack: Single image reviewable [\#3157](https://github.com/pypeclub/OpenPype/pull/3157) -- Nuke: Expose write attributes to settings [\#3123](https://github.com/pypeclub/OpenPype/pull/3123) -- Hiero: Initial frame publish support [\#3106](https://github.com/pypeclub/OpenPype/pull/3106) -- Unreal: Render Publishing [\#2917](https://github.com/pypeclub/OpenPype/pull/2917) -- AfterEffects: Implemented New Publisher [\#2838](https://github.com/pypeclub/OpenPype/pull/2838) -- Unreal: Rendering implementation [\#2410](https://github.com/pypeclub/OpenPype/pull/2410) - -**๐Ÿš€ Enhancements** - -- Maya: FBX camera export [\#3253](https://github.com/pypeclub/OpenPype/pull/3253) -- General: updating common vendor `scriptmenu` to 1.5.2 [\#3246](https://github.com/pypeclub/OpenPype/pull/3246) -- Project Manager: Allow to paste Tasks into multiple assets at the same time [\#3226](https://github.com/pypeclub/OpenPype/pull/3226) -- Project manager: Sped up project load [\#3216](https://github.com/pypeclub/OpenPype/pull/3216) -- Loader UI: Speed issues of loader with sync server [\#3199](https://github.com/pypeclub/OpenPype/pull/3199) -- Looks: add basic support for Renderman [\#3190](https://github.com/pypeclub/OpenPype/pull/3190) -- Maya: added clean\_import option to Import loader [\#3181](https://github.com/pypeclub/OpenPype/pull/3181) -- Add the scripts menu definition to nuke [\#3168](https://github.com/pypeclub/OpenPype/pull/3168) -- Maya: add maya 2023 to default applications [\#3167](https://github.com/pypeclub/OpenPype/pull/3167) -- Compressed bgeo publishing in SAP and Houdini loader [\#3153](https://github.com/pypeclub/OpenPype/pull/3153) -- General: Add 'dataclasses' to required python modules [\#3149](https://github.com/pypeclub/OpenPype/pull/3149) -- Hooks: Tweak logging grammar [\#3147](https://github.com/pypeclub/OpenPype/pull/3147) -- Nuke: settings for reformat node in CreateWriteRender node [\#3143](https://github.com/pypeclub/OpenPype/pull/3143) -- Houdini: Add loader for alembic through Alembic Archive node [\#3140](https://github.com/pypeclub/OpenPype/pull/3140) -- Publisher: UI Modifications and fixes [\#3139](https://github.com/pypeclub/OpenPype/pull/3139) -- General: Simplified OP modules/addons import [\#3137](https://github.com/pypeclub/OpenPype/pull/3137) -- Terminal: Tweak coloring of TrayModuleManager logging enabled states [\#3133](https://github.com/pypeclub/OpenPype/pull/3133) -- General: Cleanup some Loader docstrings [\#3131](https://github.com/pypeclub/OpenPype/pull/3131) -- Nuke: render instance with subset name filtered overrides [\#3117](https://github.com/pypeclub/OpenPype/pull/3117) -- Unreal: Layout and Camera update and remove functions reimplemented and improvements [\#3116](https://github.com/pypeclub/OpenPype/pull/3116) -- Settings: Remove environment groups from settings [\#3115](https://github.com/pypeclub/OpenPype/pull/3115) -- TVPaint: Match renderlayer key with other hosts [\#3110](https://github.com/pypeclub/OpenPype/pull/3110) -- Ftrack: AssetVersion status on publish [\#3108](https://github.com/pypeclub/OpenPype/pull/3108) -- Tray publisher: Simple families from settings [\#3105](https://github.com/pypeclub/OpenPype/pull/3105) -- Local Settings UI: Overlay messages on save and reset [\#3104](https://github.com/pypeclub/OpenPype/pull/3104) -- General: Remove repos related logic [\#3087](https://github.com/pypeclub/OpenPype/pull/3087) -- Standalone publisher: add support for bgeo and vdb [\#3080](https://github.com/pypeclub/OpenPype/pull/3080) -- Houdini: Fix FPS + outdated content pop-ups [\#3079](https://github.com/pypeclub/OpenPype/pull/3079) -- General: Add global log verbose arguments [\#3070](https://github.com/pypeclub/OpenPype/pull/3070) -- Flame: extract presets distribution [\#3063](https://github.com/pypeclub/OpenPype/pull/3063) -- Update collect\_render.py [\#3055](https://github.com/pypeclub/OpenPype/pull/3055) -- SiteSync: Added compute\_resource\_sync\_sites to sync\_server\_module [\#2983](https://github.com/pypeclub/OpenPype/pull/2983) -- Maya: Implement Hardware Renderer 2.0 support for Render Products [\#2611](https://github.com/pypeclub/OpenPype/pull/2611) - -**๐Ÿ› Bug fixes** - -- nuke: use framerange issue [\#3254](https://github.com/pypeclub/OpenPype/pull/3254) -- Ftrack: Chunk sizes for queries has minimal condition [\#3244](https://github.com/pypeclub/OpenPype/pull/3244) -- Maya: renderman displays needs to be filtered [\#3242](https://github.com/pypeclub/OpenPype/pull/3242) -- Ftrack: Validate that the user exists on ftrack [\#3237](https://github.com/pypeclub/OpenPype/pull/3237) -- Maya: Fix support for multiple resolutions [\#3236](https://github.com/pypeclub/OpenPype/pull/3236) -- TVPaint: Look for more groups than 12 [\#3228](https://github.com/pypeclub/OpenPype/pull/3228) -- Hiero: debugging frame range and other 3.10 [\#3222](https://github.com/pypeclub/OpenPype/pull/3222) -- Project Manager: Fix persistent editors on project change [\#3218](https://github.com/pypeclub/OpenPype/pull/3218) -- Deadline: instance data overwrite fix [\#3214](https://github.com/pypeclub/OpenPype/pull/3214) -- Ftrack: Push hierarchical attributes action works [\#3210](https://github.com/pypeclub/OpenPype/pull/3210) -- Standalone Publisher: Always create new representation for thumbnail [\#3203](https://github.com/pypeclub/OpenPype/pull/3203) -- Photoshop: skip collector when automatic testing [\#3202](https://github.com/pypeclub/OpenPype/pull/3202) -- Nuke: render/workfile version sync doesn't work on farm [\#3185](https://github.com/pypeclub/OpenPype/pull/3185) -- Ftrack: Review image only if there are no mp4 reviews [\#3183](https://github.com/pypeclub/OpenPype/pull/3183) -- Ftrack: Locations deepcopy issue [\#3177](https://github.com/pypeclub/OpenPype/pull/3177) -- General: Avoid creating multiple thumbnails [\#3176](https://github.com/pypeclub/OpenPype/pull/3176) -- General/Hiero: better clip duration calculation [\#3169](https://github.com/pypeclub/OpenPype/pull/3169) -- General: Oiio conversion for ffmpeg checks for invalid characters [\#3166](https://github.com/pypeclub/OpenPype/pull/3166) -- Fix for attaching render to subset [\#3164](https://github.com/pypeclub/OpenPype/pull/3164) -- Harmony: fixed missing task name in render instance [\#3163](https://github.com/pypeclub/OpenPype/pull/3163) -- Ftrack: Action delete old versions formatting works [\#3152](https://github.com/pypeclub/OpenPype/pull/3152) -- Deadline: fix the output directory [\#3144](https://github.com/pypeclub/OpenPype/pull/3144) -- General: New Session schema [\#3141](https://github.com/pypeclub/OpenPype/pull/3141) -- General: Missing version on headless mode crash properly [\#3136](https://github.com/pypeclub/OpenPype/pull/3136) -- TVPaint: Composite layers in reversed order [\#3135](https://github.com/pypeclub/OpenPype/pull/3135) -- Nuke: fixing default settings for workfile builder loaders [\#3120](https://github.com/pypeclub/OpenPype/pull/3120) -- Nuke: fix anatomy imageio regex default [\#3119](https://github.com/pypeclub/OpenPype/pull/3119) -- General: Python 3 compatibility in queries [\#3112](https://github.com/pypeclub/OpenPype/pull/3112) -- General: TemplateResult can be copied [\#3099](https://github.com/pypeclub/OpenPype/pull/3099) -- General: Collect loaded versions skips not existing representations [\#3095](https://github.com/pypeclub/OpenPype/pull/3095) -- RoyalRender Control Submission - AVALON\_APP\_NAME default [\#3091](https://github.com/pypeclub/OpenPype/pull/3091) -- Ftrack: Update Create Folders action [\#3089](https://github.com/pypeclub/OpenPype/pull/3089) -- Maya: Collect Render fix any render cameras check [\#3088](https://github.com/pypeclub/OpenPype/pull/3088) -- Project Manager: Avoid unnecessary updates of asset documents [\#3083](https://github.com/pypeclub/OpenPype/pull/3083) -- Standalone publisher: Fix plugins install [\#3077](https://github.com/pypeclub/OpenPype/pull/3077) -- General: Extract review sequence is not converted with same names [\#3076](https://github.com/pypeclub/OpenPype/pull/3076) -- Webpublisher: Use variant value [\#3068](https://github.com/pypeclub/OpenPype/pull/3068) -- Nuke: Add aov matching even for remainder and prerender [\#3060](https://github.com/pypeclub/OpenPype/pull/3060) -- Fix support for Renderman in Maya [\#3006](https://github.com/pypeclub/OpenPype/pull/3006) - -**๐Ÿ”€ Refactored code** - -- Avalon repo removed from Jobs workflow [\#3193](https://github.com/pypeclub/OpenPype/pull/3193) -- General: Remove remaining imports from avalon [\#3130](https://github.com/pypeclub/OpenPype/pull/3130) -- General: Move mongo db logic and remove avalon repository [\#3066](https://github.com/pypeclub/OpenPype/pull/3066) -- General: Move host install [\#3009](https://github.com/pypeclub/OpenPype/pull/3009) - -**Merged pull requests:** - -- Harmony: message length in 21.1 [\#3257](https://github.com/pypeclub/OpenPype/pull/3257) -- Harmony: 21.1 fix [\#3249](https://github.com/pypeclub/OpenPype/pull/3249) -- Maya: added jpg to filter for Image Plane Loader [\#3223](https://github.com/pypeclub/OpenPype/pull/3223) -- Webpublisher: replace space by underscore in subset names [\#3160](https://github.com/pypeclub/OpenPype/pull/3160) -- StandalonePublisher: removed Extract Background plugins [\#3093](https://github.com/pypeclub/OpenPype/pull/3093) -- Nuke: added suspend\_publish knob [\#3078](https://github.com/pypeclub/OpenPype/pull/3078) -- Bump async from 2.6.3 to 2.6.4 in /website [\#3065](https://github.com/pypeclub/OpenPype/pull/3065) -- SiteSync: Download all workfile inputs [\#2966](https://github.com/pypeclub/OpenPype/pull/2966) -- Photoshop: New Publisher [\#2933](https://github.com/pypeclub/OpenPype/pull/2933) -- Bump pillow from 9.0.0 to 9.0.1 [\#2880](https://github.com/pypeclub/OpenPype/pull/2880) -- AfterEffects: Allow configuration of default variant via Settings [\#2856](https://github.com/pypeclub/OpenPype/pull/2856) - -## [3.9.8](https://github.com/pypeclub/OpenPype/tree/3.9.8) (2022-05-19) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.7...3.9.8) - -## [3.9.7](https://github.com/pypeclub/OpenPype/tree/3.9.7) (2022-05-11) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.6...3.9.7) - -## [3.9.6](https://github.com/pypeclub/OpenPype/tree/3.9.6) (2022-05-03) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.5...3.9.6) - -## [3.9.5](https://github.com/pypeclub/OpenPype/tree/3.9.5) (2022-04-25) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.4...3.9.5) - -## [3.9.4](https://github.com/pypeclub/OpenPype/tree/3.9.4) (2022-04-15) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.3...3.9.4) - -### ๐Ÿ“– Documentation - -- Documentation: more info about Tasks [\#3062](https://github.com/pypeclub/OpenPype/pull/3062) -- Documentation: Python requirements to 3.7.9 [\#3035](https://github.com/pypeclub/OpenPype/pull/3035) -- Website Docs: Remove unused pages [\#2974](https://github.com/pypeclub/OpenPype/pull/2974) - -**๐Ÿ†• New features** - -- General: Local overrides for environment variables [\#3045](https://github.com/pypeclub/OpenPype/pull/3045) -- Flame: Flare integration preparation [\#2928](https://github.com/pypeclub/OpenPype/pull/2928) - -**๐Ÿš€ Enhancements** - -- TVPaint: Added init file for worker to triggers missing sound file dialog [\#3053](https://github.com/pypeclub/OpenPype/pull/3053) -- Ftrack: Custom attributes can be filled in slate values [\#3036](https://github.com/pypeclub/OpenPype/pull/3036) -- Resolve environment variable in google drive credential path [\#3008](https://github.com/pypeclub/OpenPype/pull/3008) - -**๐Ÿ› Bug fixes** - -- GitHub: Updated push-protected action in github workflow [\#3064](https://github.com/pypeclub/OpenPype/pull/3064) -- Nuke: Typos in imports from Nuke implementation [\#3061](https://github.com/pypeclub/OpenPype/pull/3061) -- Hotfix: fixing deadline job publishing [\#3059](https://github.com/pypeclub/OpenPype/pull/3059) -- General: Extract Review handle invalid characters for ffmpeg [\#3050](https://github.com/pypeclub/OpenPype/pull/3050) -- Slate Review: Support to keep format on slate concatenation [\#3049](https://github.com/pypeclub/OpenPype/pull/3049) -- Webpublisher: fix processing of workfile [\#3048](https://github.com/pypeclub/OpenPype/pull/3048) -- Ftrack: Integrate ftrack api fix [\#3044](https://github.com/pypeclub/OpenPype/pull/3044) -- Webpublisher - removed wrong hardcoded family [\#3043](https://github.com/pypeclub/OpenPype/pull/3043) -- LibraryLoader: Use current project for asset query in families filter [\#3042](https://github.com/pypeclub/OpenPype/pull/3042) -- SiteSync: Providers ignore that site is disabled [\#3041](https://github.com/pypeclub/OpenPype/pull/3041) -- Unreal: Creator import fixes [\#3040](https://github.com/pypeclub/OpenPype/pull/3040) -- SiteSync: fix transitive alternate sites, fix dropdown in Local Settings [\#3018](https://github.com/pypeclub/OpenPype/pull/3018) -- Maya: invalid review flag on rendered AOVs [\#2915](https://github.com/pypeclub/OpenPype/pull/2915) - -**Merged pull requests:** - -- Deadline: reworked pools assignment [\#3051](https://github.com/pypeclub/OpenPype/pull/3051) -- Houdini: Avoid ImportError on `hdefereval` when Houdini runs without UI [\#2987](https://github.com/pypeclub/OpenPype/pull/2987) - -## [3.9.3](https://github.com/pypeclub/OpenPype/tree/3.9.3) (2022-04-07) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.2...3.9.3) - -### ๐Ÿ“– Documentation - -- Documentation: Added mention of adding My Drive as a root [\#2999](https://github.com/pypeclub/OpenPype/pull/2999) -- Website Docs: Manager Ftrack fix broken links [\#2979](https://github.com/pypeclub/OpenPype/pull/2979) -- Docs: Added MongoDB requirements [\#2951](https://github.com/pypeclub/OpenPype/pull/2951) -- Documentation: New publisher develop docs [\#2896](https://github.com/pypeclub/OpenPype/pull/2896) - -**๐Ÿ†• New features** - -- Ftrack: Add description integrator [\#3027](https://github.com/pypeclub/OpenPype/pull/3027) -- nuke: bypass baking [\#2992](https://github.com/pypeclub/OpenPype/pull/2992) -- Publishing textures for Unreal [\#2988](https://github.com/pypeclub/OpenPype/pull/2988) -- Maya to Unreal: Static and Skeletal Meshes [\#2978](https://github.com/pypeclub/OpenPype/pull/2978) -- Multiverse: Initial Support [\#2908](https://github.com/pypeclub/OpenPype/pull/2908) - -**๐Ÿš€ Enhancements** - -- General: default workfile subset name for workfile [\#3011](https://github.com/pypeclub/OpenPype/pull/3011) -- Ftrack: Add more options for note text of integrate ftrack note [\#3025](https://github.com/pypeclub/OpenPype/pull/3025) -- Console Interpreter: Changed how console splitter size are reused on show [\#3016](https://github.com/pypeclub/OpenPype/pull/3016) -- Deadline: Use more suitable name for sequence review logic [\#3015](https://github.com/pypeclub/OpenPype/pull/3015) -- Nuke: add concurrency attr to deadline job [\#3005](https://github.com/pypeclub/OpenPype/pull/3005) -- Photoshop: create image without instance [\#3001](https://github.com/pypeclub/OpenPype/pull/3001) -- TVPaint: Render scene family [\#3000](https://github.com/pypeclub/OpenPype/pull/3000) -- Deadline: priority configurable in Maya jobs [\#2995](https://github.com/pypeclub/OpenPype/pull/2995) -- Nuke: ReviewDataMov Read RAW attribute [\#2985](https://github.com/pypeclub/OpenPype/pull/2985) -- General: `METADATA_KEYS` constant as `frozenset` for optimal immutable lookup [\#2980](https://github.com/pypeclub/OpenPype/pull/2980) -- General: Tools with host filters [\#2975](https://github.com/pypeclub/OpenPype/pull/2975) -- Hero versions: Use custom templates [\#2967](https://github.com/pypeclub/OpenPype/pull/2967) -- Slack: Added configurable maximum file size of review upload to Slack [\#2945](https://github.com/pypeclub/OpenPype/pull/2945) -- NewPublisher: Prepared implementation of optional pyblish plugin [\#2943](https://github.com/pypeclub/OpenPype/pull/2943) -- TVPaint: Extractor to convert PNG into EXR [\#2942](https://github.com/pypeclub/OpenPype/pull/2942) -- Workfiles tool: Save as published workfiles [\#2937](https://github.com/pypeclub/OpenPype/pull/2937) -- Workfiles: Open published workfiles [\#2925](https://github.com/pypeclub/OpenPype/pull/2925) -- General: Default modules loaded dynamically [\#2923](https://github.com/pypeclub/OpenPype/pull/2923) -- CI: change the version bump logic [\#2919](https://github.com/pypeclub/OpenPype/pull/2919) -- Deadline: Add headless argument [\#2916](https://github.com/pypeclub/OpenPype/pull/2916) -- Nuke: Add no-audio Tag [\#2911](https://github.com/pypeclub/OpenPype/pull/2911) -- Ftrack: Fill workfile in custom attribute [\#2906](https://github.com/pypeclub/OpenPype/pull/2906) -- Nuke: improving readability [\#2903](https://github.com/pypeclub/OpenPype/pull/2903) -- Settings UI: Add simple tooltips for settings entities [\#2901](https://github.com/pypeclub/OpenPype/pull/2901) - -**๐Ÿ› Bug fixes** - -- General: Fix validate asset docs plug-in filename and class name [\#3029](https://github.com/pypeclub/OpenPype/pull/3029) -- Deadline: Fixed default value of use sequence for review [\#3033](https://github.com/pypeclub/OpenPype/pull/3033) -- Settings UI: Version column can be extended so version are visible [\#3032](https://github.com/pypeclub/OpenPype/pull/3032) -- General: Fix import after movements [\#3028](https://github.com/pypeclub/OpenPype/pull/3028) -- Harmony: Added creating subset name for workfile from template [\#3024](https://github.com/pypeclub/OpenPype/pull/3024) -- AfterEffects: Added creating subset name for workfile from template [\#3023](https://github.com/pypeclub/OpenPype/pull/3023) -- General: Add example addons to ignored [\#3022](https://github.com/pypeclub/OpenPype/pull/3022) -- Maya: Remove missing import [\#3017](https://github.com/pypeclub/OpenPype/pull/3017) -- Ftrack: multiple reviewable componets [\#3012](https://github.com/pypeclub/OpenPype/pull/3012) -- Tray publisher: Fixes after code movement [\#3010](https://github.com/pypeclub/OpenPype/pull/3010) -- Hosts: Remove path existence checks in 'add\_implementation\_envs' [\#3004](https://github.com/pypeclub/OpenPype/pull/3004) -- Nuke: fixing unicode type detection in effect loaders [\#3002](https://github.com/pypeclub/OpenPype/pull/3002) -- Fix - remove doubled dot in workfile created from template [\#2998](https://github.com/pypeclub/OpenPype/pull/2998) -- Nuke: removing redundant Ftrack asset when farm publishing [\#2996](https://github.com/pypeclub/OpenPype/pull/2996) -- PS: fix renaming subset incorrectly in PS [\#2991](https://github.com/pypeclub/OpenPype/pull/2991) -- Fix: Disable setuptools auto discovery [\#2990](https://github.com/pypeclub/OpenPype/pull/2990) -- AEL: fix opening existing workfile if no scene opened [\#2989](https://github.com/pypeclub/OpenPype/pull/2989) -- Maya: Don't do hardlinks on windows for look publishing [\#2986](https://github.com/pypeclub/OpenPype/pull/2986) -- Settings UI: Fix version completer on linux [\#2981](https://github.com/pypeclub/OpenPype/pull/2981) -- Photoshop: Fix creation of subset names in PS review and workfile [\#2969](https://github.com/pypeclub/OpenPype/pull/2969) -- Slack: Added default for review\_upload\_limit for Slack [\#2965](https://github.com/pypeclub/OpenPype/pull/2965) -- General: OIIO conversion for ffmeg can handle sequences [\#2958](https://github.com/pypeclub/OpenPype/pull/2958) -- Settings: Conditional dictionary avoid invalid logs [\#2956](https://github.com/pypeclub/OpenPype/pull/2956) -- General: Smaller fixes and typos [\#2950](https://github.com/pypeclub/OpenPype/pull/2950) -- LogViewer: Don't refresh on initialization [\#2949](https://github.com/pypeclub/OpenPype/pull/2949) -- nuke: python3 compatibility issue with `iteritems` [\#2948](https://github.com/pypeclub/OpenPype/pull/2948) -- General: anatomy data with correct task short key [\#2947](https://github.com/pypeclub/OpenPype/pull/2947) -- SceneInventory: Fix imports in UI [\#2944](https://github.com/pypeclub/OpenPype/pull/2944) -- Slack: add generic exception [\#2941](https://github.com/pypeclub/OpenPype/pull/2941) -- General: Python specific vendor paths on env injection [\#2939](https://github.com/pypeclub/OpenPype/pull/2939) -- General: More fail safe delete old versions [\#2936](https://github.com/pypeclub/OpenPype/pull/2936) -- Settings UI: Collapsed of collapsible wrapper works as expected [\#2934](https://github.com/pypeclub/OpenPype/pull/2934) -- Maya: Do not pass `set` to maya commands \(fixes support for older maya versions\) [\#2932](https://github.com/pypeclub/OpenPype/pull/2932) -- General: Don't print log record on OSError [\#2926](https://github.com/pypeclub/OpenPype/pull/2926) -- Hiero: Fix import of 'register\_event\_callback' [\#2924](https://github.com/pypeclub/OpenPype/pull/2924) -- Flame: centos related debugging [\#2922](https://github.com/pypeclub/OpenPype/pull/2922) -- Ftrack: Missing Ftrack id after editorial publish [\#2905](https://github.com/pypeclub/OpenPype/pull/2905) -- AfterEffects: Fix rendering for single frame in DL [\#2875](https://github.com/pypeclub/OpenPype/pull/2875) - -**๐Ÿ”€ Refactored code** - -- General: Move plugins register and discover [\#2935](https://github.com/pypeclub/OpenPype/pull/2935) -- General: Move Attribute Definitions from pipeline [\#2931](https://github.com/pypeclub/OpenPype/pull/2931) -- General: Removed silo references and terminal splash [\#2927](https://github.com/pypeclub/OpenPype/pull/2927) -- General: Move pipeline constants to OpenPype [\#2918](https://github.com/pypeclub/OpenPype/pull/2918) -- General: Move formatting and workfile functions [\#2914](https://github.com/pypeclub/OpenPype/pull/2914) -- General: Move remaining plugins from avalon [\#2912](https://github.com/pypeclub/OpenPype/pull/2912) - -**Merged pull requests:** - -- Maya: Allow to select invalid camera contents if no cameras found [\#3030](https://github.com/pypeclub/OpenPype/pull/3030) -- Bump paramiko from 2.9.2 to 2.10.1 [\#2973](https://github.com/pypeclub/OpenPype/pull/2973) -- Bump minimist from 1.2.5 to 1.2.6 in /website [\#2954](https://github.com/pypeclub/OpenPype/pull/2954) -- Bump node-forge from 1.2.1 to 1.3.0 in /website [\#2953](https://github.com/pypeclub/OpenPype/pull/2953) -- Maya - added transparency into review creator [\#2952](https://github.com/pypeclub/OpenPype/pull/2952) - -## [3.9.2](https://github.com/pypeclub/OpenPype/tree/3.9.2) (2022-04-04) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.1...3.9.2) - -## [3.9.1](https://github.com/pypeclub/OpenPype/tree/3.9.1) (2022-03-18) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.9.0...3.9.1) - -**๐Ÿš€ Enhancements** - -- General: Change how OPENPYPE\_DEBUG value is handled [\#2907](https://github.com/pypeclub/OpenPype/pull/2907) -- nuke: imageio adding ocio config version 1.2 [\#2897](https://github.com/pypeclub/OpenPype/pull/2897) -- Flame: support for comment with xml attribute overrides [\#2892](https://github.com/pypeclub/OpenPype/pull/2892) -- Nuke: ExtractReviewSlate can handle more codes and profiles [\#2879](https://github.com/pypeclub/OpenPype/pull/2879) -- Flame: sequence used for reference video [\#2869](https://github.com/pypeclub/OpenPype/pull/2869) - -**๐Ÿ› Bug fixes** - -- General: Fix use of Anatomy roots [\#2904](https://github.com/pypeclub/OpenPype/pull/2904) -- Fixing gap detection in extract review [\#2902](https://github.com/pypeclub/OpenPype/pull/2902) -- Pyblish Pype - ensure current state is correct when entering new group order [\#2899](https://github.com/pypeclub/OpenPype/pull/2899) -- SceneInventory: Fix import of load function [\#2894](https://github.com/pypeclub/OpenPype/pull/2894) -- Harmony - fixed creator issue [\#2891](https://github.com/pypeclub/OpenPype/pull/2891) -- General: Remove forgotten use of avalon Creator [\#2885](https://github.com/pypeclub/OpenPype/pull/2885) -- General: Avoid circular import [\#2884](https://github.com/pypeclub/OpenPype/pull/2884) -- Fixes for attaching loaded containers \(\#2837\) [\#2874](https://github.com/pypeclub/OpenPype/pull/2874) -- Maya: Deformer node ids validation plugin [\#2826](https://github.com/pypeclub/OpenPype/pull/2826) -- Flame Babypublisher optimalization [\#2806](https://github.com/pypeclub/OpenPype/pull/2806) -- hotfix: OIIO tool path - add extension on windows [\#2618](https://github.com/pypeclub/OpenPype/pull/2618) - -**๐Ÿ”€ Refactored code** - -- General: Reduce style usage to OpenPype repository [\#2889](https://github.com/pypeclub/OpenPype/pull/2889) -- General: Move loader logic from avalon to openpype [\#2886](https://github.com/pypeclub/OpenPype/pull/2886) - -## [3.9.0](https://github.com/pypeclub/OpenPype/tree/3.9.0) (2022-03-14) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.8.2...3.9.0) - -**Deprecated:** - -- Houdini: Remove unused code [\#2779](https://github.com/pypeclub/OpenPype/pull/2779) -- Loader: Remove default family states for hosts from code [\#2706](https://github.com/pypeclub/OpenPype/pull/2706) -- AssetCreator: Remove the tool [\#2845](https://github.com/pypeclub/OpenPype/pull/2845) - -### ๐Ÿ“– Documentation - -- Documentation: fixed broken links [\#2799](https://github.com/pypeclub/OpenPype/pull/2799) -- Documentation: broken link fix [\#2785](https://github.com/pypeclub/OpenPype/pull/2785) -- Documentation: link fixes [\#2772](https://github.com/pypeclub/OpenPype/pull/2772) -- Update docusaurus to latest version [\#2760](https://github.com/pypeclub/OpenPype/pull/2760) -- Various testing updates [\#2726](https://github.com/pypeclub/OpenPype/pull/2726) -- documentation: add example to `repack-version` command [\#2669](https://github.com/pypeclub/OpenPype/pull/2669) -- Update docusaurus [\#2639](https://github.com/pypeclub/OpenPype/pull/2639) -- Documentation: Fixed relative links [\#2621](https://github.com/pypeclub/OpenPype/pull/2621) -- Documentation: Change Photoshop & AfterEffects plugin path [\#2878](https://github.com/pypeclub/OpenPype/pull/2878) - -**๐Ÿ†• New features** - -- Flame: loading clips to reels [\#2622](https://github.com/pypeclub/OpenPype/pull/2622) -- General: Store settings by OpenPype version [\#2570](https://github.com/pypeclub/OpenPype/pull/2570) - -**๐Ÿš€ Enhancements** - -- New: Validation exceptions [\#2841](https://github.com/pypeclub/OpenPype/pull/2841) -- General: Set context environments for non host applications [\#2803](https://github.com/pypeclub/OpenPype/pull/2803) -- Houdini: Remove duplicate ValidateOutputNode plug-in [\#2780](https://github.com/pypeclub/OpenPype/pull/2780) -- Tray publisher: New Tray Publisher host \(beta\) [\#2778](https://github.com/pypeclub/OpenPype/pull/2778) -- Slack: Added regex for filtering on subset names [\#2775](https://github.com/pypeclub/OpenPype/pull/2775) -- Houdini: Implement Reset Frame Range [\#2770](https://github.com/pypeclub/OpenPype/pull/2770) -- Pyblish Pype: Remove redundant new line in installed fonts printing [\#2758](https://github.com/pypeclub/OpenPype/pull/2758) -- Flame: use Shot Name on segment for asset name [\#2751](https://github.com/pypeclub/OpenPype/pull/2751) -- Flame: adding validator source clip [\#2746](https://github.com/pypeclub/OpenPype/pull/2746) -- Work Files: Preserve subversion comment of current filename by default [\#2734](https://github.com/pypeclub/OpenPype/pull/2734) -- Maya: set Deadline job/batch name to original source workfile name instead of published workfile [\#2733](https://github.com/pypeclub/OpenPype/pull/2733) -- Ftrack: Disable ftrack module by default [\#2732](https://github.com/pypeclub/OpenPype/pull/2732) -- Project Manager: Disable add task, add asset and save button when not in a project [\#2727](https://github.com/pypeclub/OpenPype/pull/2727) -- dropbox handle big file [\#2718](https://github.com/pypeclub/OpenPype/pull/2718) -- Fusion Move PR: Minor tweaks to Fusion integration [\#2716](https://github.com/pypeclub/OpenPype/pull/2716) -- RoyalRender: Minor enhancements [\#2700](https://github.com/pypeclub/OpenPype/pull/2700) -- Nuke: prerender with review knob [\#2691](https://github.com/pypeclub/OpenPype/pull/2691) -- Maya configurable unit validator [\#2680](https://github.com/pypeclub/OpenPype/pull/2680) -- General: Add settings for CleanUpFarm and disable the plugin by default [\#2679](https://github.com/pypeclub/OpenPype/pull/2679) -- Project Manager: Only allow scroll wheel edits when spinbox is active [\#2678](https://github.com/pypeclub/OpenPype/pull/2678) -- Ftrack: Sync description to assets [\#2670](https://github.com/pypeclub/OpenPype/pull/2670) -- Houdini: Moved to OpenPype [\#2658](https://github.com/pypeclub/OpenPype/pull/2658) -- Maya: Move implementation to OpenPype [\#2649](https://github.com/pypeclub/OpenPype/pull/2649) -- General: FFmpeg conversion also check attribute string length [\#2635](https://github.com/pypeclub/OpenPype/pull/2635) -- Houdini: Load Arnold .ass procedurals into Houdini [\#2606](https://github.com/pypeclub/OpenPype/pull/2606) -- Deadline: Simplify GlobalJobPreLoad logic [\#2605](https://github.com/pypeclub/OpenPype/pull/2605) -- Houdini: Implement Arnold .ass standin extraction from Houdini \(also support .ass.gz\) [\#2603](https://github.com/pypeclub/OpenPype/pull/2603) -- New Publisher: New features and preparations for new standalone publisher [\#2556](https://github.com/pypeclub/OpenPype/pull/2556) -- Fix Maya 2022 Python 3 compatibility [\#2445](https://github.com/pypeclub/OpenPype/pull/2445) -- TVPaint: Use new publisher exceptions in validators [\#2435](https://github.com/pypeclub/OpenPype/pull/2435) -- Harmony: Added new style validations for New Publisher [\#2434](https://github.com/pypeclub/OpenPype/pull/2434) -- Aftereffects: New style validations for New publisher [\#2430](https://github.com/pypeclub/OpenPype/pull/2430) -- Farm publishing: New cleanup plugin for Maya renders on farm [\#2390](https://github.com/pypeclub/OpenPype/pull/2390) -- General: Subset name filtering in ExtractReview outpus [\#2872](https://github.com/pypeclub/OpenPype/pull/2872) -- NewPublisher: Descriptions and Icons in creator dialog [\#2867](https://github.com/pypeclub/OpenPype/pull/2867) -- NewPublisher: Changing task on publishing instance [\#2863](https://github.com/pypeclub/OpenPype/pull/2863) -- TrayPublisher: Choose project widget is more clear [\#2859](https://github.com/pypeclub/OpenPype/pull/2859) -- Maya: add loaded containers to published instance [\#2837](https://github.com/pypeclub/OpenPype/pull/2837) -- Ftrack: Can sync fps as string [\#2836](https://github.com/pypeclub/OpenPype/pull/2836) -- General: Custom function for find executable [\#2822](https://github.com/pypeclub/OpenPype/pull/2822) -- General: Color dialog UI fixes [\#2817](https://github.com/pypeclub/OpenPype/pull/2817) -- global: letter box calculated on output as last process [\#2812](https://github.com/pypeclub/OpenPype/pull/2812) -- Nuke: adding Reformat to baking mov plugin [\#2811](https://github.com/pypeclub/OpenPype/pull/2811) -- Manager: Update all to latest button [\#2805](https://github.com/pypeclub/OpenPype/pull/2805) -- Houdini: Move Houdini Save Current File to beginning of ExtractorOrder [\#2747](https://github.com/pypeclub/OpenPype/pull/2747) -- Global: adding studio name/code to anatomy template formatting data [\#2630](https://github.com/pypeclub/OpenPype/pull/2630) - -**๐Ÿ› Bug fixes** - -- Settings UI: Search case sensitivity [\#2810](https://github.com/pypeclub/OpenPype/pull/2810) -- resolve: fixing fusion module loading [\#2802](https://github.com/pypeclub/OpenPype/pull/2802) -- Ftrack: Unset task ids from asset versions before tasks are removed [\#2800](https://github.com/pypeclub/OpenPype/pull/2800) -- Slack: fail gracefully if slack exception [\#2798](https://github.com/pypeclub/OpenPype/pull/2798) -- Flame: Fix version string in default settings [\#2783](https://github.com/pypeclub/OpenPype/pull/2783) -- After Effects: Fix typo in name `afftereffects` -\> `aftereffects` [\#2768](https://github.com/pypeclub/OpenPype/pull/2768) -- Houdini: Fix open last workfile [\#2767](https://github.com/pypeclub/OpenPype/pull/2767) -- Avoid renaming udim indexes [\#2765](https://github.com/pypeclub/OpenPype/pull/2765) -- Maya: Fix `unique_namespace` when in an namespace that is empty [\#2759](https://github.com/pypeclub/OpenPype/pull/2759) -- Loader UI: Fix right click in representation widget [\#2757](https://github.com/pypeclub/OpenPype/pull/2757) -- Harmony: Rendering in Deadline didn't work in other machines than submitter [\#2754](https://github.com/pypeclub/OpenPype/pull/2754) -- Aftereffects 2022 and Deadline [\#2748](https://github.com/pypeclub/OpenPype/pull/2748) -- Flame: bunch of bugs [\#2745](https://github.com/pypeclub/OpenPype/pull/2745) -- Maya: Save current scene on workfile publish [\#2744](https://github.com/pypeclub/OpenPype/pull/2744) -- Version Up: Preserve parts of filename after version number \(like subversion\) on version\_up [\#2741](https://github.com/pypeclub/OpenPype/pull/2741) -- Loader UI: Multiple asset selection and underline colors fixed [\#2731](https://github.com/pypeclub/OpenPype/pull/2731) -- General: Fix loading of unused chars in xml format [\#2729](https://github.com/pypeclub/OpenPype/pull/2729) -- TVPaint: Set objectName with members [\#2725](https://github.com/pypeclub/OpenPype/pull/2725) -- General: Don't use 'objectName' from loaded references [\#2715](https://github.com/pypeclub/OpenPype/pull/2715) -- Settings: Studio Project anatomy is queried using right keys [\#2711](https://github.com/pypeclub/OpenPype/pull/2711) -- Local Settings: Additional applications don't break UI [\#2710](https://github.com/pypeclub/OpenPype/pull/2710) -- Maya: Remove some unused code [\#2709](https://github.com/pypeclub/OpenPype/pull/2709) -- Houdini: Fix refactor of Houdini host move for CreateArnoldAss [\#2704](https://github.com/pypeclub/OpenPype/pull/2704) -- LookAssigner: Fix imports after moving code to OpenPype repository [\#2701](https://github.com/pypeclub/OpenPype/pull/2701) -- Multiple hosts: unify menu style across hosts [\#2693](https://github.com/pypeclub/OpenPype/pull/2693) -- Maya Redshift fixes [\#2692](https://github.com/pypeclub/OpenPype/pull/2692) -- Maya: fix fps validation popup [\#2685](https://github.com/pypeclub/OpenPype/pull/2685) -- Houdini Explicitly collect correct frame name even in case of single frame render when `frameStart` is provided [\#2676](https://github.com/pypeclub/OpenPype/pull/2676) -- hiero: fix effect collector name and order [\#2673](https://github.com/pypeclub/OpenPype/pull/2673) -- Maya: Fix menu callbacks [\#2671](https://github.com/pypeclub/OpenPype/pull/2671) -- hiero: removing obsolete unsupported plugin [\#2667](https://github.com/pypeclub/OpenPype/pull/2667) -- Launcher: Fix access to 'data' attribute on actions [\#2659](https://github.com/pypeclub/OpenPype/pull/2659) -- Maya `vrscene` loader fixes [\#2633](https://github.com/pypeclub/OpenPype/pull/2633) -- Houdini: fix usd family in loader and integrators [\#2631](https://github.com/pypeclub/OpenPype/pull/2631) -- Maya: Add only reference node to look family container like with other families [\#2508](https://github.com/pypeclub/OpenPype/pull/2508) -- General: Missing time function [\#2877](https://github.com/pypeclub/OpenPype/pull/2877) -- Deadline: Fix plugin name for tile assemble [\#2868](https://github.com/pypeclub/OpenPype/pull/2868) -- Nuke: gizmo precollect fix [\#2866](https://github.com/pypeclub/OpenPype/pull/2866) -- General: Fix hardlink for windows [\#2864](https://github.com/pypeclub/OpenPype/pull/2864) -- General: ffmpeg was crashing on slate merge [\#2860](https://github.com/pypeclub/OpenPype/pull/2860) -- WebPublisher: Video file was published with one too many frame [\#2858](https://github.com/pypeclub/OpenPype/pull/2858) -- New Publisher: Error dialog got right styles [\#2857](https://github.com/pypeclub/OpenPype/pull/2857) -- General: Fix getattr clalback on dynamic modules [\#2855](https://github.com/pypeclub/OpenPype/pull/2855) -- Nuke: slate resolution to input video resolution [\#2853](https://github.com/pypeclub/OpenPype/pull/2853) -- WebPublisher: Fix username stored in DB [\#2852](https://github.com/pypeclub/OpenPype/pull/2852) -- WebPublisher: Fix wrong number of frames for video file [\#2851](https://github.com/pypeclub/OpenPype/pull/2851) -- Nuke: Fix family test in validate\_write\_legacy to work with stillImage [\#2847](https://github.com/pypeclub/OpenPype/pull/2847) -- Nuke: fix multiple baking profile farm publishing [\#2842](https://github.com/pypeclub/OpenPype/pull/2842) -- Blender: Fixed parameters for FBX export of the camera [\#2840](https://github.com/pypeclub/OpenPype/pull/2840) -- Maya: Stop creation of reviews for Cryptomattes [\#2832](https://github.com/pypeclub/OpenPype/pull/2832) -- Deadline: Remove recreated event [\#2828](https://github.com/pypeclub/OpenPype/pull/2828) -- Deadline: Added missing events folder [\#2827](https://github.com/pypeclub/OpenPype/pull/2827) -- Settings: Missing document with OP versions may break start of OpenPype [\#2825](https://github.com/pypeclub/OpenPype/pull/2825) -- Deadline: more detailed temp file name for environment json [\#2824](https://github.com/pypeclub/OpenPype/pull/2824) -- General: Host name was formed from obsolete code [\#2821](https://github.com/pypeclub/OpenPype/pull/2821) -- Settings UI: Fix "Apply from" action [\#2820](https://github.com/pypeclub/OpenPype/pull/2820) -- Ftrack: Job killer with missing user [\#2819](https://github.com/pypeclub/OpenPype/pull/2819) -- Nuke: Use AVALON\_APP to get value for "app" key [\#2818](https://github.com/pypeclub/OpenPype/pull/2818) -- StandalonePublisher: use dynamic groups in subset names [\#2816](https://github.com/pypeclub/OpenPype/pull/2816) - -**๐Ÿ”€ Refactored code** - -- Ftrack: Moved module one hierarchy level higher [\#2792](https://github.com/pypeclub/OpenPype/pull/2792) -- SyncServer: Moved module one hierarchy level higher [\#2791](https://github.com/pypeclub/OpenPype/pull/2791) -- Royal render: Move module one hierarchy level higher [\#2790](https://github.com/pypeclub/OpenPype/pull/2790) -- Deadline: Move module one hierarchy level higher [\#2789](https://github.com/pypeclub/OpenPype/pull/2789) -- Refactor: move webserver tool to openpype [\#2876](https://github.com/pypeclub/OpenPype/pull/2876) -- General: Move create logic from avalon to OpenPype [\#2854](https://github.com/pypeclub/OpenPype/pull/2854) -- General: Add vendors from avalon [\#2848](https://github.com/pypeclub/OpenPype/pull/2848) -- General: Basic event system [\#2846](https://github.com/pypeclub/OpenPype/pull/2846) -- General: Move change context functions [\#2839](https://github.com/pypeclub/OpenPype/pull/2839) -- Tools: Don't use avalon tools code [\#2829](https://github.com/pypeclub/OpenPype/pull/2829) -- Move Unreal Implementation to OpenPype [\#2823](https://github.com/pypeclub/OpenPype/pull/2823) -- General: Extract template formatting from anatomy [\#2766](https://github.com/pypeclub/OpenPype/pull/2766) - -**Merged pull requests:** - -- Fusion: Moved implementation into OpenPype [\#2713](https://github.com/pypeclub/OpenPype/pull/2713) -- TVPaint: Plugin build without dependencies [\#2705](https://github.com/pypeclub/OpenPype/pull/2705) -- Webpublisher: Photoshop create a beauty png [\#2689](https://github.com/pypeclub/OpenPype/pull/2689) -- Ftrack: Hierarchical attributes are queried properly [\#2682](https://github.com/pypeclub/OpenPype/pull/2682) -- Maya: Add Validate Frame Range settings [\#2661](https://github.com/pypeclub/OpenPype/pull/2661) -- Harmony: move to Openpype [\#2657](https://github.com/pypeclub/OpenPype/pull/2657) -- Maya: cleanup duplicate rendersetup code [\#2642](https://github.com/pypeclub/OpenPype/pull/2642) -- Deadline: Be able to pass Mongo url to job [\#2616](https://github.com/pypeclub/OpenPype/pull/2616) - -## [3.8.2](https://github.com/pypeclub/OpenPype/tree/3.8.2) (2022-02-07) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.8.1...3.8.2) - -### ๐Ÿ“– Documentation - -- Cosmetics: Fix common typos in openpype/website [\#2617](https://github.com/pypeclub/OpenPype/pull/2617) - -**๐Ÿš€ Enhancements** - -- TVPaint: Image loaders also work on review family [\#2638](https://github.com/pypeclub/OpenPype/pull/2638) -- General: Project backup tools [\#2629](https://github.com/pypeclub/OpenPype/pull/2629) -- nuke: adding clear button to write nodes [\#2627](https://github.com/pypeclub/OpenPype/pull/2627) -- Ftrack: Family to Asset type mapping is in settings [\#2602](https://github.com/pypeclub/OpenPype/pull/2602) -- Nuke: load color space from representation data [\#2576](https://github.com/pypeclub/OpenPype/pull/2576) - -**๐Ÿ› Bug fixes** - -- Fix pulling of cx\_freeze 6.10 [\#2628](https://github.com/pypeclub/OpenPype/pull/2628) -- Global: fix broken otio review extractor [\#2590](https://github.com/pypeclub/OpenPype/pull/2590) - -**Merged pull requests:** - -- WebPublisher: fix instance duplicates [\#2641](https://github.com/pypeclub/OpenPype/pull/2641) -- Fix - safer pulling of task name for webpublishing from PS [\#2613](https://github.com/pypeclub/OpenPype/pull/2613) - -## [3.8.1](https://github.com/pypeclub/OpenPype/tree/3.8.1) (2022-02-01) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.8.0...3.8.1) - -**๐Ÿš€ Enhancements** - -- Webpublisher: Thumbnail extractor [\#2600](https://github.com/pypeclub/OpenPype/pull/2600) -- Loader: Allow to toggle default family filters between "include" or "exclude" filtering [\#2541](https://github.com/pypeclub/OpenPype/pull/2541) -- Launcher: Added context menu to to skip opening last workfile [\#2536](https://github.com/pypeclub/OpenPype/pull/2536) -- Unreal: JSON Layout Loading support [\#2066](https://github.com/pypeclub/OpenPype/pull/2066) - -**๐Ÿ› Bug fixes** - -- Release/3.8.0 [\#2619](https://github.com/pypeclub/OpenPype/pull/2619) -- Settings: Enum does not store empty string if has single item to select [\#2615](https://github.com/pypeclub/OpenPype/pull/2615) -- switch distutils to sysconfig for `get_platform()` [\#2594](https://github.com/pypeclub/OpenPype/pull/2594) -- Fix poetry index and speedcopy update [\#2589](https://github.com/pypeclub/OpenPype/pull/2589) -- Webpublisher: Fix - subset names from processed .psd used wrong value for task [\#2586](https://github.com/pypeclub/OpenPype/pull/2586) -- `vrscene` creator Deadline webservice URL handling [\#2580](https://github.com/pypeclub/OpenPype/pull/2580) -- global: track name was failing if duplicated root word in name [\#2568](https://github.com/pypeclub/OpenPype/pull/2568) -- Validate Maya Rig produces no cycle errors [\#2484](https://github.com/pypeclub/OpenPype/pull/2484) - -**Merged pull requests:** - -- Bump pillow from 8.4.0 to 9.0.0 [\#2595](https://github.com/pypeclub/OpenPype/pull/2595) -- Webpublisher: Skip version collect [\#2591](https://github.com/pypeclub/OpenPype/pull/2591) -- build\(deps\): bump pillow from 8.4.0 to 9.0.0 [\#2523](https://github.com/pypeclub/OpenPype/pull/2523) - -## [3.8.0](https://github.com/pypeclub/OpenPype/tree/3.8.0) (2022-01-24) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.7.0...3.8.0) - -### ๐Ÿ“– Documentation - -- Variable in docs renamed to proper name [\#2546](https://github.com/pypeclub/OpenPype/pull/2546) - -**๐Ÿ†• New features** - -- Flame: extracting segments with trans-coding [\#2547](https://github.com/pypeclub/OpenPype/pull/2547) -- Maya : V-Ray Proxy - load all ABC files via proxy [\#2544](https://github.com/pypeclub/OpenPype/pull/2544) -- Maya to Unreal: Extended static mesh workflow [\#2537](https://github.com/pypeclub/OpenPype/pull/2537) -- Flame: collecting publishable instances [\#2519](https://github.com/pypeclub/OpenPype/pull/2519) -- Flame: create publishable clips [\#2495](https://github.com/pypeclub/OpenPype/pull/2495) -- Flame: OpenTimelineIO Export Modul [\#2398](https://github.com/pypeclub/OpenPype/pull/2398) - -**๐Ÿš€ Enhancements** - -- Webpublisher: Moved error at the beginning of the log [\#2559](https://github.com/pypeclub/OpenPype/pull/2559) -- Ftrack: Use ApplicationManager to get DJV path [\#2558](https://github.com/pypeclub/OpenPype/pull/2558) -- Webpublisher: Added endpoint to reprocess batch through UI [\#2555](https://github.com/pypeclub/OpenPype/pull/2555) -- Settings: PathInput strip passed string [\#2550](https://github.com/pypeclub/OpenPype/pull/2550) -- Global: Exctract Review anatomy fill data with output name [\#2548](https://github.com/pypeclub/OpenPype/pull/2548) -- Cosmetics: Clean up some cosmetics / typos [\#2542](https://github.com/pypeclub/OpenPype/pull/2542) -- General: Validate if current process OpenPype version is requested version [\#2529](https://github.com/pypeclub/OpenPype/pull/2529) -- General: Be able to use anatomy data in ffmpeg output arguments [\#2525](https://github.com/pypeclub/OpenPype/pull/2525) -- Expose toggle publish plug-in settings for Maya Look Shading Engine Naming [\#2521](https://github.com/pypeclub/OpenPype/pull/2521) -- Photoshop: Move implementation to OpenPype [\#2510](https://github.com/pypeclub/OpenPype/pull/2510) -- TimersManager: Move module one hierarchy higher [\#2501](https://github.com/pypeclub/OpenPype/pull/2501) -- Slack: notifications are sent with Openpype logo and bot name [\#2499](https://github.com/pypeclub/OpenPype/pull/2499) -- Slack: Add review to notification message [\#2498](https://github.com/pypeclub/OpenPype/pull/2498) -- Ftrack: Event handlers settings [\#2496](https://github.com/pypeclub/OpenPype/pull/2496) -- Tools: Fix style and modality of errors in loader and creator [\#2489](https://github.com/pypeclub/OpenPype/pull/2489) -- Maya: Collect 'fps' animation data only for "review" instances [\#2486](https://github.com/pypeclub/OpenPype/pull/2486) -- Project Manager: Remove project button cleanup [\#2482](https://github.com/pypeclub/OpenPype/pull/2482) -- Tools: Be able to change models of tasks and assets widgets [\#2475](https://github.com/pypeclub/OpenPype/pull/2475) -- Publish pype: Reduce publish process defering [\#2464](https://github.com/pypeclub/OpenPype/pull/2464) -- Maya: Improve speed of Collect History logic [\#2460](https://github.com/pypeclub/OpenPype/pull/2460) -- Maya: Validate Rig Controllers - fix Error: in script editor [\#2459](https://github.com/pypeclub/OpenPype/pull/2459) -- Maya: Validate NGONs simplify and speed-up [\#2458](https://github.com/pypeclub/OpenPype/pull/2458) -- Maya: Optimize Validate Locked Normals speed for dense polymeshes [\#2457](https://github.com/pypeclub/OpenPype/pull/2457) -- Maya: Refactor missing \_get\_reference\_node method [\#2455](https://github.com/pypeclub/OpenPype/pull/2455) -- Houdini: Remove broken unique name counter [\#2450](https://github.com/pypeclub/OpenPype/pull/2450) -- Maya: Improve lib.polyConstraint performance when Select tool is not the active tool context [\#2447](https://github.com/pypeclub/OpenPype/pull/2447) -- General: Validate third party before build [\#2425](https://github.com/pypeclub/OpenPype/pull/2425) -- Maya : add option to not group reference in ReferenceLoader [\#2383](https://github.com/pypeclub/OpenPype/pull/2383) - -**๐Ÿ› Bug fixes** - -- AfterEffects: Fix - removed obsolete import [\#2577](https://github.com/pypeclub/OpenPype/pull/2577) -- General: OpenPype version updates [\#2575](https://github.com/pypeclub/OpenPype/pull/2575) -- Ftrack: Delete action revision [\#2563](https://github.com/pypeclub/OpenPype/pull/2563) -- Webpublisher: ftrack shows incorrect user names [\#2560](https://github.com/pypeclub/OpenPype/pull/2560) -- General: Do not validate version if build does not support it [\#2557](https://github.com/pypeclub/OpenPype/pull/2557) -- Webpublisher: Fixed progress reporting [\#2553](https://github.com/pypeclub/OpenPype/pull/2553) -- Fix Maya AssProxyLoader version switch [\#2551](https://github.com/pypeclub/OpenPype/pull/2551) -- General: Fix install thread in igniter [\#2549](https://github.com/pypeclub/OpenPype/pull/2549) -- Houdini: vdbcache family preserve frame numbers on publish integration + enable validate version for Houdini [\#2535](https://github.com/pypeclub/OpenPype/pull/2535) -- Maya: Fix Load VDB to V-Ray [\#2533](https://github.com/pypeclub/OpenPype/pull/2533) -- Maya: ReferenceLoader fix not unique group name error for attach to root [\#2532](https://github.com/pypeclub/OpenPype/pull/2532) -- Maya: namespaced context go back to original namespace when started from inside a namespace [\#2531](https://github.com/pypeclub/OpenPype/pull/2531) -- Fix create zip tool - path argument [\#2522](https://github.com/pypeclub/OpenPype/pull/2522) -- Maya: Fix Extract Look with space in names [\#2518](https://github.com/pypeclub/OpenPype/pull/2518) -- Fix published frame content for sequence starting with 0 [\#2513](https://github.com/pypeclub/OpenPype/pull/2513) -- Maya: reset empty string attributes correctly to "" instead of "None" [\#2506](https://github.com/pypeclub/OpenPype/pull/2506) -- Improve FusionPreLaunch hook errors [\#2505](https://github.com/pypeclub/OpenPype/pull/2505) -- General: Settings work if OpenPypeVersion is available [\#2494](https://github.com/pypeclub/OpenPype/pull/2494) -- General: PYTHONPATH may break OpenPype dependencies [\#2493](https://github.com/pypeclub/OpenPype/pull/2493) -- General: Modules import function output fix [\#2492](https://github.com/pypeclub/OpenPype/pull/2492) -- AE: fix hiding of alert window below Publish [\#2491](https://github.com/pypeclub/OpenPype/pull/2491) -- Workfiles tool: Files widget show files on first show [\#2488](https://github.com/pypeclub/OpenPype/pull/2488) -- General: Custom template paths filter fix [\#2483](https://github.com/pypeclub/OpenPype/pull/2483) -- Loader: Remove always on top flag in tray [\#2480](https://github.com/pypeclub/OpenPype/pull/2480) -- General: Anatomy does not return root envs as unicode [\#2465](https://github.com/pypeclub/OpenPype/pull/2465) -- Maya: Validate Shape Zero do not keep fixed geometry vertices selected/active after repair [\#2456](https://github.com/pypeclub/OpenPype/pull/2456) - -**Merged pull requests:** - -- AfterEffects: Move implementation to OpenPype [\#2543](https://github.com/pypeclub/OpenPype/pull/2543) -- Maya: Remove Maya Look Assigner check on startup [\#2540](https://github.com/pypeclub/OpenPype/pull/2540) -- build\(deps\): bump shelljs from 0.8.4 to 0.8.5 in /website [\#2538](https://github.com/pypeclub/OpenPype/pull/2538) -- build\(deps\): bump follow-redirects from 1.14.4 to 1.14.7 in /website [\#2534](https://github.com/pypeclub/OpenPype/pull/2534) -- Nuke: Merge avalon's implementation into OpenPype [\#2514](https://github.com/pypeclub/OpenPype/pull/2514) -- Maya: Vray fix proxies look assignment [\#2392](https://github.com/pypeclub/OpenPype/pull/2392) -- Bump algoliasearch-helper from 3.4.4 to 3.6.2 in /website [\#2297](https://github.com/pypeclub/OpenPype/pull/2297) - -## [3.7.0](https://github.com/pypeclub/OpenPype/tree/3.7.0) (2022-01-04) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.4...3.7.0) - -**Deprecated:** - -- General: Default modules hierarchy n2 [\#2368](https://github.com/pypeclub/OpenPype/pull/2368) - -### ๐Ÿ“– Documentation - -- docs\[website\]: Add Ellipse Studio \(logo\) as an OpenPype contributor [\#2324](https://github.com/pypeclub/OpenPype/pull/2324) - -**๐Ÿ†• New features** - -- Settings UI use OpenPype styles [\#2296](https://github.com/pypeclub/OpenPype/pull/2296) -- Store typed version dependencies for workfiles [\#2192](https://github.com/pypeclub/OpenPype/pull/2192) -- OpenPypeV3: add key task type, task shortname and user to path templating construction [\#2157](https://github.com/pypeclub/OpenPype/pull/2157) -- Nuke: Alembic model workflow [\#2140](https://github.com/pypeclub/OpenPype/pull/2140) -- TVPaint: Load workfile from published. [\#1980](https://github.com/pypeclub/OpenPype/pull/1980) - -**๐Ÿš€ Enhancements** - -- General: Workdir extra folders [\#2462](https://github.com/pypeclub/OpenPype/pull/2462) -- Photoshop: New style validations for New publisher [\#2429](https://github.com/pypeclub/OpenPype/pull/2429) -- General: Environment variables groups [\#2424](https://github.com/pypeclub/OpenPype/pull/2424) -- Unreal: Dynamic menu created in Python [\#2422](https://github.com/pypeclub/OpenPype/pull/2422) -- Settings UI: Hyperlinks to settings [\#2420](https://github.com/pypeclub/OpenPype/pull/2420) -- Modules: JobQueue module moved one hierarchy level higher [\#2419](https://github.com/pypeclub/OpenPype/pull/2419) -- TimersManager: Start timer post launch hook [\#2418](https://github.com/pypeclub/OpenPype/pull/2418) -- General: Run applications as separate processes under linux [\#2408](https://github.com/pypeclub/OpenPype/pull/2408) -- Ftrack: Check existence of object type on recreation [\#2404](https://github.com/pypeclub/OpenPype/pull/2404) -- Enhancement: Global cleanup plugin that explicitly remove paths from context [\#2402](https://github.com/pypeclub/OpenPype/pull/2402) -- General: MongoDB ability to specify replica set groups [\#2401](https://github.com/pypeclub/OpenPype/pull/2401) -- Flame: moving `utility_scripts` to api folder also with `scripts` [\#2385](https://github.com/pypeclub/OpenPype/pull/2385) -- Centos 7 dependency compatibility [\#2384](https://github.com/pypeclub/OpenPype/pull/2384) -- Enhancement: Settings: Use project settings values from another project [\#2382](https://github.com/pypeclub/OpenPype/pull/2382) -- Blender 3: Support auto install for new blender version [\#2377](https://github.com/pypeclub/OpenPype/pull/2377) -- Maya add render image path to settings [\#2375](https://github.com/pypeclub/OpenPype/pull/2375) -- Settings: Webpublisher in hosts enum [\#2367](https://github.com/pypeclub/OpenPype/pull/2367) -- Hiero: python3 compatibility [\#2365](https://github.com/pypeclub/OpenPype/pull/2365) -- Burnins: Be able recognize mxf OPAtom format [\#2361](https://github.com/pypeclub/OpenPype/pull/2361) -- Maya: Add is\_static\_image\_plane and is\_in\_all\_views option in imagePlaneLoader [\#2356](https://github.com/pypeclub/OpenPype/pull/2356) -- Local settings: Copyable studio paths [\#2349](https://github.com/pypeclub/OpenPype/pull/2349) -- Assets Widget: Clear model on project change [\#2345](https://github.com/pypeclub/OpenPype/pull/2345) -- General: OpenPype default modules hierarchy [\#2338](https://github.com/pypeclub/OpenPype/pull/2338) -- TVPaint: Move implementation to OpenPype [\#2336](https://github.com/pypeclub/OpenPype/pull/2336) -- General: FFprobe error exception contain original error message [\#2328](https://github.com/pypeclub/OpenPype/pull/2328) -- Resolve: Add experimental button to menu [\#2325](https://github.com/pypeclub/OpenPype/pull/2325) -- Hiero: Add experimental tools action [\#2323](https://github.com/pypeclub/OpenPype/pull/2323) -- Input links: Cleanup and unification of differences [\#2322](https://github.com/pypeclub/OpenPype/pull/2322) -- General: Don't validate vendor bin with executing them [\#2317](https://github.com/pypeclub/OpenPype/pull/2317) -- General: Multilayer EXRs support [\#2315](https://github.com/pypeclub/OpenPype/pull/2315) -- General: Run process log stderr as info log level [\#2309](https://github.com/pypeclub/OpenPype/pull/2309) -- General: Reduce vendor imports [\#2305](https://github.com/pypeclub/OpenPype/pull/2305) -- Tools: Cleanup of unused classes [\#2304](https://github.com/pypeclub/OpenPype/pull/2304) -- Project Manager: Added ability to delete project [\#2298](https://github.com/pypeclub/OpenPype/pull/2298) -- Ftrack: Synchronize input links [\#2287](https://github.com/pypeclub/OpenPype/pull/2287) -- StandalonePublisher: Remove unused plugin ExtractHarmonyZip [\#2277](https://github.com/pypeclub/OpenPype/pull/2277) -- Ftrack: Support multiple reviews [\#2271](https://github.com/pypeclub/OpenPype/pull/2271) -- Ftrack: Remove unused clean component plugin [\#2269](https://github.com/pypeclub/OpenPype/pull/2269) -- Royal Render: Support for rr channels in separate dirs [\#2268](https://github.com/pypeclub/OpenPype/pull/2268) -- Houdini: Add experimental tools action [\#2267](https://github.com/pypeclub/OpenPype/pull/2267) -- Nuke: extract baked review videos presets [\#2248](https://github.com/pypeclub/OpenPype/pull/2248) -- TVPaint: Workers rendering [\#2209](https://github.com/pypeclub/OpenPype/pull/2209) -- OpenPypeV3: Add key parent asset to path templating construction [\#2186](https://github.com/pypeclub/OpenPype/pull/2186) - -**๐Ÿ› Bug fixes** - -- TVPaint: Create render layer dialog is in front [\#2471](https://github.com/pypeclub/OpenPype/pull/2471) -- Short Pyblish plugin path [\#2428](https://github.com/pypeclub/OpenPype/pull/2428) -- PS: Introduced settings for invalid characters to use in ValidateNaming plugin [\#2417](https://github.com/pypeclub/OpenPype/pull/2417) -- Settings UI: Breadcrumbs path does not create new entities [\#2416](https://github.com/pypeclub/OpenPype/pull/2416) -- AfterEffects: Variant 2022 is in defaults but missing in schemas [\#2412](https://github.com/pypeclub/OpenPype/pull/2412) -- Nuke: baking representations was not additive [\#2406](https://github.com/pypeclub/OpenPype/pull/2406) -- General: Fix access to environments from default settings [\#2403](https://github.com/pypeclub/OpenPype/pull/2403) -- Fix: Placeholder Input color set fix [\#2399](https://github.com/pypeclub/OpenPype/pull/2399) -- Settings: Fix state change of wrapper label [\#2396](https://github.com/pypeclub/OpenPype/pull/2396) -- Flame: fix ftrack publisher [\#2381](https://github.com/pypeclub/OpenPype/pull/2381) -- hiero: solve custom ocio path [\#2379](https://github.com/pypeclub/OpenPype/pull/2379) -- hiero: fix workio and flatten [\#2378](https://github.com/pypeclub/OpenPype/pull/2378) -- Nuke: fixing menu re-drawing during context change [\#2374](https://github.com/pypeclub/OpenPype/pull/2374) -- Webpublisher: Fix assignment of families of TVpaint instances [\#2373](https://github.com/pypeclub/OpenPype/pull/2373) -- Nuke: fixing node name based on switched asset name [\#2369](https://github.com/pypeclub/OpenPype/pull/2369) -- JobQueue: Fix loading of settings [\#2362](https://github.com/pypeclub/OpenPype/pull/2362) -- Tools: Placeholder color [\#2359](https://github.com/pypeclub/OpenPype/pull/2359) -- Launcher: Minimize button on MacOs [\#2355](https://github.com/pypeclub/OpenPype/pull/2355) -- StandalonePublisher: Fix import of constant [\#2354](https://github.com/pypeclub/OpenPype/pull/2354) -- Houdini: Fix HDA creation [\#2350](https://github.com/pypeclub/OpenPype/pull/2350) -- Adobe products show issue [\#2347](https://github.com/pypeclub/OpenPype/pull/2347) -- Maya Look Assigner: Fix Python 3 compatibility [\#2343](https://github.com/pypeclub/OpenPype/pull/2343) -- Remove wrongly used host for hook [\#2342](https://github.com/pypeclub/OpenPype/pull/2342) -- Tools: Use Qt context on tools show [\#2340](https://github.com/pypeclub/OpenPype/pull/2340) -- Flame: Fix default argument value in custom dictionary [\#2339](https://github.com/pypeclub/OpenPype/pull/2339) -- Timers Manager: Disable auto stop timer on linux platform [\#2334](https://github.com/pypeclub/OpenPype/pull/2334) -- nuke: bake preset single input exception [\#2331](https://github.com/pypeclub/OpenPype/pull/2331) -- Hiero: fixing multiple templates at a hierarchy parent [\#2330](https://github.com/pypeclub/OpenPype/pull/2330) -- Fix - provider icons are pulled from a folder [\#2326](https://github.com/pypeclub/OpenPype/pull/2326) -- InputLinks: Typo in "inputLinks" key [\#2314](https://github.com/pypeclub/OpenPype/pull/2314) -- Deadline timeout and logging [\#2312](https://github.com/pypeclub/OpenPype/pull/2312) -- nuke: do not multiply representation on class method [\#2311](https://github.com/pypeclub/OpenPype/pull/2311) -- Workfiles tool: Fix task formatting [\#2306](https://github.com/pypeclub/OpenPype/pull/2306) -- Delivery: Fix delivery paths created on windows [\#2302](https://github.com/pypeclub/OpenPype/pull/2302) -- Maya: Deadline - fix limit groups [\#2295](https://github.com/pypeclub/OpenPype/pull/2295) -- Royal Render: Fix plugin order and OpenPype auto-detection [\#2291](https://github.com/pypeclub/OpenPype/pull/2291) -- New Publisher: Fix mapping of indexes [\#2285](https://github.com/pypeclub/OpenPype/pull/2285) -- Alternate site for site sync doesnt work for sequences [\#2284](https://github.com/pypeclub/OpenPype/pull/2284) -- FFmpeg: Execute ffprobe using list of arguments instead of string command [\#2281](https://github.com/pypeclub/OpenPype/pull/2281) -- Nuke: Anatomy fill data use task as dictionary [\#2278](https://github.com/pypeclub/OpenPype/pull/2278) -- Bug: fix variable name \_asset\_id in workfiles application [\#2274](https://github.com/pypeclub/OpenPype/pull/2274) -- Version handling fixes [\#2272](https://github.com/pypeclub/OpenPype/pull/2272) - -**Merged pull requests:** - -- Maya: Replaced PATH usage with vendored oiio path for maketx utility [\#2405](https://github.com/pypeclub/OpenPype/pull/2405) -- \[Fix\]\[MAYA\] Handle message type attribute within CollectLook [\#2394](https://github.com/pypeclub/OpenPype/pull/2394) -- Add validator to check correct version of extension for PS and AE [\#2387](https://github.com/pypeclub/OpenPype/pull/2387) -- Maya: configurable model top level validation [\#2321](https://github.com/pypeclub/OpenPype/pull/2321) -- Create test publish class for After Effects [\#2270](https://github.com/pypeclub/OpenPype/pull/2270) - -## [3.6.4](https://github.com/pypeclub/OpenPype/tree/3.6.4) (2021-11-23) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.3...3.6.4) - -**๐Ÿ› Bug fixes** - -- Nuke: inventory update removes all loaded read nodes [\#2294](https://github.com/pypeclub/OpenPype/pull/2294) - -## [3.6.3](https://github.com/pypeclub/OpenPype/tree/3.6.3) (2021-11-19) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.2...3.6.3) - -**๐Ÿ› Bug fixes** - -- Deadline: Fix publish targets [\#2280](https://github.com/pypeclub/OpenPype/pull/2280) - -## [3.6.2](https://github.com/pypeclub/OpenPype/tree/3.6.2) (2021-11-18) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.1...3.6.2) - -**๐Ÿš€ Enhancements** - -- Tools: Assets widget [\#2265](https://github.com/pypeclub/OpenPype/pull/2265) -- SceneInventory: Choose loader in asset switcher [\#2262](https://github.com/pypeclub/OpenPype/pull/2262) -- Style: New fonts in OpenPype style [\#2256](https://github.com/pypeclub/OpenPype/pull/2256) -- Tools: SceneInventory in OpenPype [\#2255](https://github.com/pypeclub/OpenPype/pull/2255) -- Tools: Tasks widget [\#2251](https://github.com/pypeclub/OpenPype/pull/2251) -- Tools: Creator in OpenPype [\#2244](https://github.com/pypeclub/OpenPype/pull/2244) -- Added endpoint for configured extensions [\#2221](https://github.com/pypeclub/OpenPype/pull/2221) - -**๐Ÿ› Bug fixes** - -- Tools: Parenting of tools in Nuke and Hiero [\#2266](https://github.com/pypeclub/OpenPype/pull/2266) -- limiting validator to specific editorial hosts [\#2264](https://github.com/pypeclub/OpenPype/pull/2264) -- Tools: Select Context dialog attribute fix [\#2261](https://github.com/pypeclub/OpenPype/pull/2261) -- Maya: Render publishing fails on linux [\#2260](https://github.com/pypeclub/OpenPype/pull/2260) -- LookAssigner: Fix tool reopen [\#2259](https://github.com/pypeclub/OpenPype/pull/2259) -- Standalone: editorial not publishing thumbnails on all subsets [\#2258](https://github.com/pypeclub/OpenPype/pull/2258) -- Burnins: Support mxf metadata [\#2247](https://github.com/pypeclub/OpenPype/pull/2247) -- Maya: Support for configurable AOV separator characters [\#2197](https://github.com/pypeclub/OpenPype/pull/2197) -- Maya: texture colorspace modes in looks [\#2195](https://github.com/pypeclub/OpenPype/pull/2195) - -## [3.6.1](https://github.com/pypeclub/OpenPype/tree/3.6.1) (2021-11-16) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.6.0...3.6.1) - -**๐Ÿ› Bug fixes** - -- Loader doesn't allow changing of version before loading [\#2254](https://github.com/pypeclub/OpenPype/pull/2254) - -## [3.6.0](https://github.com/pypeclub/OpenPype/tree/3.6.0) (2021-11-15) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.5.0...3.6.0) - -### ๐Ÿ“– Documentation - -- Add alternative sites for Site Sync [\#2206](https://github.com/pypeclub/OpenPype/pull/2206) -- Add command line way of running site sync server [\#2188](https://github.com/pypeclub/OpenPype/pull/2188) - -**๐Ÿ†• New features** - -- Add validate active site button to sync queue on a project [\#2176](https://github.com/pypeclub/OpenPype/pull/2176) -- Maya : Colorspace configuration [\#2170](https://github.com/pypeclub/OpenPype/pull/2170) -- Blender: Added support for audio [\#2168](https://github.com/pypeclub/OpenPype/pull/2168) -- Flame: a host basic integration [\#2165](https://github.com/pypeclub/OpenPype/pull/2165) -- Houdini: simple HDA workflow [\#2072](https://github.com/pypeclub/OpenPype/pull/2072) -- Basic Royal Render Integration โœจ [\#2061](https://github.com/pypeclub/OpenPype/pull/2061) -- Camera handling between Blender and Unreal [\#1988](https://github.com/pypeclub/OpenPype/pull/1988) -- switch PyQt5 for PySide2 [\#1744](https://github.com/pypeclub/OpenPype/pull/1744) - -**๐Ÿš€ Enhancements** - -- Tools: Subset manager in OpenPype [\#2243](https://github.com/pypeclub/OpenPype/pull/2243) -- General: Skip module directories without init file [\#2239](https://github.com/pypeclub/OpenPype/pull/2239) -- General: Static interfaces [\#2238](https://github.com/pypeclub/OpenPype/pull/2238) -- Style: Fix transparent image in style [\#2235](https://github.com/pypeclub/OpenPype/pull/2235) -- Add a "following workfile versioning" option on publish [\#2225](https://github.com/pypeclub/OpenPype/pull/2225) -- Modules: Module can add cli commands [\#2224](https://github.com/pypeclub/OpenPype/pull/2224) -- Webpublisher: Separate webpublisher logic [\#2222](https://github.com/pypeclub/OpenPype/pull/2222) -- Add both side availability on Site Sync sites to Loader [\#2220](https://github.com/pypeclub/OpenPype/pull/2220) -- Tools: Center loader and library loader on show [\#2219](https://github.com/pypeclub/OpenPype/pull/2219) -- Maya : Validate shape zero [\#2212](https://github.com/pypeclub/OpenPype/pull/2212) -- Maya : validate unique names [\#2211](https://github.com/pypeclub/OpenPype/pull/2211) -- Tools: OpenPype stylesheet in workfiles tool [\#2208](https://github.com/pypeclub/OpenPype/pull/2208) -- Ftrack: Replace Queue with deque in event handlers logic [\#2204](https://github.com/pypeclub/OpenPype/pull/2204) -- Tools: New select context dialog [\#2200](https://github.com/pypeclub/OpenPype/pull/2200) -- Maya : Validate mesh ngons [\#2199](https://github.com/pypeclub/OpenPype/pull/2199) -- Dirmap in Nuke [\#2198](https://github.com/pypeclub/OpenPype/pull/2198) -- Delivery: Check 'frame' key in template for sequence delivery [\#2196](https://github.com/pypeclub/OpenPype/pull/2196) -- Settings: Site sync project settings improvement [\#2193](https://github.com/pypeclub/OpenPype/pull/2193) -- Usage of tools code [\#2185](https://github.com/pypeclub/OpenPype/pull/2185) -- Settings: Dictionary based on project roots [\#2184](https://github.com/pypeclub/OpenPype/pull/2184) -- Subset name: Be able to pass asset document to get subset name [\#2179](https://github.com/pypeclub/OpenPype/pull/2179) -- Tools: Experimental tools [\#2167](https://github.com/pypeclub/OpenPype/pull/2167) -- Loader: Refactor and use OpenPype stylesheets [\#2166](https://github.com/pypeclub/OpenPype/pull/2166) -- Add loader for linked smart objects in photoshop [\#2149](https://github.com/pypeclub/OpenPype/pull/2149) -- Burnins: DNxHD profiles handling [\#2142](https://github.com/pypeclub/OpenPype/pull/2142) -- Tools: Single access point for host tools [\#2139](https://github.com/pypeclub/OpenPype/pull/2139) - -**๐Ÿ› Bug fixes** - -- Ftrack: Sync project ftrack id cache issue [\#2250](https://github.com/pypeclub/OpenPype/pull/2250) -- Ftrack: Session creation and Prepare project [\#2245](https://github.com/pypeclub/OpenPype/pull/2245) -- Added queue for studio processing in PS [\#2237](https://github.com/pypeclub/OpenPype/pull/2237) -- Python 2: Unicode to string conversion [\#2236](https://github.com/pypeclub/OpenPype/pull/2236) -- Fix - enum for color coding in PS [\#2234](https://github.com/pypeclub/OpenPype/pull/2234) -- Pyblish Tool: Fix targets handling [\#2232](https://github.com/pypeclub/OpenPype/pull/2232) -- Ftrack: Base event fix of 'get\_project\_from\_entity' method [\#2214](https://github.com/pypeclub/OpenPype/pull/2214) -- Maya : multiple subsets review broken [\#2210](https://github.com/pypeclub/OpenPype/pull/2210) -- Fix - different command used for Linux and Mac OS [\#2207](https://github.com/pypeclub/OpenPype/pull/2207) -- Tools: Workfiles tool don't use avalon widgets [\#2205](https://github.com/pypeclub/OpenPype/pull/2205) -- Ftrack: Fill missing ftrack id on mongo project [\#2203](https://github.com/pypeclub/OpenPype/pull/2203) -- Project Manager: Fix copying of tasks [\#2191](https://github.com/pypeclub/OpenPype/pull/2191) -- StandalonePublisher: Source validator don't expect representations [\#2190](https://github.com/pypeclub/OpenPype/pull/2190) -- Blender: Fix trying to pack an image when the shader node has no texture [\#2183](https://github.com/pypeclub/OpenPype/pull/2183) -- Maya: review viewport settings [\#2177](https://github.com/pypeclub/OpenPype/pull/2177) -- MacOS: Launching of applications may cause Permissions error [\#2175](https://github.com/pypeclub/OpenPype/pull/2175) -- Maya: Aspect ratio [\#2174](https://github.com/pypeclub/OpenPype/pull/2174) -- Blender: Fix 'Deselect All' with object not in 'Object Mode' [\#2163](https://github.com/pypeclub/OpenPype/pull/2163) -- Tools: Stylesheets are applied after tool show [\#2161](https://github.com/pypeclub/OpenPype/pull/2161) -- Maya: Collect render - fix UNC path support ๐Ÿ› [\#2158](https://github.com/pypeclub/OpenPype/pull/2158) -- Maya: Fix hotbox broken by scriptsmenu [\#2151](https://github.com/pypeclub/OpenPype/pull/2151) -- Ftrack: Ignore save warnings exception in Prepare project action [\#2150](https://github.com/pypeclub/OpenPype/pull/2150) -- Loader thumbnails with smooth edges [\#2147](https://github.com/pypeclub/OpenPype/pull/2147) -- Added validator for source files for Standalone Publisher [\#2138](https://github.com/pypeclub/OpenPype/pull/2138) - -**Merged pull requests:** - -- Bump pillow from 8.2.0 to 8.3.2 [\#2162](https://github.com/pypeclub/OpenPype/pull/2162) -- Bump axios from 0.21.1 to 0.21.4 in /website [\#2059](https://github.com/pypeclub/OpenPype/pull/2059) - -## [3.5.0](https://github.com/pypeclub/OpenPype/tree/3.5.0) (2021-10-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.4.1...3.5.0) - -**Deprecated:** - -- Maya: Change mayaAscii family to mayaScene [\#2106](https://github.com/pypeclub/OpenPype/pull/2106) - -**๐Ÿ†• New features** - -- Added project and task into context change message in Maya [\#2131](https://github.com/pypeclub/OpenPype/pull/2131) -- Add ExtractBurnin to photoshop review [\#2124](https://github.com/pypeclub/OpenPype/pull/2124) -- PYPE-1218 - changed namespace to contain subset name in Maya [\#2114](https://github.com/pypeclub/OpenPype/pull/2114) -- Added running configurable disk mapping command before start of OP [\#2091](https://github.com/pypeclub/OpenPype/pull/2091) -- SFTP provider [\#2073](https://github.com/pypeclub/OpenPype/pull/2073) -- Maya: Validate setdress top group [\#2068](https://github.com/pypeclub/OpenPype/pull/2068) -- Maya: Enable publishing render attrib sets \(e.g. V-Ray Displacement\) with model [\#1955](https://github.com/pypeclub/OpenPype/pull/1955) - -**๐Ÿš€ Enhancements** - -- Maya: make rig validators configurable in settings [\#2137](https://github.com/pypeclub/OpenPype/pull/2137) -- Settings: Updated readme for entity types in settings [\#2132](https://github.com/pypeclub/OpenPype/pull/2132) -- Nuke: unified clip loader [\#2128](https://github.com/pypeclub/OpenPype/pull/2128) -- Settings UI: Project model refreshing and sorting [\#2104](https://github.com/pypeclub/OpenPype/pull/2104) -- Create Read From Rendered - Disable Relative paths by default [\#2093](https://github.com/pypeclub/OpenPype/pull/2093) -- Added choosing different dirmap mapping if workfile synched locally [\#2088](https://github.com/pypeclub/OpenPype/pull/2088) -- General: Remove IdleManager module [\#2084](https://github.com/pypeclub/OpenPype/pull/2084) -- Tray UI: Message box about missing settings defaults [\#2080](https://github.com/pypeclub/OpenPype/pull/2080) -- Tray UI: Show menu where first click happened [\#2079](https://github.com/pypeclub/OpenPype/pull/2079) -- Global: add global validators to settings [\#2078](https://github.com/pypeclub/OpenPype/pull/2078) -- Use CRF for burnin when available [\#2070](https://github.com/pypeclub/OpenPype/pull/2070) -- Project manager: Filter first item after selection of project [\#2069](https://github.com/pypeclub/OpenPype/pull/2069) -- Nuke: Adding `still` image family workflow [\#2064](https://github.com/pypeclub/OpenPype/pull/2064) -- Maya: validate authorized loaded plugins [\#2062](https://github.com/pypeclub/OpenPype/pull/2062) -- Tools: add support for pyenv on windows [\#2051](https://github.com/pypeclub/OpenPype/pull/2051) -- SyncServer: Dropbox Provider [\#1979](https://github.com/pypeclub/OpenPype/pull/1979) -- Burnin: Get data from context with defined keys. [\#1897](https://github.com/pypeclub/OpenPype/pull/1897) -- Timers manager: Get task time [\#1896](https://github.com/pypeclub/OpenPype/pull/1896) -- TVPaint: Option to stop timer on application exit. [\#1887](https://github.com/pypeclub/OpenPype/pull/1887) - -**๐Ÿ› Bug fixes** - -- Maya: fix model publishing [\#2130](https://github.com/pypeclub/OpenPype/pull/2130) -- Fix - oiiotool wasn't recognized even if present [\#2129](https://github.com/pypeclub/OpenPype/pull/2129) -- General: Disk mapping group [\#2120](https://github.com/pypeclub/OpenPype/pull/2120) -- Hiero: publishing effect first time makes wrong resources path [\#2115](https://github.com/pypeclub/OpenPype/pull/2115) -- Add startup script for Houdini Core. [\#2110](https://github.com/pypeclub/OpenPype/pull/2110) -- TVPaint: Behavior name of loop also accept repeat [\#2109](https://github.com/pypeclub/OpenPype/pull/2109) -- Ftrack: Project settings save custom attributes skip unknown attributes [\#2103](https://github.com/pypeclub/OpenPype/pull/2103) -- Blender: Fix NoneType error when animation\_data is missing for a rig [\#2101](https://github.com/pypeclub/OpenPype/pull/2101) -- Fix broken import in sftp provider [\#2100](https://github.com/pypeclub/OpenPype/pull/2100) -- Global: Fix docstring on publish plugin extract review [\#2097](https://github.com/pypeclub/OpenPype/pull/2097) -- Delivery Action Files Sequence fix [\#2096](https://github.com/pypeclub/OpenPype/pull/2096) -- General: Cloud mongo ca certificate issue [\#2095](https://github.com/pypeclub/OpenPype/pull/2095) -- TVPaint: Creator use context from workfile [\#2087](https://github.com/pypeclub/OpenPype/pull/2087) -- Blender: fix texture missing when publishing blend files [\#2085](https://github.com/pypeclub/OpenPype/pull/2085) -- General: Startup validations oiio tool path fix on linux [\#2083](https://github.com/pypeclub/OpenPype/pull/2083) -- Deadline: Collect deadline server does not check existence of deadline key [\#2082](https://github.com/pypeclub/OpenPype/pull/2082) -- Blender: fixed Curves with modifiers in Rigs [\#2081](https://github.com/pypeclub/OpenPype/pull/2081) -- Nuke UI scaling [\#2077](https://github.com/pypeclub/OpenPype/pull/2077) -- Maya: Fix multi-camera renders [\#2065](https://github.com/pypeclub/OpenPype/pull/2065) -- Fix Sync Queue when project disabled [\#2063](https://github.com/pypeclub/OpenPype/pull/2063) - -**Merged pull requests:** - -- Bump pywin32 from 300 to 301 [\#2086](https://github.com/pypeclub/OpenPype/pull/2086) - -## [3.4.1](https://github.com/pypeclub/OpenPype/tree/3.4.1) (2021-09-23) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.4.0...3.4.1) - -**๐Ÿ†• New features** - -- Settings: Flag project as deactivated and hide from tools' view [\#2008](https://github.com/pypeclub/OpenPype/pull/2008) - -**๐Ÿš€ Enhancements** - -- General: Startup validations [\#2054](https://github.com/pypeclub/OpenPype/pull/2054) -- Nuke: proxy mode validator [\#2052](https://github.com/pypeclub/OpenPype/pull/2052) -- Ftrack: Removed ftrack interface [\#2049](https://github.com/pypeclub/OpenPype/pull/2049) -- Settings UI: Deffered set value on entity [\#2044](https://github.com/pypeclub/OpenPype/pull/2044) -- Loader: Families filtering [\#2043](https://github.com/pypeclub/OpenPype/pull/2043) -- Settings UI: Project view enhancements [\#2042](https://github.com/pypeclub/OpenPype/pull/2042) -- Settings for Nuke IncrementScriptVersion [\#2039](https://github.com/pypeclub/OpenPype/pull/2039) -- Loader & Library loader: Use tools from OpenPype [\#2038](https://github.com/pypeclub/OpenPype/pull/2038) -- Adding predefined project folders creation in PM [\#2030](https://github.com/pypeclub/OpenPype/pull/2030) -- WebserverModule: Removed interface of webserver module [\#2028](https://github.com/pypeclub/OpenPype/pull/2028) -- TimersManager: Removed interface of timers manager [\#2024](https://github.com/pypeclub/OpenPype/pull/2024) -- Feature Maya import asset from scene inventory [\#2018](https://github.com/pypeclub/OpenPype/pull/2018) - -**๐Ÿ› Bug fixes** - -- Timers manger: Typo fix [\#2058](https://github.com/pypeclub/OpenPype/pull/2058) -- Hiero: Editorial fixes [\#2057](https://github.com/pypeclub/OpenPype/pull/2057) -- Differentiate jpg sequences from thumbnail [\#2056](https://github.com/pypeclub/OpenPype/pull/2056) -- FFmpeg: Split command to list does not work [\#2046](https://github.com/pypeclub/OpenPype/pull/2046) -- Removed shell flag in subprocess call [\#2045](https://github.com/pypeclub/OpenPype/pull/2045) - -**Merged pull requests:** - -- Bump prismjs from 1.24.0 to 1.25.0 in /website [\#2050](https://github.com/pypeclub/OpenPype/pull/2050) - -## [3.4.0](https://github.com/pypeclub/OpenPype/tree/3.4.0) (2021-09-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.3.1...3.4.0) - -### ๐Ÿ“– Documentation - -- Documentation: Ftrack launch argsuments update [\#2014](https://github.com/pypeclub/OpenPype/pull/2014) -- Nuke Quick Start / Tutorial [\#1952](https://github.com/pypeclub/OpenPype/pull/1952) -- Houdini: add Camera, Point Cache, Composite, Redshift ROP and VDB Cache support [\#1821](https://github.com/pypeclub/OpenPype/pull/1821) - -**๐Ÿ†• New features** - -- Nuke: Compatibility with Nuke 13 [\#2003](https://github.com/pypeclub/OpenPype/pull/2003) -- Maya: Add Xgen family support [\#1947](https://github.com/pypeclub/OpenPype/pull/1947) -- Feature/webpublisher backend [\#1876](https://github.com/pypeclub/OpenPype/pull/1876) -- Blender: Improved assets handling [\#1615](https://github.com/pypeclub/OpenPype/pull/1615) - -**๐Ÿš€ Enhancements** - -- Added possibility to configure of synchronization of workfile versionโ€ฆ [\#2041](https://github.com/pypeclub/OpenPype/pull/2041) -- General: Task types in profiles [\#2036](https://github.com/pypeclub/OpenPype/pull/2036) -- Console interpreter: Handle invalid sizes on initialization [\#2022](https://github.com/pypeclub/OpenPype/pull/2022) -- Ftrack: Show OpenPype versions in event server status [\#2019](https://github.com/pypeclub/OpenPype/pull/2019) -- General: Staging icon [\#2017](https://github.com/pypeclub/OpenPype/pull/2017) -- Ftrack: Sync to avalon actions have jobs [\#2015](https://github.com/pypeclub/OpenPype/pull/2015) -- Modules: Connect method is not required [\#2009](https://github.com/pypeclub/OpenPype/pull/2009) -- Settings UI: Number with configurable steps [\#2001](https://github.com/pypeclub/OpenPype/pull/2001) -- Moving project folder structure creation out of ftrack module \#1989 [\#1996](https://github.com/pypeclub/OpenPype/pull/1996) -- Configurable items for providers without Settings [\#1987](https://github.com/pypeclub/OpenPype/pull/1987) -- Global: Example addons [\#1986](https://github.com/pypeclub/OpenPype/pull/1986) -- Standalone Publisher: Extract harmony zip handle workfile template [\#1982](https://github.com/pypeclub/OpenPype/pull/1982) -- Settings UI: Number sliders [\#1978](https://github.com/pypeclub/OpenPype/pull/1978) -- Workfiles: Support more workfile templates [\#1966](https://github.com/pypeclub/OpenPype/pull/1966) -- Launcher: Fix crashes on action click [\#1964](https://github.com/pypeclub/OpenPype/pull/1964) -- Settings: Minor fixes in UI and missing default values [\#1963](https://github.com/pypeclub/OpenPype/pull/1963) -- Blender: Toggle system console works on windows [\#1962](https://github.com/pypeclub/OpenPype/pull/1962) -- Global: Settings defined by Addons/Modules [\#1959](https://github.com/pypeclub/OpenPype/pull/1959) -- CI: change release numbering triggers [\#1954](https://github.com/pypeclub/OpenPype/pull/1954) -- Global: Avalon Host name collector [\#1949](https://github.com/pypeclub/OpenPype/pull/1949) -- Global: Define hosts in CollectSceneVersion [\#1948](https://github.com/pypeclub/OpenPype/pull/1948) -- Add face sets to exported alembics [\#1942](https://github.com/pypeclub/OpenPype/pull/1942) -- OpenPype: Add version validation and `--headless` mode and update progress ๐Ÿ”„ [\#1939](https://github.com/pypeclub/OpenPype/pull/1939) -- \#1894 - adds host to template\_name\_profiles for filtering [\#1915](https://github.com/pypeclub/OpenPype/pull/1915) -- Environments: Tool environments in alphabetical order [\#1910](https://github.com/pypeclub/OpenPype/pull/1910) -- Disregard publishing time. [\#1888](https://github.com/pypeclub/OpenPype/pull/1888) -- Dynamic modules [\#1872](https://github.com/pypeclub/OpenPype/pull/1872) - -**๐Ÿ› Bug fixes** - -- Workfiles tool: Task selection [\#2040](https://github.com/pypeclub/OpenPype/pull/2040) -- Ftrack: Delete old versions missing settings key [\#2037](https://github.com/pypeclub/OpenPype/pull/2037) -- Nuke: typo on a button [\#2034](https://github.com/pypeclub/OpenPype/pull/2034) -- Hiero: Fix "none" named tags [\#2033](https://github.com/pypeclub/OpenPype/pull/2033) -- FFmpeg: Subprocess arguments as list [\#2032](https://github.com/pypeclub/OpenPype/pull/2032) -- General: Fix Python 2 breaking line [\#2016](https://github.com/pypeclub/OpenPype/pull/2016) -- Bugfix/webpublisher task type [\#2006](https://github.com/pypeclub/OpenPype/pull/2006) -- Nuke thumbnails generated from middle of the sequence [\#1992](https://github.com/pypeclub/OpenPype/pull/1992) -- Nuke: last version from path gets correct version [\#1990](https://github.com/pypeclub/OpenPype/pull/1990) -- nuke, resolve, hiero: precollector order lest then 0.5 [\#1984](https://github.com/pypeclub/OpenPype/pull/1984) -- Last workfile with multiple work templates [\#1981](https://github.com/pypeclub/OpenPype/pull/1981) -- Collectors order [\#1977](https://github.com/pypeclub/OpenPype/pull/1977) -- Stop timer was within validator order range. [\#1975](https://github.com/pypeclub/OpenPype/pull/1975) -- Ftrack: arrow submodule has https url source [\#1974](https://github.com/pypeclub/OpenPype/pull/1974) -- Ftrack: Fix hosts attribute in collect ftrack username [\#1972](https://github.com/pypeclub/OpenPype/pull/1972) -- Deadline: Houdini plugins in different hierarchy [\#1970](https://github.com/pypeclub/OpenPype/pull/1970) -- Removed deprecated submodules [\#1967](https://github.com/pypeclub/OpenPype/pull/1967) -- Global: ExtractJpeg can handle filepaths with spaces [\#1961](https://github.com/pypeclub/OpenPype/pull/1961) -- Resolve path when adding to zip [\#1960](https://github.com/pypeclub/OpenPype/pull/1960) - -**Merged pull requests:** - -- Bump url-parse from 1.5.1 to 1.5.3 in /website [\#1958](https://github.com/pypeclub/OpenPype/pull/1958) -- Bump path-parse from 1.0.6 to 1.0.7 in /website [\#1933](https://github.com/pypeclub/OpenPype/pull/1933) - -## [3.3.1](https://github.com/pypeclub/OpenPype/tree/3.3.1) (2021-08-20) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.3.0...3.3.1) - -**๐Ÿ› Bug fixes** - -- TVPaint: Fixed rendered frame indexes [\#1946](https://github.com/pypeclub/OpenPype/pull/1946) -- Maya: Menu actions fix [\#1945](https://github.com/pypeclub/OpenPype/pull/1945) -- standalone: editorial shared object problem [\#1941](https://github.com/pypeclub/OpenPype/pull/1941) -- Bugfix nuke deadline app name [\#1928](https://github.com/pypeclub/OpenPype/pull/1928) - -## [3.3.0](https://github.com/pypeclub/OpenPype/tree/3.3.0) (2021-08-17) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.2.0...3.3.0) - -### ๐Ÿ“– Documentation - -- Standalone Publish of textures family [\#1834](https://github.com/pypeclub/OpenPype/pull/1834) - -**๐Ÿ†• New features** - -- Settings UI: Breadcrumbs in settings [\#1932](https://github.com/pypeclub/OpenPype/pull/1932) -- Maya: Scene patching ๐Ÿฉนon submission to Deadline [\#1923](https://github.com/pypeclub/OpenPype/pull/1923) -- Feature AE local render [\#1901](https://github.com/pypeclub/OpenPype/pull/1901) - -**๐Ÿš€ Enhancements** - -- Python console interpreter [\#1940](https://github.com/pypeclub/OpenPype/pull/1940) -- Global: Updated logos and Default settings [\#1927](https://github.com/pypeclub/OpenPype/pull/1927) -- Check for missing โœจ Python when using `pyenv` [\#1925](https://github.com/pypeclub/OpenPype/pull/1925) -- Settings: Default values for enum [\#1920](https://github.com/pypeclub/OpenPype/pull/1920) -- Settings UI: Modifiable dict view enhance [\#1919](https://github.com/pypeclub/OpenPype/pull/1919) -- submodules: avalon-core update [\#1911](https://github.com/pypeclub/OpenPype/pull/1911) -- Ftrack: Where I run action enhancement [\#1900](https://github.com/pypeclub/OpenPype/pull/1900) -- Ftrack: Private project server actions [\#1899](https://github.com/pypeclub/OpenPype/pull/1899) -- Support nested studio plugins paths. [\#1898](https://github.com/pypeclub/OpenPype/pull/1898) -- Settings: global validators with options [\#1892](https://github.com/pypeclub/OpenPype/pull/1892) -- Settings: Conditional dict enum positioning [\#1891](https://github.com/pypeclub/OpenPype/pull/1891) -- Expose stop timer through rest api. [\#1886](https://github.com/pypeclub/OpenPype/pull/1886) -- TVPaint: Increment workfile [\#1885](https://github.com/pypeclub/OpenPype/pull/1885) -- Allow Multiple Notes to run on tasks. [\#1882](https://github.com/pypeclub/OpenPype/pull/1882) -- Prepare for pyside2 [\#1869](https://github.com/pypeclub/OpenPype/pull/1869) -- Filter hosts in settings host-enum [\#1868](https://github.com/pypeclub/OpenPype/pull/1868) -- Local actions with process identifier [\#1867](https://github.com/pypeclub/OpenPype/pull/1867) -- Workfile tool start at host launch support [\#1865](https://github.com/pypeclub/OpenPype/pull/1865) -- Anatomy schema validation [\#1864](https://github.com/pypeclub/OpenPype/pull/1864) -- Ftrack prepare project structure [\#1861](https://github.com/pypeclub/OpenPype/pull/1861) -- Maya: support for configurable `dirmap` ๐Ÿ—บ๏ธ [\#1859](https://github.com/pypeclub/OpenPype/pull/1859) -- Independent general environments [\#1853](https://github.com/pypeclub/OpenPype/pull/1853) -- TVPaint Start Frame [\#1844](https://github.com/pypeclub/OpenPype/pull/1844) -- Ftrack push attributes action adds traceback to job [\#1843](https://github.com/pypeclub/OpenPype/pull/1843) -- Prepare project action enhance [\#1838](https://github.com/pypeclub/OpenPype/pull/1838) -- nuke: settings create missing default subsets [\#1829](https://github.com/pypeclub/OpenPype/pull/1829) -- Update poetry lock [\#1823](https://github.com/pypeclub/OpenPype/pull/1823) -- Settings: settings for plugins [\#1819](https://github.com/pypeclub/OpenPype/pull/1819) -- Settings list can use template or schema as object type [\#1815](https://github.com/pypeclub/OpenPype/pull/1815) -- Maya: Deadline custom settings [\#1797](https://github.com/pypeclub/OpenPype/pull/1797) -- Maya: Shader name validation [\#1762](https://github.com/pypeclub/OpenPype/pull/1762) - -**๐Ÿ› Bug fixes** - -- Fix - ftrack family was added incorrectly in some cases [\#1935](https://github.com/pypeclub/OpenPype/pull/1935) -- Fix - Deadline publish on Linux started Tray instead of headless publishing [\#1930](https://github.com/pypeclub/OpenPype/pull/1930) -- Maya: Validate Model Name - repair accident deletion in settings defaults [\#1929](https://github.com/pypeclub/OpenPype/pull/1929) -- Nuke: submit to farm failed due `ftrack` family remove [\#1926](https://github.com/pypeclub/OpenPype/pull/1926) -- Fix - validate takes repre\["files"\] as list all the time [\#1922](https://github.com/pypeclub/OpenPype/pull/1922) -- standalone: validator asset parents [\#1917](https://github.com/pypeclub/OpenPype/pull/1917) -- Nuke: update video file crassing [\#1916](https://github.com/pypeclub/OpenPype/pull/1916) -- Fix - texture validators for workfiles triggers only for textures workfiles [\#1914](https://github.com/pypeclub/OpenPype/pull/1914) -- Settings UI: List order works as expected [\#1906](https://github.com/pypeclub/OpenPype/pull/1906) -- Hiero: loaded clip was not set colorspace from version data [\#1904](https://github.com/pypeclub/OpenPype/pull/1904) -- Pyblish UI: Fix collecting stage processing [\#1903](https://github.com/pypeclub/OpenPype/pull/1903) -- Burnins: Use input's bitrate in h624 [\#1902](https://github.com/pypeclub/OpenPype/pull/1902) -- Bug: fixed python detection [\#1893](https://github.com/pypeclub/OpenPype/pull/1893) -- global: integrate name missing default template [\#1890](https://github.com/pypeclub/OpenPype/pull/1890) -- publisher: editorial plugins fixes [\#1889](https://github.com/pypeclub/OpenPype/pull/1889) -- Normalize path returned from Workfiles. [\#1880](https://github.com/pypeclub/OpenPype/pull/1880) -- Workfiles tool event arguments fix [\#1862](https://github.com/pypeclub/OpenPype/pull/1862) -- imageio: fix grouping [\#1856](https://github.com/pypeclub/OpenPype/pull/1856) -- Maya: don't add reference members as connections to the container set ๐Ÿ“ฆ [\#1855](https://github.com/pypeclub/OpenPype/pull/1855) -- publisher: missing version in subset prop [\#1849](https://github.com/pypeclub/OpenPype/pull/1849) -- Ftrack type error fix in sync to avalon event handler [\#1845](https://github.com/pypeclub/OpenPype/pull/1845) -- Nuke: updating effects subset fail [\#1841](https://github.com/pypeclub/OpenPype/pull/1841) -- nuke: write render node skipped with crop [\#1836](https://github.com/pypeclub/OpenPype/pull/1836) -- Project folder structure overrides [\#1813](https://github.com/pypeclub/OpenPype/pull/1813) -- Maya: fix yeti settings path in extractor [\#1809](https://github.com/pypeclub/OpenPype/pull/1809) -- Failsafe for cross project containers. [\#1806](https://github.com/pypeclub/OpenPype/pull/1806) -- Houdini colector formatting keys fix [\#1802](https://github.com/pypeclub/OpenPype/pull/1802) -- Settings error dialog on show [\#1798](https://github.com/pypeclub/OpenPype/pull/1798) -- Application launch stdout/stderr in GUI build [\#1684](https://github.com/pypeclub/OpenPype/pull/1684) -- Nuke: re-use instance nodes output path [\#1577](https://github.com/pypeclub/OpenPype/pull/1577) - -**Merged pull requests:** - -- Fix - make AE workfile publish to Ftrack configurable [\#1937](https://github.com/pypeclub/OpenPype/pull/1937) -- Add support for multiple Deadline โ˜ ๏ธโž– servers [\#1905](https://github.com/pypeclub/OpenPype/pull/1905) -- Maya: add support for `RedshiftNormalMap` node, fix `tx` linear space ๐Ÿš€ [\#1863](https://github.com/pypeclub/OpenPype/pull/1863) -- Maya: expected files -\> render products โš™๏ธ overhaul [\#1812](https://github.com/pypeclub/OpenPype/pull/1812) -- PS, AE - send actual context when another webserver is running [\#1811](https://github.com/pypeclub/OpenPype/pull/1811) - -## [3.2.0](https://github.com/pypeclub/OpenPype/tree/3.2.0) (2021-07-13) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.4...3.2.0) - -### ๐Ÿ“– Documentation - -- Fix: staging and `--use-version` option [\#1786](https://github.com/pypeclub/OpenPype/pull/1786) -- Subset template and TVPaint subset template docs [\#1717](https://github.com/pypeclub/OpenPype/pull/1717) -- Overscan color extract review [\#1701](https://github.com/pypeclub/OpenPype/pull/1701) - -**๐Ÿš€ Enhancements** - -- Nuke: ftrack family plugin settings preset [\#1805](https://github.com/pypeclub/OpenPype/pull/1805) -- Standalone publisher last project [\#1799](https://github.com/pypeclub/OpenPype/pull/1799) -- Ftrack Multiple notes as server action [\#1795](https://github.com/pypeclub/OpenPype/pull/1795) -- Settings conditional dict [\#1777](https://github.com/pypeclub/OpenPype/pull/1777) -- Settings application use python 2 only where needed [\#1776](https://github.com/pypeclub/OpenPype/pull/1776) -- Settings UI copy/paste [\#1769](https://github.com/pypeclub/OpenPype/pull/1769) -- Workfile tool widths [\#1766](https://github.com/pypeclub/OpenPype/pull/1766) -- Push hierarchical attributes care about task parent changes [\#1763](https://github.com/pypeclub/OpenPype/pull/1763) -- Application executables with environment variables [\#1757](https://github.com/pypeclub/OpenPype/pull/1757) -- Deadline: Nuke submission additional attributes [\#1756](https://github.com/pypeclub/OpenPype/pull/1756) -- Settings schema without prefill [\#1753](https://github.com/pypeclub/OpenPype/pull/1753) -- Settings Hosts enum [\#1739](https://github.com/pypeclub/OpenPype/pull/1739) -- Validate containers settings [\#1736](https://github.com/pypeclub/OpenPype/pull/1736) -- PS - added loader from sequence [\#1726](https://github.com/pypeclub/OpenPype/pull/1726) -- Autoupdate launcher [\#1725](https://github.com/pypeclub/OpenPype/pull/1725) -- Toggle Ftrack upload in StandalonePublisher [\#1708](https://github.com/pypeclub/OpenPype/pull/1708) -- Nuke: Prerender Frame Range by default [\#1699](https://github.com/pypeclub/OpenPype/pull/1699) -- Smoother edges of color triangle [\#1695](https://github.com/pypeclub/OpenPype/pull/1695) - -**๐Ÿ› Bug fixes** - -- nuke: fixing wrong name of family folder when `used existing frames` [\#1803](https://github.com/pypeclub/OpenPype/pull/1803) -- Collect ftrack family bugs [\#1801](https://github.com/pypeclub/OpenPype/pull/1801) -- Invitee email can be None which break the Ftrack commit. [\#1788](https://github.com/pypeclub/OpenPype/pull/1788) -- Otio unrelated error on import [\#1782](https://github.com/pypeclub/OpenPype/pull/1782) -- FFprobe streams order [\#1775](https://github.com/pypeclub/OpenPype/pull/1775) -- Fix - single file files are str only, cast it to list to count properly [\#1772](https://github.com/pypeclub/OpenPype/pull/1772) -- Environments in app executable for MacOS [\#1768](https://github.com/pypeclub/OpenPype/pull/1768) -- Project specific environments [\#1767](https://github.com/pypeclub/OpenPype/pull/1767) -- Settings UI with refresh button [\#1764](https://github.com/pypeclub/OpenPype/pull/1764) -- Standalone publisher thumbnail extractor fix [\#1761](https://github.com/pypeclub/OpenPype/pull/1761) -- Anatomy others templates don't cause crash [\#1758](https://github.com/pypeclub/OpenPype/pull/1758) -- Backend acre module commit update [\#1745](https://github.com/pypeclub/OpenPype/pull/1745) -- hiero: precollect instances failing when audio selected [\#1743](https://github.com/pypeclub/OpenPype/pull/1743) -- Hiero: creator instance error [\#1742](https://github.com/pypeclub/OpenPype/pull/1742) -- Nuke: fixing render creator for no selection format failing [\#1741](https://github.com/pypeclub/OpenPype/pull/1741) -- StandalonePublisher: failing collector for editorial [\#1738](https://github.com/pypeclub/OpenPype/pull/1738) -- Local settings UI crash on missing defaults [\#1737](https://github.com/pypeclub/OpenPype/pull/1737) -- TVPaint white background on thumbnail [\#1735](https://github.com/pypeclub/OpenPype/pull/1735) -- Ftrack missing custom attribute message [\#1734](https://github.com/pypeclub/OpenPype/pull/1734) -- Launcher project changes [\#1733](https://github.com/pypeclub/OpenPype/pull/1733) -- Ftrack sync status [\#1732](https://github.com/pypeclub/OpenPype/pull/1732) -- TVPaint use layer name for default variant [\#1724](https://github.com/pypeclub/OpenPype/pull/1724) -- Default subset template for TVPaint review and workfile families [\#1716](https://github.com/pypeclub/OpenPype/pull/1716) -- Maya: Extract review hotfix [\#1714](https://github.com/pypeclub/OpenPype/pull/1714) -- Settings: Imageio improving granularity [\#1711](https://github.com/pypeclub/OpenPype/pull/1711) -- Application without executables [\#1679](https://github.com/pypeclub/OpenPype/pull/1679) -- Unreal: launching on Linux [\#1672](https://github.com/pypeclub/OpenPype/pull/1672) - -**Merged pull requests:** - -- Bump prismjs from 1.23.0 to 1.24.0 in /website [\#1773](https://github.com/pypeclub/OpenPype/pull/1773) -- TVPaint ftrack family [\#1755](https://github.com/pypeclub/OpenPype/pull/1755) - -## [2.18.4](https://github.com/pypeclub/OpenPype/tree/2.18.4) (2021-06-24) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.3...2.18.4) - -## [2.18.3](https://github.com/pypeclub/OpenPype/tree/2.18.3) (2021-06-23) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.2...2.18.3) - -## [2.18.2](https://github.com/pypeclub/OpenPype/tree/2.18.2) (2021-06-16) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.1.0...2.18.2) - -## [3.1.0](https://github.com/pypeclub/OpenPype/tree/3.1.0) (2021-06-15) - -[Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.0.0...3.1.0) - -### ๐Ÿ“– Documentation - -- Feature Slack integration [\#1657](https://github.com/pypeclub/OpenPype/pull/1657) - -**๐Ÿš€ Enhancements** - -- Log Viewer with OpenPype style [\#1703](https://github.com/pypeclub/OpenPype/pull/1703) -- Scrolling in OpenPype info widget [\#1702](https://github.com/pypeclub/OpenPype/pull/1702) -- OpenPype style in modules [\#1694](https://github.com/pypeclub/OpenPype/pull/1694) -- Sort applications and tools alphabetically in Settings UI [\#1689](https://github.com/pypeclub/OpenPype/pull/1689) -- \#683 - Validate Frame Range in Standalone Publisher [\#1683](https://github.com/pypeclub/OpenPype/pull/1683) -- Hiero: old container versions identify with red color [\#1682](https://github.com/pypeclub/OpenPype/pull/1682) -- Project Manger: Default name column width [\#1669](https://github.com/pypeclub/OpenPype/pull/1669) -- Remove outline in stylesheet [\#1667](https://github.com/pypeclub/OpenPype/pull/1667) -- TVPaint: Creator take layer name as default value for subset variant [\#1663](https://github.com/pypeclub/OpenPype/pull/1663) -- TVPaint custom subset template [\#1662](https://github.com/pypeclub/OpenPype/pull/1662) -- Editorial: conform assets validator [\#1659](https://github.com/pypeclub/OpenPype/pull/1659) -- Nuke - Publish simplification [\#1653](https://github.com/pypeclub/OpenPype/pull/1653) -- \#1333 - added tooltip hints to Pyblish buttons [\#1649](https://github.com/pypeclub/OpenPype/pull/1649) - -**๐Ÿ› Bug fixes** - -- Nuke: broken publishing rendered frames [\#1707](https://github.com/pypeclub/OpenPype/pull/1707) -- Standalone publisher Thumbnail export args [\#1705](https://github.com/pypeclub/OpenPype/pull/1705) -- Bad zip can break OpenPype start [\#1691](https://github.com/pypeclub/OpenPype/pull/1691) -- Hiero: published whole edit mov [\#1687](https://github.com/pypeclub/OpenPype/pull/1687) -- Ftrack subprocess handle of stdout/stderr [\#1675](https://github.com/pypeclub/OpenPype/pull/1675) -- Settings list race condifiton and mutable dict list conversion [\#1671](https://github.com/pypeclub/OpenPype/pull/1671) -- Mac launch arguments fix [\#1660](https://github.com/pypeclub/OpenPype/pull/1660) -- Fix missing dbm python module [\#1652](https://github.com/pypeclub/OpenPype/pull/1652) -- Transparent branches in view on Mac [\#1648](https://github.com/pypeclub/OpenPype/pull/1648) -- Add asset on task item [\#1646](https://github.com/pypeclub/OpenPype/pull/1646) -- Project manager save and queue [\#1645](https://github.com/pypeclub/OpenPype/pull/1645) -- New project anatomy values [\#1644](https://github.com/pypeclub/OpenPype/pull/1644) -- Farm publishing: check if published items do exist [\#1573](https://github.com/pypeclub/OpenPype/pull/1573) - -**Merged pull requests:** - -- Bump normalize-url from 4.5.0 to 4.5.1 in /website [\#1686](https://github.com/pypeclub/OpenPype/pull/1686) - - -## [3.0.0](https://github.com/pypeclub/openpype/tree/3.0.0) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.18.1...3.0.0) - -### Configuration -- Studio Settings GUI: no more json configuration files. -- OpenPype Modules can be turned on and off. -- Easy to add Application versions. -- Per Project Environment and plugin management. -- Robust profile system for creating reviewables and burnins, with filtering based on Application, Task and data family. -- Configurable publish plugins. -- Options to make any validator or extractor, optional or disabled. -- Color Management is now unified under anatomy settings. -- Subset naming and grouping is fully configurable. -- All project attributes can now be set directly in OpenPype settings. -- Studio Setting can be locked to prevent unwanted artist changes. -- You can now add per project and per task type templates for workfile initialization in most hosts. -- Too many other individual configurable option to list in this changelog :) - -### Local Settings -- Local Settings GUI where users can change certain option on individual basis. - - Application executables. - - Project roots. - - Project site sync settings. - -### Build, Installation and Deployments -- No requirements on artist machine. -- Fully distributed workflow possible. -- Self-contained installation. -- Available on all three major platforms. -- Automatic artist OpenPype updates. -- Studio OpenPype repository for updates distribution. -- Robust Build system. -- Safe studio update versioning with staging and production options. -- MacOS build generates .app and .dmg installer. -- Windows build with installer creation script. - -### Misc -- System and diagnostic info tool in the tray. -- Launching application from Launcher indicates activity. -- All project roots are now named. Single root project are now achieved by having a single named root in the project anatomy. -- Every project root is cast into environment variable as well, so it can be used in DCC instead of absolute path (depends on DCC support for env vars). -- Basic support for task types, on top of task names. -- Timer now change automatically when the context is switched inside running application. -- 'Master" versions have been renamed to "Hero". -- Extract Burnins now supports file sequences and color settings. -- Extract Review support overscan cropping, better letterboxes and background colour fill. -- Delivery tool for copying and renaming any published assets in bulk. -- Harmony, Photoshop and After Effects now connect directly with OpenPype tray instead of spawning their own terminal. - -### Project Manager GUI -- Create Projects. -- Create Shots and Assets. -- Create Tasks and assign task types. -- Fill required asset attributes. -- Validations for duplicated or unsupported names. -- Archive Assets. -- Move Asset within hierarchy. - -### Site Sync (beta) -- Synchronization of published files between workstations and central storage. -- Ability to add arbitrary storage providers to the Site Sync system. -- Default setup includes Disk and Google Drive providers as examples. -- Access to availability information from Loader and Scene Manager. -- Sync queue GUI with filtering, error and status reporting. -- Site sync can be configured on a per-project basis. -- Bulk upload and download from the loader. - -### Ftrack -- Actions have customisable roles. -- Settings on all actions are updated live and don't need openpype restart. -- Ftrack module can now be turned off completely. -- It is enough to specify ftrack server name and the URL will be formed correctly. So instead of mystudio.ftrackapp.com, it's possible to use simply: "mystudio". - -### Editorial -- Fully OTIO based editorial publishing. -- Completely re-done Hiero publishing to be a lot simpler and faster. -- Consistent conforming from Resolve, Hiero and Standalone Publisher. - -### Backend -- OpenPype and Avalon now always share the same database (in 2.x is was possible to split them). -- Major codebase refactoring to allow for better CI, versioning and control of individual integrations. -- OTIO is bundled with build. -- OIIO is bundled with build. -- FFMPEG is bundled with build. -- Rest API and host WebSocket servers have been unified into a single local webserver. -- Maya look assigner has been integrated into the main codebase. -- Publish GUI has been integrated into the main codebase. -- Studio and Project settings overrides are now stored in Mongo. -- Too many other backend fixes and tweaks to list :), you can see full changelog on github for those. -- OpenPype uses Poetry to manage it's virtual environment when running from code. -- all applications can be marked as python 2 or 3 compatible to make the switch a bit easier. - - -### Pull Requests since 3.0.0-rc.6 - - -**Implemented enhancements:** - -- settings: task types enum entity [\#1605](https://github.com/pypeclub/OpenPype/issues/1605) -- Settings: ignore keys in referenced schema [\#1600](https://github.com/pypeclub/OpenPype/issues/1600) -- Maya: support for frame steps and frame lists [\#1585](https://github.com/pypeclub/OpenPype/issues/1585) -- TVPaint: Publish workfile. [\#1548](https://github.com/pypeclub/OpenPype/issues/1548) -- Loader: Current Asset Button [\#1448](https://github.com/pypeclub/OpenPype/issues/1448) -- Hiero: publish with retiming [\#1377](https://github.com/pypeclub/OpenPype/issues/1377) -- Ask user to restart after changing global environments in settings [\#910](https://github.com/pypeclub/OpenPype/issues/910) -- add option to define paht to workfile template [\#895](https://github.com/pypeclub/OpenPype/issues/895) -- Harmony: move server console to system tray [\#676](https://github.com/pypeclub/OpenPype/issues/676) -- Standalone style [\#1630](https://github.com/pypeclub/OpenPype/pull/1630) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Faster hierarchical values push [\#1627](https://github.com/pypeclub/OpenPype/pull/1627) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Launcher tool style [\#1624](https://github.com/pypeclub/OpenPype/pull/1624) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Loader and Library loader enhancements [\#1623](https://github.com/pypeclub/OpenPype/pull/1623) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Tray style [\#1622](https://github.com/pypeclub/OpenPype/pull/1622) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Maya schemas cleanup [\#1610](https://github.com/pypeclub/OpenPype/pull/1610) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Settings: ignore keys in referenced schema [\#1608](https://github.com/pypeclub/OpenPype/pull/1608) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- settings: task types enum entity [\#1606](https://github.com/pypeclub/OpenPype/pull/1606) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Openpype style [\#1604](https://github.com/pypeclub/OpenPype/pull/1604) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- TVPaint: Publish workfile. [\#1597](https://github.com/pypeclub/OpenPype/pull/1597) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Nuke: add option to define path to workfile template [\#1571](https://github.com/pypeclub/OpenPype/pull/1571) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Crop overscan in Extract Review [\#1569](https://github.com/pypeclub/OpenPype/pull/1569) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Unreal and Blender: Material Workflow [\#1562](https://github.com/pypeclub/OpenPype/pull/1562) ([simonebarbieri](https://github.com/simonebarbieri)) -- Harmony: move server console to system tray [\#1560](https://github.com/pypeclub/OpenPype/pull/1560) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Ask user to restart after changing global environments in settings [\#1550](https://github.com/pypeclub/OpenPype/pull/1550) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Hiero: publish with retiming [\#1545](https://github.com/pypeclub/OpenPype/pull/1545) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -**Fixed bugs:** - -- Library loader load asset documents on OpenPype start [\#1603](https://github.com/pypeclub/OpenPype/issues/1603) -- Resolve: unable to load the same footage twice [\#1317](https://github.com/pypeclub/OpenPype/issues/1317) -- Resolve: unable to load footage [\#1316](https://github.com/pypeclub/OpenPype/issues/1316) -- Add required Python 2 modules [\#1291](https://github.com/pypeclub/OpenPype/issues/1291) -- GUi scaling with hires displays [\#705](https://github.com/pypeclub/OpenPype/issues/705) -- Maya: non unicode string in publish validation [\#673](https://github.com/pypeclub/OpenPype/issues/673) -- Nuke: Rendered Frame validation is triggered by multiple collections [\#156](https://github.com/pypeclub/OpenPype/issues/156) -- avalon-core debugging failing [\#80](https://github.com/pypeclub/OpenPype/issues/80) -- Only check arnold shading group if arnold is used [\#72](https://github.com/pypeclub/OpenPype/issues/72) -- Sync server Qt layout fix [\#1621](https://github.com/pypeclub/OpenPype/pull/1621) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Console Listener on Python 2 fix [\#1620](https://github.com/pypeclub/OpenPype/pull/1620) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Bug: Initialize blessed term only in console mode [\#1619](https://github.com/pypeclub/OpenPype/pull/1619) ([antirotor](https://github.com/antirotor)) -- Settings template skip paths support wrappers [\#1618](https://github.com/pypeclub/OpenPype/pull/1618) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Maya capture 'isolate\_view' fix + minor corrections [\#1617](https://github.com/pypeclub/OpenPype/pull/1617) ([2-REC](https://github.com/2-REC)) -- MacOs Fix launch of standalone publisher [\#1616](https://github.com/pypeclub/OpenPype/pull/1616) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- 'Delivery action' report fix + typos [\#1612](https://github.com/pypeclub/OpenPype/pull/1612) ([2-REC](https://github.com/2-REC)) -- List append fix in mutable dict settings [\#1599](https://github.com/pypeclub/OpenPype/pull/1599) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Documentation: Maya: fix review [\#1598](https://github.com/pypeclub/OpenPype/pull/1598) ([antirotor](https://github.com/antirotor)) -- Bugfix: Set certifi CA bundle for all platforms [\#1596](https://github.com/pypeclub/OpenPype/pull/1596) ([antirotor](https://github.com/antirotor)) - -**Merged pull requests:** - -- Bump dns-packet from 1.3.1 to 1.3.4 in /website [\#1611](https://github.com/pypeclub/OpenPype/pull/1611) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Maya: Render workflow fixes [\#1607](https://github.com/pypeclub/OpenPype/pull/1607) ([antirotor](https://github.com/antirotor)) -- Maya: support for frame steps and frame lists [\#1586](https://github.com/pypeclub/OpenPype/pull/1586) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- 3.0.0 - curated changelog [\#1284](https://github.com/pypeclub/OpenPype/pull/1284) ([mkolar](https://github.com/mkolar)) - -## [2.18.1](https://github.com/pypeclub/openpype/tree/2.18.1) (2021-06-03) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.18.0...2.18.1) - -**Enhancements:** - -- Faster hierarchical values push [\#1626](https://github.com/pypeclub/OpenPype/pull/1626) -- Feature Delivery in library loader [\#1549](https://github.com/pypeclub/OpenPype/pull/1549) -- Hiero: Initial frame publish support. [\#1172](https://github.com/pypeclub/OpenPype/pull/1172) - -**Fixed bugs:** - -- Maya capture 'isolate\_view' fix + minor corrections [\#1614](https://github.com/pypeclub/OpenPype/pull/1614) -- 'Delivery action' report fix +typos [\#1613](https://github.com/pypeclub/OpenPype/pull/1613) -- Delivery in LibraryLoader - fixed sequence issue [\#1590](https://github.com/pypeclub/OpenPype/pull/1590) -- FFmpeg filters in quote marks [\#1588](https://github.com/pypeclub/OpenPype/pull/1588) -- Ftrack delete action cause circular error [\#1581](https://github.com/pypeclub/OpenPype/pull/1581) -- Fix Maya playblast. [\#1566](https://github.com/pypeclub/OpenPype/pull/1566) -- More failsafes prevent errored runs. [\#1554](https://github.com/pypeclub/OpenPype/pull/1554) -- Celaction publishing [\#1539](https://github.com/pypeclub/OpenPype/pull/1539) -- celaction: app not starting [\#1533](https://github.com/pypeclub/OpenPype/pull/1533) - -**Merged pull requests:** - -- Maya: Render workflow fixes - 2.0 backport [\#1609](https://github.com/pypeclub/OpenPype/pull/1609) -- Maya Hardware support [\#1553](https://github.com/pypeclub/OpenPype/pull/1553) - - -## [CI/3.0.0-rc.6](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.6) (2021-05-27) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.5...CI/3.0.0-rc.6) - -**Implemented enhancements:** - -- Hiero: publish color and transformation soft-effects [\#1376](https://github.com/pypeclub/OpenPype/issues/1376) -- Get rid of `AVALON\_HIERARCHY` and `hiearchy` key on asset [\#432](https://github.com/pypeclub/OpenPype/issues/432) -- Sync to avalon do not store hierarchy key [\#1582](https://github.com/pypeclub/OpenPype/pull/1582) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Tools: launcher scripts for project manager [\#1557](https://github.com/pypeclub/OpenPype/pull/1557) ([antirotor](https://github.com/antirotor)) -- Simple tvpaint publish [\#1555](https://github.com/pypeclub/OpenPype/pull/1555) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Feature Delivery in library loader [\#1546](https://github.com/pypeclub/OpenPype/pull/1546) ([kalisp](https://github.com/kalisp)) -- Documentation: Dev and system build documentation [\#1543](https://github.com/pypeclub/OpenPype/pull/1543) ([antirotor](https://github.com/antirotor)) -- Color entity [\#1542](https://github.com/pypeclub/OpenPype/pull/1542) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Extract review bg color [\#1534](https://github.com/pypeclub/OpenPype/pull/1534) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- TVPaint loader settings [\#1530](https://github.com/pypeclub/OpenPype/pull/1530) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Blender can initialize differente user script paths [\#1528](https://github.com/pypeclub/OpenPype/pull/1528) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Blender and Unreal: Improved Animation Workflow [\#1514](https://github.com/pypeclub/OpenPype/pull/1514) ([simonebarbieri](https://github.com/simonebarbieri)) -- Hiero: publish color and transformation soft-effects [\#1511](https://github.com/pypeclub/OpenPype/pull/1511) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -**Fixed bugs:** - -- OpenPype specific version issues [\#1583](https://github.com/pypeclub/OpenPype/issues/1583) -- Ftrack login server can't work without stderr [\#1576](https://github.com/pypeclub/OpenPype/issues/1576) -- Mac application launch [\#1575](https://github.com/pypeclub/OpenPype/issues/1575) -- Settings are not propagated to Nuke write nodes [\#1538](https://github.com/pypeclub/OpenPype/issues/1538) -- Subset names settings not applied for publishing [\#1537](https://github.com/pypeclub/OpenPype/issues/1537) -- Nuke: callback at start not setting colorspace [\#1412](https://github.com/pypeclub/OpenPype/issues/1412) -- Pype 3: Missing icon for Settings [\#1272](https://github.com/pypeclub/OpenPype/issues/1272) -- Blender: cannot initialize Avalon if BLENDER\_USER\_SCRIPTS is already used [\#1050](https://github.com/pypeclub/OpenPype/issues/1050) -- Ftrack delete action cause circular error [\#206](https://github.com/pypeclub/OpenPype/issues/206) -- Build: stop cleaning of pyc files in build directory [\#1592](https://github.com/pypeclub/OpenPype/pull/1592) ([antirotor](https://github.com/antirotor)) -- Ftrack login server can't work without stderr [\#1591](https://github.com/pypeclub/OpenPype/pull/1591) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- FFmpeg filters in quote marks [\#1589](https://github.com/pypeclub/OpenPype/pull/1589) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- OpenPype specific version issues [\#1584](https://github.com/pypeclub/OpenPype/pull/1584) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Mac application launch [\#1580](https://github.com/pypeclub/OpenPype/pull/1580) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Ftrack delete action cause circular error [\#1579](https://github.com/pypeclub/OpenPype/pull/1579) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Hiero: publishing issues [\#1578](https://github.com/pypeclub/OpenPype/pull/1578) ([jezscha](https://github.com/jezscha)) -- Nuke: callback at start not setting colorspace [\#1561](https://github.com/pypeclub/OpenPype/pull/1561) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Bugfix PS subset and quick review [\#1541](https://github.com/pypeclub/OpenPype/pull/1541) ([kalisp](https://github.com/kalisp)) -- Settings are not propagated to Nuke write nodes [\#1540](https://github.com/pypeclub/OpenPype/pull/1540) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- OpenPype: Powershell scripts polishing [\#1536](https://github.com/pypeclub/OpenPype/pull/1536) ([antirotor](https://github.com/antirotor)) -- Host name collecting fix [\#1535](https://github.com/pypeclub/OpenPype/pull/1535) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Handle duplicated task names in project manager [\#1531](https://github.com/pypeclub/OpenPype/pull/1531) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Validate is file attribute in settings schema [\#1529](https://github.com/pypeclub/OpenPype/pull/1529) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -**Merged pull requests:** - -- Bump postcss from 8.2.8 to 8.3.0 in /website [\#1593](https://github.com/pypeclub/OpenPype/pull/1593) ([dependabot[bot]](https://github.com/apps/dependabot)) -- User installation documentation [\#1532](https://github.com/pypeclub/OpenPype/pull/1532) ([64qam](https://github.com/64qam)) - -## [CI/3.0.0-rc.5](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.5) (2021-05-19) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.18.0...CI/3.0.0-rc.5) - -**Implemented enhancements:** - -- OpenPype: Build - Add progress bars [\#1524](https://github.com/pypeclub/OpenPype/pull/1524) ([antirotor](https://github.com/antirotor)) -- Default environments per host imlementation [\#1522](https://github.com/pypeclub/OpenPype/pull/1522) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- OpenPype: use `semver` module for version resolution [\#1513](https://github.com/pypeclub/OpenPype/pull/1513) ([antirotor](https://github.com/antirotor)) -- Feature Aftereffects setting cleanup documentation [\#1510](https://github.com/pypeclub/OpenPype/pull/1510) ([kalisp](https://github.com/kalisp)) -- Feature Sync server settings enhancement [\#1501](https://github.com/pypeclub/OpenPype/pull/1501) ([kalisp](https://github.com/kalisp)) -- Project manager [\#1396](https://github.com/pypeclub/OpenPype/pull/1396) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -**Fixed bugs:** - -- Unified schema definition [\#874](https://github.com/pypeclub/OpenPype/issues/874) -- Maya: fix look assignment [\#1526](https://github.com/pypeclub/OpenPype/pull/1526) ([antirotor](https://github.com/antirotor)) -- Bugfix Sync server local site issues [\#1523](https://github.com/pypeclub/OpenPype/pull/1523) ([kalisp](https://github.com/kalisp)) -- Store as list dictionary check initial value with right type [\#1520](https://github.com/pypeclub/OpenPype/pull/1520) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Maya: wrong collection of playblasted frames [\#1515](https://github.com/pypeclub/OpenPype/pull/1515) ([mkolar](https://github.com/mkolar)) -- Convert pyblish logs to string at the moment of logging [\#1512](https://github.com/pypeclub/OpenPype/pull/1512) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- 3.0 | nuke: fixing start\_at with option gui [\#1509](https://github.com/pypeclub/OpenPype/pull/1509) ([jezscha](https://github.com/jezscha)) -- Tests: fix pype -\> openpype to make tests work again [\#1508](https://github.com/pypeclub/OpenPype/pull/1508) ([antirotor](https://github.com/antirotor)) - -**Merged pull requests:** - -- OpenPype: disable submodule update with `--no-submodule-update` [\#1525](https://github.com/pypeclub/OpenPype/pull/1525) ([antirotor](https://github.com/antirotor)) -- Ftrack without autosync in Pype 3 [\#1519](https://github.com/pypeclub/OpenPype/pull/1519) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Feature Harmony setting cleanup documentation [\#1506](https://github.com/pypeclub/OpenPype/pull/1506) ([kalisp](https://github.com/kalisp)) -- Sync Server beginning of documentation [\#1471](https://github.com/pypeclub/OpenPype/pull/1471) ([kalisp](https://github.com/kalisp)) -- Blender: publish layout json [\#1348](https://github.com/pypeclub/OpenPype/pull/1348) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -## [2.18.0](https://github.com/pypeclub/openpype/tree/2.18.0) (2021-05-18) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.4...2.18.0) - -**Implemented enhancements:** - -- Default environments per host imlementation [\#1405](https://github.com/pypeclub/OpenPype/issues/1405) -- Blender: publish layout json [\#1346](https://github.com/pypeclub/OpenPype/issues/1346) -- Ftrack without autosync in Pype 3 [\#1128](https://github.com/pypeclub/OpenPype/issues/1128) -- Launcher: started action indicator [\#1102](https://github.com/pypeclub/OpenPype/issues/1102) -- Launch arguments of applications [\#1094](https://github.com/pypeclub/OpenPype/issues/1094) -- Publish: instance info [\#724](https://github.com/pypeclub/OpenPype/issues/724) -- Review: ability to control review length [\#482](https://github.com/pypeclub/OpenPype/issues/482) -- Colorized recognition of creator result [\#394](https://github.com/pypeclub/OpenPype/issues/394) -- event assign user to started task [\#49](https://github.com/pypeclub/OpenPype/issues/49) -- rebuild containers from reference in maya [\#55](https://github.com/pypeclub/OpenPype/issues/55) -- nuke Load metadata [\#66](https://github.com/pypeclub/OpenPype/issues/66) -- Maya: Safer handling of expected render output names [\#1496](https://github.com/pypeclub/OpenPype/pull/1496) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- TVPaint: Increment workfile version on successfull publish. [\#1489](https://github.com/pypeclub/OpenPype/pull/1489) ([tokejepsen](https://github.com/tokejepsen)) -- Use SubsetLoader and multiple contexts for delete\_old\_versions [\#1484](https://github.com/pypeclub/OpenPype/pull/1484) ([tokejepsen](https://github.com/tokejepsen)) -- Maya: Use of multiple deadline servers [\#1483](https://github.com/pypeclub/OpenPype/pull/1483) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- Igniter version resolution doesn't consider it's own version [\#1505](https://github.com/pypeclub/OpenPype/issues/1505) -- Maya: Safer handling of expected render output names [\#1159](https://github.com/pypeclub/OpenPype/issues/1159) -- Harmony: Invalid render output from non-conventionally named instance [\#871](https://github.com/pypeclub/OpenPype/issues/871) -- Existing subsets hints in creator [\#1503](https://github.com/pypeclub/OpenPype/pull/1503) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- nuke: space in node name breaking process [\#1494](https://github.com/pypeclub/OpenPype/pull/1494) ([jezscha](https://github.com/jezscha)) -- Maya: wrong collection of playblasted frames [\#1517](https://github.com/pypeclub/OpenPype/pull/1517) ([mkolar](https://github.com/mkolar)) -- Existing subsets hints in creator [\#1502](https://github.com/pypeclub/OpenPype/pull/1502) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Use instance frame start instead of timeline. [\#1486](https://github.com/pypeclub/OpenPype/pull/1486) ([tokejepsen](https://github.com/tokejepsen)) -- Maya: Redshift - set proper start frame on proxy [\#1480](https://github.com/pypeclub/OpenPype/pull/1480) ([antirotor](https://github.com/antirotor)) - -**Closed issues:** - -- Nuke: wrong "star at" value on render load [\#1352](https://github.com/pypeclub/OpenPype/issues/1352) -- DV Resolve - loading/updating - image video [\#915](https://github.com/pypeclub/OpenPype/issues/915) - -**Merged pull requests:** - -- nuke: fixing start\_at with option gui [\#1507](https://github.com/pypeclub/OpenPype/pull/1507) ([jezscha](https://github.com/jezscha)) - -## [CI/3.0.0-rc.4](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.4) (2021-05-12) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.3...CI/3.0.0-rc.4) - -**Implemented enhancements:** - -- Resolve: documentation [\#1490](https://github.com/pypeclub/OpenPype/issues/1490) -- Hiero: audio to review [\#1378](https://github.com/pypeclub/OpenPype/issues/1378) -- nks color clips after publish [\#44](https://github.com/pypeclub/OpenPype/issues/44) -- Store data from modifiable dict as list [\#1504](https://github.com/pypeclub/OpenPype/pull/1504) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Use SubsetLoader and multiple contexts for delete\_old\_versions [\#1497](https://github.com/pypeclub/OpenPype/pull/1497) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Hiero: publish audio and add to review [\#1493](https://github.com/pypeclub/OpenPype/pull/1493) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Resolve: documentation [\#1491](https://github.com/pypeclub/OpenPype/pull/1491) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Change integratenew template profiles setting [\#1487](https://github.com/pypeclub/OpenPype/pull/1487) ([kalisp](https://github.com/kalisp)) -- Settings tool cleanup [\#1477](https://github.com/pypeclub/OpenPype/pull/1477) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Sorted Applications and Tools in Custom attribute [\#1476](https://github.com/pypeclub/OpenPype/pull/1476) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- PS - group all published instances [\#1416](https://github.com/pypeclub/OpenPype/pull/1416) ([kalisp](https://github.com/kalisp)) -- OpenPype: Support for Docker [\#1289](https://github.com/pypeclub/OpenPype/pull/1289) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- Harmony: palettes publishing [\#1439](https://github.com/pypeclub/OpenPype/issues/1439) -- Photoshop: validation for already created images [\#1435](https://github.com/pypeclub/OpenPype/issues/1435) -- Nuke Extracts Thumbnail from frame out of shot range [\#963](https://github.com/pypeclub/OpenPype/issues/963) -- Instance in same Context repairing [\#390](https://github.com/pypeclub/OpenPype/issues/390) -- User Inactivity - Start timers sets wrong time [\#91](https://github.com/pypeclub/OpenPype/issues/91) -- Use instance frame start instead of timeline [\#1499](https://github.com/pypeclub/OpenPype/pull/1499) ([mkolar](https://github.com/mkolar)) -- Various smaller fixes [\#1498](https://github.com/pypeclub/OpenPype/pull/1498) ([mkolar](https://github.com/mkolar)) -- nuke: space in node name breaking process [\#1495](https://github.com/pypeclub/OpenPype/pull/1495) ([jezscha](https://github.com/jezscha)) -- Codec determination in extract burnin [\#1492](https://github.com/pypeclub/OpenPype/pull/1492) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Undefined constant in subprocess module [\#1485](https://github.com/pypeclub/OpenPype/pull/1485) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- List entity catch add/remove item changes properly [\#1482](https://github.com/pypeclub/OpenPype/pull/1482) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Resolve: additional fixes of publishing workflow [\#1481](https://github.com/pypeclub/OpenPype/pull/1481) ([jezscha](https://github.com/jezscha)) -- Photoshop: validation for already created images [\#1436](https://github.com/pypeclub/OpenPype/pull/1436) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -**Merged pull requests:** - -- Maya: Support for looks on VRay Proxies [\#1443](https://github.com/pypeclub/OpenPype/pull/1443) ([antirotor](https://github.com/antirotor)) - -## [2.17.3](https://github.com/pypeclub/openpype/tree/2.17.3) (2021-05-06) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.3...2.17.3) - -**Fixed bugs:** - -- Nuke: workfile version synced to db version always [\#1479](https://github.com/pypeclub/OpenPype/pull/1479) ([jezscha](https://github.com/jezscha)) - -## [CI/3.0.0-rc.3](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.3) (2021-05-05) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.2...CI/3.0.0-rc.3) - -**Implemented enhancements:** - -- Path entity with placeholder [\#1473](https://github.com/pypeclub/OpenPype/pull/1473) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Burnin custom font filepath [\#1472](https://github.com/pypeclub/OpenPype/pull/1472) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Poetry: Move to OpenPype [\#1449](https://github.com/pypeclub/OpenPype/pull/1449) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- Mac SSL path needs to be relative to pype\_root [\#1469](https://github.com/pypeclub/OpenPype/issues/1469) -- Resolve: fix loading clips to timeline [\#1421](https://github.com/pypeclub/OpenPype/issues/1421) -- Wrong handling of slashes when loading on mac [\#1411](https://github.com/pypeclub/OpenPype/issues/1411) -- Nuke openpype3 [\#1342](https://github.com/pypeclub/OpenPype/issues/1342) -- Houdini launcher [\#1171](https://github.com/pypeclub/OpenPype/issues/1171) -- Fix SyncServer get\_enabled\_projects should handle global state [\#1475](https://github.com/pypeclub/OpenPype/pull/1475) ([kalisp](https://github.com/kalisp)) -- Igniter buttons enable/disable fix [\#1474](https://github.com/pypeclub/OpenPype/pull/1474) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Mac SSL path needs to be relative to pype\_root [\#1470](https://github.com/pypeclub/OpenPype/pull/1470) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Resolve: 17 compatibility issues and load image sequences [\#1422](https://github.com/pypeclub/OpenPype/pull/1422) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) - -## [CI/3.0.0-rc.2](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.2) (2021-05-04) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.2...CI/3.0.0-rc.2) - -**Implemented enhancements:** - -- Extract burnins with sequences [\#1467](https://github.com/pypeclub/OpenPype/pull/1467) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Extract burnins with color setting [\#1466](https://github.com/pypeclub/OpenPype/pull/1466) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -**Fixed bugs:** - -- Fix groups check in Python 2 [\#1468](https://github.com/pypeclub/OpenPype/pull/1468) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -## [2.17.2](https://github.com/pypeclub/openpype/tree/2.17.2) (2021-05-04) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-rc.1...2.17.2) - -**Implemented enhancements:** - -- Forward/Backward compatible apps and tools with OpenPype 3 [\#1463](https://github.com/pypeclub/OpenPype/pull/1463) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) - -## [CI/3.0.0-rc.1](https://github.com/pypeclub/openpype/tree/CI/3.0.0-rc.1) (2021-05-04) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.1...CI/3.0.0-rc.1) - -**Implemented enhancements:** - -- Only show studio settings to admins [\#1406](https://github.com/pypeclub/OpenPype/issues/1406) -- Ftrack specific settings save warning messages [\#1458](https://github.com/pypeclub/OpenPype/pull/1458) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Faster settings actions [\#1446](https://github.com/pypeclub/OpenPype/pull/1446) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Feature/sync server priority [\#1444](https://github.com/pypeclub/OpenPype/pull/1444) ([kalisp](https://github.com/kalisp)) -- Faster settings UI loading [\#1442](https://github.com/pypeclub/OpenPype/pull/1442) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Igniter re-write [\#1441](https://github.com/pypeclub/OpenPype/pull/1441) ([mkolar](https://github.com/mkolar)) -- Wrap openpype build into installers [\#1419](https://github.com/pypeclub/OpenPype/pull/1419) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Extract review first documentation [\#1404](https://github.com/pypeclub/OpenPype/pull/1404) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Blender PySide2 install guide [\#1403](https://github.com/pypeclub/OpenPype/pull/1403) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: deadline submission with gpu [\#1394](https://github.com/pypeclub/OpenPype/pull/1394) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Igniter: Reverse item filter for OpenPype version [\#1349](https://github.com/pypeclub/OpenPype/pull/1349) ([antirotor](https://github.com/antirotor)) - -**Fixed bugs:** - -- OpenPype Mongo URL definition [\#1450](https://github.com/pypeclub/OpenPype/issues/1450) -- Various typos and smaller fixes [\#1464](https://github.com/pypeclub/OpenPype/pull/1464) ([mkolar](https://github.com/mkolar)) -- Validation of dynamic items in settings [\#1462](https://github.com/pypeclub/OpenPype/pull/1462) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- List can handle new items correctly [\#1459](https://github.com/pypeclub/OpenPype/pull/1459) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Settings actions process fix [\#1457](https://github.com/pypeclub/OpenPype/pull/1457) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Add to overrides actions fix [\#1456](https://github.com/pypeclub/OpenPype/pull/1456) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- OpenPype Mongo URL definition [\#1455](https://github.com/pypeclub/OpenPype/pull/1455) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Global settings save/load out of system settings [\#1447](https://github.com/pypeclub/OpenPype/pull/1447) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Keep metadata on remove overrides [\#1445](https://github.com/pypeclub/OpenPype/pull/1445) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: fixing undo for loaded mov and sequence [\#1432](https://github.com/pypeclub/OpenPype/pull/1432) ([jezscha](https://github.com/jezscha)) -- ExtractReview skip empty strings from settings [\#1431](https://github.com/pypeclub/OpenPype/pull/1431) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Bugfix Sync server tweaks [\#1430](https://github.com/pypeclub/OpenPype/pull/1430) ([kalisp](https://github.com/kalisp)) -- Hiero: missing thumbnail in review [\#1429](https://github.com/pypeclub/OpenPype/pull/1429) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Bugfix Maya in deadline for OpenPype [\#1428](https://github.com/pypeclub/OpenPype/pull/1428) ([kalisp](https://github.com/kalisp)) -- AE - validation for duration was 1 frame shorter [\#1427](https://github.com/pypeclub/OpenPype/pull/1427) ([kalisp](https://github.com/kalisp)) -- Houdini menu filename [\#1418](https://github.com/pypeclub/OpenPype/pull/1418) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Fix Avalon plugins attribute overrides [\#1413](https://github.com/pypeclub/OpenPype/pull/1413) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: submit to Deadline fails [\#1409](https://github.com/pypeclub/OpenPype/pull/1409) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- Validate MongoDB Url on start [\#1407](https://github.com/pypeclub/OpenPype/pull/1407) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Nuke: fix set colorspace with new settings [\#1386](https://github.com/pypeclub/OpenPype/pull/1386) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- MacOs build and install issues [\#1380](https://github.com/pypeclub/OpenPype/pull/1380) ([mkolar](https://github.com/mkolar)) - -**Closed issues:** - -- test [\#1452](https://github.com/pypeclub/OpenPype/issues/1452) - -**Merged pull requests:** - -- TVPaint frame range definition [\#1425](https://github.com/pypeclub/OpenPype/pull/1425) ([iLLiCiTiT](https://github.com/iLLiCiTiT)) -- Only show studio settings to admins [\#1420](https://github.com/pypeclub/OpenPype/pull/1420) ([create-issue-branch[bot]](https://github.com/apps/create-issue-branch)) -- TVPaint documentation [\#1305](https://github.com/pypeclub/OpenPype/pull/1305) ([64qam](https://github.com/64qam)) - -## [2.17.1](https://github.com/pypeclub/openpype/tree/2.17.1) (2021-04-30) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/2.17.0...2.17.1) - -**Enhancements:** - -- Nuke: deadline submission with gpu [\#1414](https://github.com/pypeclub/OpenPype/pull/1414) -- TVPaint frame range definition [\#1424](https://github.com/pypeclub/OpenPype/pull/1424) -- PS - group all published instances [\#1415](https://github.com/pypeclub/OpenPype/pull/1415) -- Add task name to context pop up. [\#1383](https://github.com/pypeclub/OpenPype/pull/1383) -- Enhance review letterbox feature. [\#1371](https://github.com/pypeclub/OpenPype/pull/1371) - -**Fixed bugs:** - -- Houdini menu filename [\#1417](https://github.com/pypeclub/OpenPype/pull/1417) -- AE - validation for duration was 1 frame shorter [\#1426](https://github.com/pypeclub/OpenPype/pull/1426) - -**Merged pull requests:** - -- Maya: Vray - problem getting all file nodes for look publishing [\#1399](https://github.com/pypeclub/OpenPype/pull/1399) -- Maya: Support for Redshift proxies [\#1360](https://github.com/pypeclub/OpenPype/pull/1360) - -## [2.17.0](https://github.com/pypeclub/openpype/tree/2.17.0) (2021-04-20) - -[Full Changelog](https://github.com/pypeclub/openpype/compare/CI/3.0.0-beta.2...2.17.0) - -**Enhancements:** - -- Forward compatible ftrack group [\#1243](https://github.com/pypeclub/OpenPype/pull/1243) -- Settings in mongo as dict [\#1221](https://github.com/pypeclub/OpenPype/pull/1221) -- Maya: Make tx option configurable with presets [\#1328](https://github.com/pypeclub/OpenPype/pull/1328) -- TVPaint asset name validation [\#1302](https://github.com/pypeclub/OpenPype/pull/1302) -- TV Paint: Set initial project settings. [\#1299](https://github.com/pypeclub/OpenPype/pull/1299) -- TV Paint: Validate mark in and out. [\#1298](https://github.com/pypeclub/OpenPype/pull/1298) -- Validate project settings [\#1297](https://github.com/pypeclub/OpenPype/pull/1297) -- After Effects: added SubsetManager [\#1234](https://github.com/pypeclub/OpenPype/pull/1234) -- Show error message in pyblish UI [\#1206](https://github.com/pypeclub/OpenPype/pull/1206) - -**Fixed bugs:** - -- Hiero: fixing source frame from correct object [\#1362](https://github.com/pypeclub/OpenPype/pull/1362) -- Nuke: fix colourspace, prerenders and nuke panes opening [\#1308](https://github.com/pypeclub/OpenPype/pull/1308) -- AE remove orphaned instance from workfile - fix self.stub [\#1282](https://github.com/pypeclub/OpenPype/pull/1282) -- Nuke: deadline submission with search replaced env values from preset [\#1194](https://github.com/pypeclub/OpenPype/pull/1194) -- Ftrack custom attributes in bulks [\#1312](https://github.com/pypeclub/OpenPype/pull/1312) -- Ftrack optional pypclub role [\#1303](https://github.com/pypeclub/OpenPype/pull/1303) -- After Effects: remove orphaned instances [\#1275](https://github.com/pypeclub/OpenPype/pull/1275) -- Avalon schema names [\#1242](https://github.com/pypeclub/OpenPype/pull/1242) -- Handle duplication of Task name [\#1226](https://github.com/pypeclub/OpenPype/pull/1226) -- Modified path of plugin loads for Harmony and TVPaint [\#1217](https://github.com/pypeclub/OpenPype/pull/1217) -- Regex checks in profiles filtering [\#1214](https://github.com/pypeclub/OpenPype/pull/1214) -- Bulk mov strict task [\#1204](https://github.com/pypeclub/OpenPype/pull/1204) -- Update custom ftrack session attributes [\#1202](https://github.com/pypeclub/OpenPype/pull/1202) -- Nuke: write node colorspace ignore `default\(\)` label [\#1199](https://github.com/pypeclub/OpenPype/pull/1199) -- Nuke: reverse search to make it more versatile [\#1178](https://github.com/pypeclub/OpenPype/pull/1178) - - - -## [2.16.0](https://github.com/pypeclub/pype/tree/2.16.0) (2021-03-22) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.3...2.16.0) - -**Enhancements:** - -- Nuke: deadline submit limit group filter [\#1167](https://github.com/pypeclub/pype/pull/1167) -- Maya: support for Deadline Group and Limit Groups - backport 2.x [\#1156](https://github.com/pypeclub/pype/pull/1156) -- Maya: fixes for Redshift support [\#1152](https://github.com/pypeclub/pype/pull/1152) -- Nuke: adding preset for a Read node name to all img and mov Loaders [\#1146](https://github.com/pypeclub/pype/pull/1146) -- nuke deadline submit with environ var from presets overrides [\#1142](https://github.com/pypeclub/pype/pull/1142) -- Change timers after task change [\#1138](https://github.com/pypeclub/pype/pull/1138) -- Nuke: shortcuts for Pype menu [\#1127](https://github.com/pypeclub/pype/pull/1127) -- Nuke: workfile template [\#1124](https://github.com/pypeclub/pype/pull/1124) -- Sites local settings by site name [\#1117](https://github.com/pypeclub/pype/pull/1117) -- Reset loader's asset selection on context change [\#1106](https://github.com/pypeclub/pype/pull/1106) -- Bulk mov render publishing [\#1101](https://github.com/pypeclub/pype/pull/1101) -- Photoshop: mark publishable instances [\#1093](https://github.com/pypeclub/pype/pull/1093) -- Added ability to define BG color for extract review [\#1088](https://github.com/pypeclub/pype/pull/1088) -- TVPaint extractor enhancement [\#1080](https://github.com/pypeclub/pype/pull/1080) -- Photoshop: added support for .psb in workfiles [\#1078](https://github.com/pypeclub/pype/pull/1078) -- Optionally add task to subset name [\#1072](https://github.com/pypeclub/pype/pull/1072) -- Only extend clip range when collecting. [\#1008](https://github.com/pypeclub/pype/pull/1008) -- Collect audio for farm reviews. [\#1073](https://github.com/pypeclub/pype/pull/1073) - - -**Fixed bugs:** - -- Fix path spaces in jpeg extractor [\#1174](https://github.com/pypeclub/pype/pull/1174) -- Maya: Bugfix: superclass for CreateCameraRig [\#1166](https://github.com/pypeclub/pype/pull/1166) -- Maya: Submit to Deadline - fix typo in condition [\#1163](https://github.com/pypeclub/pype/pull/1163) -- Avoid dot in repre extension [\#1125](https://github.com/pypeclub/pype/pull/1125) -- Fix versions variable usage in standalone publisher [\#1090](https://github.com/pypeclub/pype/pull/1090) -- Collect instance data fix subset query [\#1082](https://github.com/pypeclub/pype/pull/1082) -- Fix getting the camera name. [\#1067](https://github.com/pypeclub/pype/pull/1067) -- Nuke: Ensure "NUKE\_TEMP\_DIR" is not part of the Deadline job environment. [\#1064](https://github.com/pypeclub/pype/pull/1064) - -## [2.15.3](https://github.com/pypeclub/pype/tree/2.15.3) (2021-02-26) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.2...2.15.3) - -**Enhancements:** - -- Maya: speedup renderable camera collection [\#1053](https://github.com/pypeclub/pype/pull/1053) -- Harmony - add regex search to filter allowed task names for collectinโ€ฆ [\#1047](https://github.com/pypeclub/pype/pull/1047) - -**Fixed bugs:** - -- Ftrack integrate hierarchy fix [\#1085](https://github.com/pypeclub/pype/pull/1085) -- Explicit subset filter in anatomy instance data [\#1059](https://github.com/pypeclub/pype/pull/1059) -- TVPaint frame offset [\#1057](https://github.com/pypeclub/pype/pull/1057) -- Auto fix unicode strings [\#1046](https://github.com/pypeclub/pype/pull/1046) - -## [2.15.2](https://github.com/pypeclub/pype/tree/2.15.2) (2021-02-19) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.1...2.15.2) - -**Enhancements:** - -- Maya: Vray scene publishing [\#1013](https://github.com/pypeclub/pype/pull/1013) - -**Fixed bugs:** - -- Fix entity move under project [\#1040](https://github.com/pypeclub/pype/pull/1040) -- smaller nuke fixes from production [\#1036](https://github.com/pypeclub/pype/pull/1036) -- TVPaint thumbnail extract fix [\#1031](https://github.com/pypeclub/pype/pull/1031) - -## [2.15.1](https://github.com/pypeclub/pype/tree/2.15.1) (2021-02-12) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.15.0...2.15.1) - -**Enhancements:** - -- Delete version as loader action [\#1011](https://github.com/pypeclub/pype/pull/1011) -- Delete old versions [\#445](https://github.com/pypeclub/pype/pull/445) - -**Fixed bugs:** - -- PS - remove obsolete functions from pywin32 [\#1006](https://github.com/pypeclub/pype/pull/1006) -- Clone description of review session objects. [\#922](https://github.com/pypeclub/pype/pull/922) - -## [2.15.0](https://github.com/pypeclub/pype/tree/2.15.0) (2021-02-09) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.6...2.15.0) - -**Enhancements:** - -- Resolve - loading and updating clips [\#932](https://github.com/pypeclub/pype/pull/932) -- Release/2.15.0 [\#926](https://github.com/pypeclub/pype/pull/926) -- Photoshop: add option for template.psd and prelaunch hook [\#894](https://github.com/pypeclub/pype/pull/894) -- Nuke: deadline presets [\#993](https://github.com/pypeclub/pype/pull/993) -- Maya: Alembic only set attributes that exists. [\#986](https://github.com/pypeclub/pype/pull/986) -- Harmony: render local and handle fixes [\#981](https://github.com/pypeclub/pype/pull/981) -- PSD Bulk export of ANIM group [\#965](https://github.com/pypeclub/pype/pull/965) -- AE - added prelaunch hook for opening last or workfile from template [\#944](https://github.com/pypeclub/pype/pull/944) -- PS - safer handling of loading of workfile [\#941](https://github.com/pypeclub/pype/pull/941) -- Maya: Handling Arnold referenced AOVs [\#938](https://github.com/pypeclub/pype/pull/938) -- TVPaint: switch layer IDs for layer names during identification [\#903](https://github.com/pypeclub/pype/pull/903) -- TVPaint audio/sound loader [\#893](https://github.com/pypeclub/pype/pull/893) -- Clone review session with children. [\#891](https://github.com/pypeclub/pype/pull/891) -- Simple compositing data packager for freelancers [\#884](https://github.com/pypeclub/pype/pull/884) -- Harmony deadline submission [\#881](https://github.com/pypeclub/pype/pull/881) -- Maya: Optionally hide image planes from reviews. [\#840](https://github.com/pypeclub/pype/pull/840) -- Maya: handle referenced AOVs for Vray [\#824](https://github.com/pypeclub/pype/pull/824) -- DWAA/DWAB support on windows [\#795](https://github.com/pypeclub/pype/pull/795) -- Unreal: animation, layout and setdress updates [\#695](https://github.com/pypeclub/pype/pull/695) - -**Fixed bugs:** - -- Maya: Looks - disable hardlinks [\#995](https://github.com/pypeclub/pype/pull/995) -- Fix Ftrack custom attribute update [\#982](https://github.com/pypeclub/pype/pull/982) -- Prores ks in burnin script [\#960](https://github.com/pypeclub/pype/pull/960) -- terminal.py crash on import [\#839](https://github.com/pypeclub/pype/pull/839) -- Extract review handle bizarre pixel aspect ratio [\#990](https://github.com/pypeclub/pype/pull/990) -- Nuke: add nuke related env var to sumbission [\#988](https://github.com/pypeclub/pype/pull/988) -- Nuke: missing preset's variable [\#984](https://github.com/pypeclub/pype/pull/984) -- Get creator by name fix [\#979](https://github.com/pypeclub/pype/pull/979) -- Fix update of project's tasks on Ftrack sync [\#972](https://github.com/pypeclub/pype/pull/972) -- nuke: wrong frame offset in mov loader [\#971](https://github.com/pypeclub/pype/pull/971) -- Create project structure action fix multiroot [\#967](https://github.com/pypeclub/pype/pull/967) -- PS: remove pywin installation from hook [\#964](https://github.com/pypeclub/pype/pull/964) -- Prores ks in burnin script [\#959](https://github.com/pypeclub/pype/pull/959) -- Subset family is now stored in subset document [\#956](https://github.com/pypeclub/pype/pull/956) -- DJV new version arguments [\#954](https://github.com/pypeclub/pype/pull/954) -- TV Paint: Fix single frame Sequence [\#953](https://github.com/pypeclub/pype/pull/953) -- nuke: missing `file` knob update [\#933](https://github.com/pypeclub/pype/pull/933) -- Photoshop: Create from single layer was failing [\#920](https://github.com/pypeclub/pype/pull/920) -- Nuke: baking mov with correct colorspace inherited from write [\#909](https://github.com/pypeclub/pype/pull/909) -- Launcher fix actions discover [\#896](https://github.com/pypeclub/pype/pull/896) -- Get the correct file path for the updated mov. [\#889](https://github.com/pypeclub/pype/pull/889) -- Maya: Deadline submitter - shared data access violation [\#831](https://github.com/pypeclub/pype/pull/831) -- Maya: Take into account vray master AOV switch [\#822](https://github.com/pypeclub/pype/pull/822) - -**Merged pull requests:** - -- Refactor blender to 3.0 format [\#934](https://github.com/pypeclub/pype/pull/934) - -## [2.14.6](https://github.com/pypeclub/pype/tree/2.14.6) (2021-01-15) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.5...2.14.6) - -**Fixed bugs:** - -- Nuke: improving of hashing path [\#885](https://github.com/pypeclub/pype/pull/885) - -**Merged pull requests:** - -- Hiero: cut videos with correct secons [\#892](https://github.com/pypeclub/pype/pull/892) -- Faster sync to avalon preparation [\#869](https://github.com/pypeclub/pype/pull/869) - -## [2.14.5](https://github.com/pypeclub/pype/tree/2.14.5) (2021-01-06) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.4...2.14.5) - -**Merged pull requests:** - -- Pype logger refactor [\#866](https://github.com/pypeclub/pype/pull/866) - -## [2.14.4](https://github.com/pypeclub/pype/tree/2.14.4) (2020-12-18) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.3...2.14.4) - -**Merged pull requests:** - -- Fix - AE - added explicit cast to int [\#837](https://github.com/pypeclub/pype/pull/837) - -## [2.14.3](https://github.com/pypeclub/pype/tree/2.14.3) (2020-12-16) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.2...2.14.3) - -**Fixed bugs:** - -- TVPaint repair invalid metadata [\#809](https://github.com/pypeclub/pype/pull/809) -- Feature/push hier value to nonhier action [\#807](https://github.com/pypeclub/pype/pull/807) -- Harmony: fix palette and image sequence loader [\#806](https://github.com/pypeclub/pype/pull/806) - -**Merged pull requests:** - -- respecting space in path [\#823](https://github.com/pypeclub/pype/pull/823) - -## [2.14.2](https://github.com/pypeclub/pype/tree/2.14.2) (2020-12-04) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.1...2.14.2) - -**Enhancements:** - -- Collapsible wrapper in settings [\#767](https://github.com/pypeclub/pype/pull/767) - -**Fixed bugs:** - -- Harmony: template extraction and palettes thumbnails on mac [\#768](https://github.com/pypeclub/pype/pull/768) -- TVPaint store context to workfile metadata \(764\) [\#766](https://github.com/pypeclub/pype/pull/766) -- Extract review audio cut fix [\#763](https://github.com/pypeclub/pype/pull/763) - -**Merged pull requests:** - -- AE: fix publish after background load [\#781](https://github.com/pypeclub/pype/pull/781) -- TVPaint store members key [\#769](https://github.com/pypeclub/pype/pull/769) - -## [2.14.1](https://github.com/pypeclub/pype/tree/2.14.1) (2020-11-27) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.14.0...2.14.1) - -**Enhancements:** - -- Settings required keys in modifiable dict [\#770](https://github.com/pypeclub/pype/pull/770) -- Extract review may not add audio to output [\#761](https://github.com/pypeclub/pype/pull/761) - -**Fixed bugs:** - -- After Effects: frame range, file format and render source scene fixes [\#760](https://github.com/pypeclub/pype/pull/760) -- Hiero: trimming review with clip event number [\#754](https://github.com/pypeclub/pype/pull/754) -- TVPaint: fix updating of loaded subsets [\#752](https://github.com/pypeclub/pype/pull/752) -- Maya: Vray handling of default aov [\#748](https://github.com/pypeclub/pype/pull/748) -- Maya: multiple renderable cameras in layer didn't work [\#744](https://github.com/pypeclub/pype/pull/744) -- Ftrack integrate custom attributes fix [\#742](https://github.com/pypeclub/pype/pull/742) - -## [2.14.0](https://github.com/pypeclub/pype/tree/2.14.0) (2020-11-23) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.7...2.14.0) - -**Enhancements:** - -- Render publish plugins abstraction [\#687](https://github.com/pypeclub/pype/pull/687) -- Shot asset build trigger status [\#736](https://github.com/pypeclub/pype/pull/736) -- Maya: add camera rig publishing option [\#721](https://github.com/pypeclub/pype/pull/721) -- Sort instances by label in pyblish gui [\#719](https://github.com/pypeclub/pype/pull/719) -- Synchronize ftrack hierarchical and shot attributes [\#716](https://github.com/pypeclub/pype/pull/716) -- 686 standalonepublisher editorial from image sequences [\#699](https://github.com/pypeclub/pype/pull/699) -- Ask user to select non-default camera from scene or create a new. [\#678](https://github.com/pypeclub/pype/pull/678) -- TVPaint: image loader with options [\#675](https://github.com/pypeclub/pype/pull/675) -- Maya: Camera name can be added to burnins. [\#674](https://github.com/pypeclub/pype/pull/674) -- After Effects: base integration with loaders [\#667](https://github.com/pypeclub/pype/pull/667) -- Harmony: Javascript refactoring and overall stability improvements [\#666](https://github.com/pypeclub/pype/pull/666) - -**Fixed bugs:** - -- Bugfix Hiero Review / Plate representation publish [\#743](https://github.com/pypeclub/pype/pull/743) -- Asset fetch second fix [\#726](https://github.com/pypeclub/pype/pull/726) -- TVPaint extract review fix [\#740](https://github.com/pypeclub/pype/pull/740) -- After Effects: Review were not being sent to ftrack [\#738](https://github.com/pypeclub/pype/pull/738) -- Maya: vray proxy was not loading [\#722](https://github.com/pypeclub/pype/pull/722) -- Maya: Vray expected file fixes [\#682](https://github.com/pypeclub/pype/pull/682) -- Missing audio on farm submission. [\#639](https://github.com/pypeclub/pype/pull/639) - -**Deprecated:** - -- Removed artist view from pyblish gui [\#717](https://github.com/pypeclub/pype/pull/717) -- Maya: disable legacy override check for cameras [\#715](https://github.com/pypeclub/pype/pull/715) - -**Merged pull requests:** - -- Application manager [\#728](https://github.com/pypeclub/pype/pull/728) -- Feature \#664 3.0 lib refactor [\#706](https://github.com/pypeclub/pype/pull/706) -- Lib from illicit part 2 [\#700](https://github.com/pypeclub/pype/pull/700) -- 3.0 lib refactor - path tools [\#697](https://github.com/pypeclub/pype/pull/697) - -## [2.13.7](https://github.com/pypeclub/pype/tree/2.13.7) (2020-11-19) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.6...2.13.7) - -**Fixed bugs:** - -- Standalone Publisher: getting fps from context instead of nonexistent entity [\#729](https://github.com/pypeclub/pype/pull/729) - -## [2.13.6](https://github.com/pypeclub/pype/tree/2.13.6) (2020-11-15) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.5...2.13.6) - -**Fixed bugs:** - -- Maya workfile version wasn't syncing with renders properly [\#711](https://github.com/pypeclub/pype/pull/711) -- Maya: Fix for publishing multiple cameras with review from the same scene [\#710](https://github.com/pypeclub/pype/pull/710) - -## [2.13.5](https://github.com/pypeclub/pype/tree/2.13.5) (2020-11-12) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.4...2.13.5) - -**Enhancements:** - -- 3.0 lib refactor [\#664](https://github.com/pypeclub/pype/issues/664) - -**Fixed bugs:** - -- Wrong thumbnail file was picked when publishing sequence in standalone publisher [\#703](https://github.com/pypeclub/pype/pull/703) -- Fix: Burnin data pass and FFmpeg tool check [\#701](https://github.com/pypeclub/pype/pull/701) - -## [2.13.4](https://github.com/pypeclub/pype/tree/2.13.4) (2020-11-09) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.3...2.13.4) - -**Enhancements:** - -- AfterEffects integration with Websocket [\#663](https://github.com/pypeclub/pype/issues/663) - -**Fixed bugs:** - -- Photoshop uhiding hidden layers [\#688](https://github.com/pypeclub/pype/issues/688) -- \#688 - Fix publishing hidden layers [\#692](https://github.com/pypeclub/pype/pull/692) - -**Closed issues:** - -- Nuke Favorite directories "shot dir" "project dir" - not working [\#684](https://github.com/pypeclub/pype/issues/684) - -**Merged pull requests:** - -- Nuke Favorite directories "shot dir" "project dir" - not working \#684 [\#685](https://github.com/pypeclub/pype/pull/685) - -## [2.13.3](https://github.com/pypeclub/pype/tree/2.13.3) (2020-11-03) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.2...2.13.3) - -**Enhancements:** - -- TV paint base integration [\#612](https://github.com/pypeclub/pype/issues/612) - -**Fixed bugs:** - -- Fix ffmpeg executable path with spaces [\#680](https://github.com/pypeclub/pype/pull/680) -- Hotfix: Added default version number [\#679](https://github.com/pypeclub/pype/pull/679) - -## [2.13.2](https://github.com/pypeclub/pype/tree/2.13.2) (2020-10-28) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.1...2.13.2) - -**Fixed bugs:** - -- Nuke: wrong conditions when fixing legacy write nodes [\#665](https://github.com/pypeclub/pype/pull/665) - -## [2.13.1](https://github.com/pypeclub/pype/tree/2.13.1) (2020-10-23) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.13.0...2.13.1) - -**Enhancements:** - -- move maya look assigner to pype menu [\#292](https://github.com/pypeclub/pype/issues/292) - -**Fixed bugs:** - -- Layer name is not propagating to metadata in Photoshop [\#654](https://github.com/pypeclub/pype/issues/654) -- Loader in Photoshop fails with "can't set attribute" [\#650](https://github.com/pypeclub/pype/issues/650) -- Nuke Load mp4 wrong frame range [\#661](https://github.com/pypeclub/pype/issues/661) -- Hiero: Review video file adding one frame to the end [\#659](https://github.com/pypeclub/pype/issues/659) - -## [2.13.0](https://github.com/pypeclub/pype/tree/2.13.0) (2020-10-18) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.5...2.13.0) - -**Enhancements:** - -- Deadline Output Folder [\#636](https://github.com/pypeclub/pype/issues/636) -- Nuke Camera Loader [\#565](https://github.com/pypeclub/pype/issues/565) -- Deadline publish job shows publishing output folder [\#649](https://github.com/pypeclub/pype/pull/649) -- Get latest version in lib [\#642](https://github.com/pypeclub/pype/pull/642) -- Improved publishing of multiple representation from SP [\#638](https://github.com/pypeclub/pype/pull/638) -- Launch TvPaint shot work file from within Ftrack [\#631](https://github.com/pypeclub/pype/pull/631) -- Add mp4 support for RV action. [\#628](https://github.com/pypeclub/pype/pull/628) -- Maya: allow renders to have version synced with workfile [\#618](https://github.com/pypeclub/pype/pull/618) -- Renaming nukestudio host folder to hiero [\#617](https://github.com/pypeclub/pype/pull/617) -- Harmony: More efficient publishing [\#615](https://github.com/pypeclub/pype/pull/615) -- Ftrack server action improvement [\#608](https://github.com/pypeclub/pype/pull/608) -- Deadline user defaults to pype username if present [\#607](https://github.com/pypeclub/pype/pull/607) -- Standalone publisher now has icon [\#606](https://github.com/pypeclub/pype/pull/606) -- Nuke render write targeting knob improvement [\#603](https://github.com/pypeclub/pype/pull/603) -- Animated pyblish gui [\#602](https://github.com/pypeclub/pype/pull/602) -- Maya: Deadline - make use of asset dependencies optional [\#591](https://github.com/pypeclub/pype/pull/591) -- Nuke: Publishing, loading and updating alembic cameras [\#575](https://github.com/pypeclub/pype/pull/575) -- Maya: add look assigner to pype menu even if scriptsmenu is not available [\#573](https://github.com/pypeclub/pype/pull/573) -- Store task types in the database [\#572](https://github.com/pypeclub/pype/pull/572) -- Maya: Tiled EXRs to scanline EXRs render option [\#512](https://github.com/pypeclub/pype/pull/512) -- Fusion basic integration [\#452](https://github.com/pypeclub/pype/pull/452) - -**Fixed bugs:** - -- Burnin script did not propagate ffmpeg output [\#640](https://github.com/pypeclub/pype/issues/640) -- Pyblish-pype spacer in terminal wasn't transparent [\#646](https://github.com/pypeclub/pype/pull/646) -- Lib subprocess without logger [\#645](https://github.com/pypeclub/pype/pull/645) -- Nuke: prevent crash if we only have single frame in sequence [\#644](https://github.com/pypeclub/pype/pull/644) -- Burnin script logs better output [\#641](https://github.com/pypeclub/pype/pull/641) -- Missing audio on farm submission. [\#639](https://github.com/pypeclub/pype/pull/639) -- review from imagesequence error [\#633](https://github.com/pypeclub/pype/pull/633) -- Hiero: wrong order of fps clip instance data collecting [\#627](https://github.com/pypeclub/pype/pull/627) -- Add source for review instances. [\#625](https://github.com/pypeclub/pype/pull/625) -- Task processing in event sync [\#623](https://github.com/pypeclub/pype/pull/623) -- sync to avalon doesn t remove renamed task [\#619](https://github.com/pypeclub/pype/pull/619) -- Intent publish setting wasn't working with default value [\#562](https://github.com/pypeclub/pype/pull/562) -- Maya: Updating a look where the shader name changed, leaves the geo without a shader [\#514](https://github.com/pypeclub/pype/pull/514) - -**Merged pull requests:** - -- Avalon module without Qt [\#581](https://github.com/pypeclub/pype/pull/581) -- Ftrack module without Qt [\#577](https://github.com/pypeclub/pype/pull/577) - -## [2.12.5](https://github.com/pypeclub/pype/tree/2.12.5) (2020-10-14) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.4...2.12.5) - -**Enhancements:** - -- Launch TvPaint shot work file from within Ftrack [\#629](https://github.com/pypeclub/pype/issues/629) - -**Merged pull requests:** - -- Harmony: Disable application launch logic [\#637](https://github.com/pypeclub/pype/pull/637) - -## [2.12.4](https://github.com/pypeclub/pype/tree/2.12.4) (2020-10-08) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.3...2.12.4) - -**Enhancements:** - -- convert nukestudio to hiero host [\#616](https://github.com/pypeclub/pype/issues/616) -- Fusion basic integration [\#451](https://github.com/pypeclub/pype/issues/451) - -**Fixed bugs:** - -- Sync to avalon doesn't remove renamed task [\#605](https://github.com/pypeclub/pype/issues/605) -- NukeStudio: FPS collecting into clip instances [\#624](https://github.com/pypeclub/pype/pull/624) - -**Merged pull requests:** - -- NukeStudio: small fixes [\#622](https://github.com/pypeclub/pype/pull/622) -- NukeStudio: broken order of plugins [\#620](https://github.com/pypeclub/pype/pull/620) - -## [2.12.3](https://github.com/pypeclub/pype/tree/2.12.3) (2020-10-06) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.2...2.12.3) - -**Enhancements:** - -- Nuke Publish Camera [\#567](https://github.com/pypeclub/pype/issues/567) -- Harmony: open xstage file no matter of its name [\#526](https://github.com/pypeclub/pype/issues/526) -- Stop integration of unwanted data [\#387](https://github.com/pypeclub/pype/issues/387) -- Move avalon-launcher functionality to pype [\#229](https://github.com/pypeclub/pype/issues/229) -- avalon workfiles api [\#214](https://github.com/pypeclub/pype/issues/214) -- Store task types [\#180](https://github.com/pypeclub/pype/issues/180) -- Avalon Mongo Connection split [\#136](https://github.com/pypeclub/pype/issues/136) -- nk camera workflow [\#71](https://github.com/pypeclub/pype/issues/71) -- Hiero integration added [\#590](https://github.com/pypeclub/pype/pull/590) -- Anatomy instance data collection is substantially faster for many instances [\#560](https://github.com/pypeclub/pype/pull/560) - -**Fixed bugs:** - -- test issue [\#596](https://github.com/pypeclub/pype/issues/596) -- Harmony: empty scene contamination [\#583](https://github.com/pypeclub/pype/issues/583) -- Edit publishing in SP doesn't respect shot selection for publishing [\#542](https://github.com/pypeclub/pype/issues/542) -- Pathlib breaks compatibility with python2 hosts [\#281](https://github.com/pypeclub/pype/issues/281) -- Updating a look where the shader name changed leaves the geo without a shader [\#237](https://github.com/pypeclub/pype/issues/237) -- Better error handling [\#84](https://github.com/pypeclub/pype/issues/84) -- Harmony: function signature [\#609](https://github.com/pypeclub/pype/pull/609) -- Nuke: gizmo publishing error [\#594](https://github.com/pypeclub/pype/pull/594) -- Harmony: fix clashing namespace of called js functions [\#584](https://github.com/pypeclub/pype/pull/584) -- Maya: fix maya scene type preset exception [\#569](https://github.com/pypeclub/pype/pull/569) - -**Closed issues:** - -- Nuke Gizmo publishing [\#597](https://github.com/pypeclub/pype/issues/597) -- nuke gizmo publishing error [\#592](https://github.com/pypeclub/pype/issues/592) -- Publish EDL [\#579](https://github.com/pypeclub/pype/issues/579) -- Publish render from SP [\#576](https://github.com/pypeclub/pype/issues/576) -- rename ftrack custom attribute group to `pype` [\#184](https://github.com/pypeclub/pype/issues/184) - -**Merged pull requests:** - -- Audio file existence check [\#614](https://github.com/pypeclub/pype/pull/614) -- NKS small fixes [\#587](https://github.com/pypeclub/pype/pull/587) -- Standalone publisher editorial plugins interfering [\#580](https://github.com/pypeclub/pype/pull/580) - -## [2.12.2](https://github.com/pypeclub/pype/tree/2.12.2) (2020-09-25) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.1...2.12.2) - -**Enhancements:** - -- pype config GUI [\#241](https://github.com/pypeclub/pype/issues/241) - -**Fixed bugs:** - -- Harmony: Saving heavy scenes will crash [\#507](https://github.com/pypeclub/pype/issues/507) -- Extract review a representation name with `\*\_burnin` [\#388](https://github.com/pypeclub/pype/issues/388) -- Hierarchy data was not considering active isntances [\#551](https://github.com/pypeclub/pype/pull/551) - -## [2.12.1](https://github.com/pypeclub/pype/tree/2.12.1) (2020-09-15) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.12.0...2.12.1) - -**Fixed bugs:** - -- Pype: changelog.md is outdated [\#503](https://github.com/pypeclub/pype/issues/503) -- dependency security alert ! [\#484](https://github.com/pypeclub/pype/issues/484) -- Maya: RenderSetup is missing update [\#106](https://github.com/pypeclub/pype/issues/106) -- \ extract effects creates new instance [\#78](https://github.com/pypeclub/pype/issues/78) - -## [2.12.0](https://github.com/pypeclub/pype/tree/2.12.0) (2020-09-10) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.8...2.12.0) - -**Enhancements:** - -- Less mongo connections [\#509](https://github.com/pypeclub/pype/pull/509) -- Nuke: adding image loader [\#499](https://github.com/pypeclub/pype/pull/499) -- Move launcher window to top if launcher action is clicked [\#450](https://github.com/pypeclub/pype/pull/450) -- Maya: better tile rendering support in Pype [\#446](https://github.com/pypeclub/pype/pull/446) -- Implementation of non QML launcher [\#443](https://github.com/pypeclub/pype/pull/443) -- Optional skip review on renders. [\#441](https://github.com/pypeclub/pype/pull/441) -- Ftrack: Option to push status from task to latest version [\#440](https://github.com/pypeclub/pype/pull/440) -- Properly containerize image plane loads. [\#434](https://github.com/pypeclub/pype/pull/434) -- Option to keep the review files. [\#426](https://github.com/pypeclub/pype/pull/426) -- Isolate view on instance members. [\#425](https://github.com/pypeclub/pype/pull/425) -- Maya: Publishing of tile renderings on Deadline [\#398](https://github.com/pypeclub/pype/pull/398) -- Feature/little bit better logging gui [\#383](https://github.com/pypeclub/pype/pull/383) - -**Fixed bugs:** - -- Maya: Fix tile order for Draft Tile Assembler [\#511](https://github.com/pypeclub/pype/pull/511) -- Remove extra dash [\#501](https://github.com/pypeclub/pype/pull/501) -- Fix: strip dot from repre names in single frame renders [\#498](https://github.com/pypeclub/pype/pull/498) -- Better handling of destination during integrating [\#485](https://github.com/pypeclub/pype/pull/485) -- Fix: allow thumbnail creation for single frame renders [\#460](https://github.com/pypeclub/pype/pull/460) -- added missing argument to launch\_application in ftrack app handler [\#453](https://github.com/pypeclub/pype/pull/453) -- Burnins: Copy bit rate of input video to match quality. [\#448](https://github.com/pypeclub/pype/pull/448) -- Standalone publisher is now independent from tray [\#442](https://github.com/pypeclub/pype/pull/442) -- Bugfix/empty enumerator attributes [\#436](https://github.com/pypeclub/pype/pull/436) -- Fixed wrong order of "other" category collapssing in publisher [\#435](https://github.com/pypeclub/pype/pull/435) -- Multiple reviews where being overwritten to one. [\#424](https://github.com/pypeclub/pype/pull/424) -- Cleanup plugin fail on instances without staging dir [\#420](https://github.com/pypeclub/pype/pull/420) -- deprecated -intra parameter in ffmpeg to new `-g` [\#417](https://github.com/pypeclub/pype/pull/417) -- Delivery action can now work with entered path [\#397](https://github.com/pypeclub/pype/pull/397) - -**Merged pull requests:** - -- Review on instance.data [\#473](https://github.com/pypeclub/pype/pull/473) - -## [2.11.8](https://github.com/pypeclub/pype/tree/2.11.8) (2020-08-27) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.7...2.11.8) - -**Enhancements:** - -- DWAA support for Maya [\#382](https://github.com/pypeclub/pype/issues/382) -- Isolate View on Playblast [\#367](https://github.com/pypeclub/pype/issues/367) -- Maya: Tile rendering [\#297](https://github.com/pypeclub/pype/issues/297) -- single pype instance running [\#47](https://github.com/pypeclub/pype/issues/47) -- PYPE-649: projects don't guarantee backwards compatible environment [\#8](https://github.com/pypeclub/pype/issues/8) -- PYPE-663: separate venv for each deployed version [\#7](https://github.com/pypeclub/pype/issues/7) - -**Fixed bugs:** - -- pyblish pype - other group is collapsed before plugins are done [\#431](https://github.com/pypeclub/pype/issues/431) -- Alpha white edges in harmony on PNGs [\#412](https://github.com/pypeclub/pype/issues/412) -- harmony image loader picks wrong representations [\#404](https://github.com/pypeclub/pype/issues/404) -- Clockify crash when response contain symbol not allowed by UTF-8 [\#81](https://github.com/pypeclub/pype/issues/81) - -## [2.11.7](https://github.com/pypeclub/pype/tree/2.11.7) (2020-08-21) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.6...2.11.7) - -**Fixed bugs:** - -- Clean Up Baked Movie [\#369](https://github.com/pypeclub/pype/issues/369) -- celaction last workfile [\#459](https://github.com/pypeclub/pype/pull/459) - -## [2.11.6](https://github.com/pypeclub/pype/tree/2.11.6) (2020-08-18) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.5...2.11.6) - -**Enhancements:** - -- publisher app [\#56](https://github.com/pypeclub/pype/issues/56) - -## [2.11.5](https://github.com/pypeclub/pype/tree/2.11.5) (2020-08-13) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.4...2.11.5) - -**Enhancements:** - -- Switch from master to equivalent [\#220](https://github.com/pypeclub/pype/issues/220) -- Standalone publisher now only groups sequence if the extension is known [\#439](https://github.com/pypeclub/pype/pull/439) - -**Fixed bugs:** - -- Logs have been disable for editorial by default to speed up publishing [\#433](https://github.com/pypeclub/pype/pull/433) -- additional fixes for celaction [\#430](https://github.com/pypeclub/pype/pull/430) -- Harmony: invalid variable scope in validate scene settings [\#428](https://github.com/pypeclub/pype/pull/428) -- new representation name for audio was not accepted [\#427](https://github.com/pypeclub/pype/pull/427) - -## [2.11.4](https://github.com/pypeclub/pype/tree/2.11.4) (2020-08-10) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.3...2.11.4) - -**Enhancements:** - -- WebSocket server [\#135](https://github.com/pypeclub/pype/issues/135) -- standalonepublisher: editorial family features expansion \[master branch\] [\#411](https://github.com/pypeclub/pype/pull/411) - -## [2.11.3](https://github.com/pypeclub/pype/tree/2.11.3) (2020-08-04) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.2...2.11.3) - -**Fixed bugs:** - -- Harmony: publishing performance issues [\#408](https://github.com/pypeclub/pype/pull/408) - -## [2.11.2](https://github.com/pypeclub/pype/tree/2.11.2) (2020-07-31) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.1...2.11.2) - -**Fixed bugs:** - -- Ftrack to Avalon bug [\#406](https://github.com/pypeclub/pype/issues/406) - -## [2.11.1](https://github.com/pypeclub/pype/tree/2.11.1) (2020-07-29) - -[Full Changelog](https://github.com/pypeclub/pype/compare/2.11.0...2.11.1) - -**Merged pull requests:** - -- Celaction: metadata json folder fixes on path [\#393](https://github.com/pypeclub/pype/pull/393) -- CelAction - version up method taken fro pype.lib [\#391](https://github.com/pypeclub/pype/pull/391) - - -## 2.11.0 ## - -_**release date:** 27 July 2020_ - -**new:** -- _(blender)_ namespace support [\#341](https://github.com/pypeclub/pype/pull/341) -- _(blender)_ start end frames [\#330](https://github.com/pypeclub/pype/pull/330) -- _(blender)_ camera asset [\#322](https://github.com/pypeclub/pype/pull/322) -- _(pype)_ toggle instances per family in pyblish GUI [\#320](https://github.com/pypeclub/pype/pull/320) -- _(pype)_ current release version is now shown in the tray menu [#379](https://github.com/pypeclub/pype/pull/379) - - -**improved:** -- _(resolve)_ tagging for publish [\#239](https://github.com/pypeclub/pype/issues/239) -- _(pype)_ Support publishing a subset of shots with standalone editorial [\#336](https://github.com/pypeclub/pype/pull/336) -- _(harmony)_ Basic support for palettes [\#324](https://github.com/pypeclub/pype/pull/324) -- _(photoshop)_ Flag outdated containers on startup and publish. [\#309](https://github.com/pypeclub/pype/pull/309) -- _(harmony)_ Flag Outdated containers [\#302](https://github.com/pypeclub/pype/pull/302) -- _(photoshop)_ Publish review [\#298](https://github.com/pypeclub/pype/pull/298) -- _(pype)_ Optional Last workfile launch [\#365](https://github.com/pypeclub/pype/pull/365) - - -**fixed:** -- _(premiere)_ workflow fixes [\#346](https://github.com/pypeclub/pype/pull/346) -- _(pype)_ pype-setup does not work with space in path [\#327](https://github.com/pypeclub/pype/issues/327) -- _(ftrack)_ Ftrack delete action cause circular error [\#206](https://github.com/pypeclub/pype/issues/206) -- _(nuke)_ Priority was forced to 50 [\#345](https://github.com/pypeclub/pype/pull/345) -- _(nuke)_ Fix ValidateNukeWriteKnobs [\#340](https://github.com/pypeclub/pype/pull/340) -- _(maya)_ If camera attributes are connected, we can ignore them. [\#339](https://github.com/pypeclub/pype/pull/339) -- _(pype)_ stop appending of tools environment to existing env [\#337](https://github.com/pypeclub/pype/pull/337) -- _(ftrack)_ Ftrack timeout needs to look at AVALON\_TIMEOUT [\#325](https://github.com/pypeclub/pype/pull/325) -- _(harmony)_ Only zip files are supported. [\#310](https://github.com/pypeclub/pype/pull/310) -- _(pype)_ hotfix/Fix event server mongo uri [\#305](https://github.com/pypeclub/pype/pull/305) -- _(photoshop)_ Subset was not named or validated correctly. [\#304](https://github.com/pypeclub/pype/pull/304) - - - - -## 2.10.0 ## - -_**release date:** 17 June 2020_ - -**new:** -- _(harmony)_ **Toon Boom Harmony** has been greatly extended to support rigging, scene build, animation and rendering workflows. [#270](https://github.com/pypeclub/pype/issues/270) [#271](https://github.com/pypeclub/pype/issues/271) [#190](https://github.com/pypeclub/pype/issues/190) [#191](https://github.com/pypeclub/pype/issues/191) [#172](https://github.com/pypeclub/pype/issues/172) [#168](https://github.com/pypeclub/pype/issues/168) -- _(pype)_ Added support for rudimentary **edl publishing** into individual shots. [#265](https://github.com/pypeclub/pype/issues/265) -- _(celaction)_ Simple **Celaction** integration has been added with support for workfiles and rendering. [#255](https://github.com/pypeclub/pype/issues/255) -- _(maya)_ Support for multiple job types when submitting to the farm. We can now render Maya or Standalone render jobs for Vray and Arnold (limited support for arnold) [#204](https://github.com/pypeclub/pype/issues/204) -- _(photoshop)_ Added initial support for Photoshop [#232](https://github.com/pypeclub/pype/issues/232) - -**improved:** -- _(blender)_ Updated support for rigs and added support Layout family [#233](https://github.com/pypeclub/pype/issues/233) [#226](https://github.com/pypeclub/pype/issues/226) -- _(premiere)_ It is now possible to choose different storage root for workfiles of different task types. [#255](https://github.com/pypeclub/pype/issues/255) -- _(maya)_ Support for unmerged AOVs in Redshift multipart EXRs [#197](https://github.com/pypeclub/pype/issues/197) -- _(pype)_ Pype repository has been refactored in preparation for 3.0 release [#169](https://github.com/pypeclub/pype/issues/169) -- _(deadline)_ All file dependencies are now passed to deadline from maya to prevent premature start of rendering if caches or textures haven't been coppied over yet. [#195](https://github.com/pypeclub/pype/issues/195) -- _(nuke)_ Script validation can now be made optional. [#194](https://github.com/pypeclub/pype/issues/194) -- _(pype)_ Publishing can now be stopped at any time. [#194](https://github.com/pypeclub/pype/issues/194) - -**fix:** -- _(pype)_ Pyblish-lite has been integrated into pype repository, plus various publishing GUI fixes. [#274](https://github.com/pypeclub/pype/issues/274) [#275](https://github.com/pypeclub/pype/issues/275) [#268](https://github.com/pypeclub/pype/issues/268) [#227](https://github.com/pypeclub/pype/issues/227) [#238](https://github.com/pypeclub/pype/issues/238) -- _(maya)_ Alembic extractor was getting wrong frame range type in certain scenarios [#254](https://github.com/pypeclub/pype/issues/254) -- _(maya)_ Attaching a render to subset in maya was not passing validation in certain scenarios [#256](https://github.com/pypeclub/pype/issues/256) -- _(ftrack)_ Various small fixes to ftrack sync [#263](https://github.com/pypeclub/pype/issues/263) [#259](https://github.com/pypeclub/pype/issues/259) -- _(maya)_ Look extraction is now able to skp invalid connections in shaders [#207](https://github.com/pypeclub/pype/issues/207) - - - - -## 2.9.0 ## - -_**release date:** 25 May 2020_ - -**new:** -- _(pype)_ Support for **Multiroot projects**. You can now store project data on multiple physical or virtual storages and target individual publishes to these locations. For instance render can be stored on a faster storage than the rest of the project. [#145](https://github.com/pypeclub/pype/issues/145), [#38](https://github.com/pypeclub/pype/issues/38) -- _(harmony)_ Basic implementation of **Toon Boom Harmony** has been added. [#142](https://github.com/pypeclub/pype/issues/142) -- _(pype)_ OSX support is in public beta now. There are issues to be expected, but the main implementation should be functional. [#141](https://github.com/pypeclub/pype/issues/141) - - -**improved:** - -- _(pype)_ **Review extractor** has been completely rebuilt. It now supports granular filtering so you can create **multiple outputs** for different tasks, families or hosts. [#103](https://github.com/pypeclub/pype/issues/103), [#166](https://github.com/pypeclub/pype/issues/166), [#165](https://github.com/pypeclub/pype/issues/165) -- _(pype)_ **Burnin** generation had been extended to **support same multi-output filtering** as review extractor [#103](https://github.com/pypeclub/pype/issues/103) -- _(pype)_ Publishing file templates can now be specified in config for each individual family [#114](https://github.com/pypeclub/pype/issues/114) -- _(pype)_ Studio specific plugins can now be appended to pype standard publishing plugins. [#112](https://github.com/pypeclub/pype/issues/112) -- _(nukestudio)_ Reviewable clips no longer need to be previously cut, exported and re-imported to timeline. **Pype can now dynamically cut reviewable quicktimes** from continuous offline footage during publishing. [#23](https://github.com/pypeclub/pype/issues/23) -- _(deadline)_ Deadline can now correctly differentiate between staging and production pype. [#154](https://github.com/pypeclub/pype/issues/154) -- _(deadline)_ `PYPE_PYTHON_EXE` env variable can now be used to direct publishing to explicit python installation. [#120](https://github.com/pypeclub/pype/issues/120) -- _(nuke)_ Nuke now check for new version of loaded data on file open. [#140](https://github.com/pypeclub/pype/issues/140) -- _(nuke)_ frame range and limit checkboxes are now exposed on write node. [#119](https://github.com/pypeclub/pype/issues/119) - - - -**fix:** - -- _(nukestudio)_ Project Location was using backslashes which was breaking nukestudio native exporting in certains configurations [#82](https://github.com/pypeclub/pype/issues/82) -- _(nukestudio)_ Duplicity in hierarchy tags was prone to throwing publishing error [#130](https://github.com/pypeclub/pype/issues/130), [#144](https://github.com/pypeclub/pype/issues/144) -- _(ftrack)_ multiple stability improvements [#157](https://github.com/pypeclub/pype/issues/157), [#159](https://github.com/pypeclub/pype/issues/159), [#128](https://github.com/pypeclub/pype/issues/128), [#118](https://github.com/pypeclub/pype/issues/118), [#127](https://github.com/pypeclub/pype/issues/127) -- _(deadline)_ multipart EXRs were stopping review publishing on the farm. They are still not supported for automatic review generation, but the publish will go through correctly without the quicktime. [#155](https://github.com/pypeclub/pype/issues/155) -- _(deadline)_ If deadline is non-responsive it will no longer freeze host when publishing [#149](https://github.com/pypeclub/pype/issues/149) -- _(deadline)_ Sometimes deadline was trying to launch render before all the source data was coppied over. [#137](https://github.com/pypeclub/pype/issues/137) _(harmony)_ Basic implementation of **Toon Boom Harmony** has been added. [#142](https://github.com/pypeclub/pype/issues/142) -- _(nuke)_ Filepath knob wasn't updated properly. [#131](https://github.com/pypeclub/pype/issues/131) -- _(maya)_ When extracting animation, the "Write Color Set" options on the instance were not respected. [#108](https://github.com/pypeclub/pype/issues/108) -- _(maya)_ Attribute overrides for AOV only worked for the legacy render layers. Now it works for new render setup as well [#132](https://github.com/pypeclub/pype/issues/132) -- _(maya)_ Stability and usability improvements in yeti workflow [#104](https://github.com/pypeclub/pype/issues/104) - - - - -## 2.8.0 ## - -_**release date:** 20 April 2020_ - -**new:** - -- _(pype)_ Option to generate slates from json templates. [PYPE-628] [#26](https://github.com/pypeclub/pype/issues/26) -- _(pype)_ It is now possible to automate loading of published subsets into any scene. Documentation will follow :). [PYPE-611] [#24](https://github.com/pypeclub/pype/issues/24) - -**fix:** - -- _(maya)_ Some Redshift render tokens could break publishing. [PYPE-778] [#33](https://github.com/pypeclub/pype/issues/33) -- _(maya)_ Publish was not preserving maya file extension. [#39](https://github.com/pypeclub/pype/issues/39) -- _(maya)_ Rig output validator was failing on nodes without shapes. [#40](https://github.com/pypeclub/pype/issues/40) -- _(maya)_ Yeti caches can now be properly versioned up in the scene inventory. [#40](https://github.com/pypeclub/pype/issues/40) -- _(nuke)_ Build first workfiles was not accepting jpeg sequences. [#34](https://github.com/pypeclub/pype/issues/34) -- _(deadline)_ Trying to generate ffmpeg review from multipart EXRs no longer crashes publishing. [PYPE-781] -- _(deadline)_ Render publishing is more stable in multiplatform environments. [PYPE-775] - - - - -## 2.7.0 ## - -_**release date:** 30 March 2020_ - -**new:** - -- _(maya)_ Artist can now choose to load multiple references of the same subset at once [PYPE-646, PYPS-81] -- _(nuke)_ Option to use named OCIO colorspaces for review colour baking. [PYPS-82] -- _(pype)_ Pype can now work with `master` versions for publishing and loading. These are non-versioned publishes that are overwritten with the latest version during publish. These are now supported in all the GUIs, but their publishing is deactivated by default. [PYPE-653] -- _(blender)_ Added support for basic blender workflow. We currently support `rig`, `model` and `animation` families. [PYPE-768] -- _(pype)_ Source timecode can now be used in burn-ins. [PYPE-777] -- _(pype)_ Review outputs profiles can now specify delivery resolution different than project setting [PYPE-759] -- _(nuke)_ Bookmark to current context is now added automatically to all nuke browser windows. [PYPE-712] - -**change:** - -- _(maya)_ It is now possible to publish camera without. baking. Keep in mind that unbaked cameras can't be guaranteed to work in other hosts. [PYPE-595] -- _(maya)_ All the renders from maya are now grouped in the loader by their Layer name. [PYPE-482] -- _(nuke/hiero)_ Any publishes from nuke and hiero can now be versioned independently of the workfile. [PYPE-728] - - -**fix:** - -- _(nuke)_ Mixed slashes caused issues in ocio config path. -- _(pype)_ Intent field in pyblish GUI was passing label instead of value to ftrack. [PYPE-733] -- _(nuke)_ Publishing of pre-renders was inconsistent. [PYPE-766] -- _(maya)_ Handles and frame ranges were inconsistent in various places during publishing. -- _(nuke)_ Nuke was crashing if it ran into certain missing knobs. For example DPX output missing `autocrop` [PYPE-774] -- _(deadline)_ Project overrides were not working properly with farm render publishing. -- _(hiero)_ Problems with single frame plates publishing. -- _(maya)_ Redshift RenderPass token were breaking render publishing. [PYPE-778] -- _(nuke)_ Build first workfile was not accepting jpeg sequences. -- _(maya)_ Multipart (Multilayer) EXRs were breaking review publishing due to FFMPEG incompatiblity [PYPE-781] - - - -## 2.6.0 ## - -_**release date:** 9 March 2020_ - -**change:** -- _(maya)_ render publishing has been simplified and made more robust. Render setup layers are now automatically added to publishing subsets and `render globals` family has been replaced with simple `render` [PYPE-570] -- _(avalon)_ change context and workfiles apps, have been merged into one, that allows both actions to be performed at the same time. [PYPE-747] -- _(pype)_ thumbnails are now automatically propagate to asset from the last published subset in the loader -- _(ftrack)_ publishing comment and intent are now being published to ftrack note as well as describtion. [PYPE-727] -- _(pype)_ when overriding existing version new old representations are now overriden, instead of the new ones just being appended. (to allow this behaviour, the version validator need to be disabled. [PYPE-690]) -- _(pype)_ burnin preset has been significantly simplified. It now doesn't require passing function to each field, but only need the actual text template. to use this, all the current burnin PRESETS MUST BE UPDATED for all the projects. -- _(ftrack)_ credentials are now stored on a per server basis, so it's possible to switch between ftrack servers without having to log in and out. [PYPE-723] - - -**new:** -- _(pype)_ production and development deployments now have different colour of the tray icon. Orange for Dev and Green for production [PYPE-718] -- _(maya)_ renders can now be attached to a publishable subset rather than creating their own subset. For example it is possible to create a reviewable `look` or `model` render and have it correctly attached as a representation of the subsets [PYPE-451] -- _(maya)_ after saving current scene into a new context (as a new shot for instance), all the scene publishing subsets data gets re-generated automatically to match the new context [PYPE-532] -- _(pype)_ we now support project specific publish, load and create plugins [PYPE-740] -- _(ftrack)_ new action that allow archiving/deleting old published versions. User can keep how many of the latest version to keep when the action is ran. [PYPE-748, PYPE-715] -- _(ftrack)_ it is now possible to monitor and restart ftrack event server using ftrack action. [PYPE-658] -- _(pype)_ validator that prevent accidental overwrites of previously published versions. [PYPE-680] -- _(avalon)_ avalon core updated to version 5.6.0 -- _(maya)_ added validator to make sure that relative paths are used when publishing arnold standins. -- _(nukestudio)_ it is now possible to extract and publish audio family from clip in nuke studio [PYPE-682] - -**fix**: -- _(maya)_ maya set framerange button was ignoring handles [PYPE-719] -- _(ftrack)_ sync to avalon was sometime crashing when ran on empty project -- _(nukestudio)_ publishing same shots after they've been previously archived/deleted would result in a crash. [PYPE-737] -- _(nuke)_ slate workflow was breaking in certain scenarios. [PYPE-730] -- _(pype)_ rendering publish workflow has been significantly improved to prevent error resulting from implicit render collection. [PYPE-665, PYPE-746] -- _(pype)_ launching application on a non-synced project resulted in obscure [PYPE-528] -- _(pype)_ missing keys in burnins no longer result in an error. [PYPE-706] -- _(ftrack)_ create folder structure action was sometimes failing for project managers due to wrong permissions. -- _(Nukestudio)_ using `source` in the start frame tag could result in wrong frame range calculation -- _(ftrack)_ sync to avalon action and event have been improved by catching more edge cases and provessing them properly. - - - -## 2.5.0 ## - -_**release date:** 11 Feb 2020_ - -**change:** -- _(pype)_ added many logs for easier debugging -- _(pype)_ review presets can now be separated between 2d and 3d renders [PYPE-693] -- _(pype)_ anatomy module has been greatly improved to allow for more dynamic pulblishing and faster debugging [PYPE-685] -- _(pype)_ avalon schemas have been moved from `pype-config` to `pype` repository, for simplification. [PYPE-670] -- _(ftrack)_ updated to latest ftrack API -- _(ftrack)_ publishing comments now appear in ftrack also as a note on version with customisable category [PYPE-645] -- _(ftrack)_ delete asset/subset action had been improved. It is now able to remove multiple entities and descendants of the selected entities [PYPE-361, PYPS-72] -- _(workfiles)_ added date field to workfiles app [PYPE-603] -- _(maya)_ old deprecated loader have been removed in favour of a single unified reference loader (old scenes will upgrade automatically to the new loader upon opening) [PYPE-633, PYPE-697] -- _(avalon)_ core updated to 5.5.15 [PYPE-671] -- _(nuke)_ library loader is now available in nuke [PYPE-698] - - -**new:** -- _(pype)_ added pype render wrapper to allow rendering on mixed platform farms. [PYPE-634] -- _(pype)_ added `pype launch` command. It let's admin run applications with dynamically built environment based on the given context. [PYPE-634] -- _(pype)_ added support for extracting review sequences with burnins [PYPE-657] -- _(publish)_ users can now set intent next to a comment when publishing. This will then be reflected on an attribute in ftrack. [PYPE-632] -- _(burnin)_ timecode can now be added to burnin -- _(burnin)_ datetime keys can now be added to burnin and anatomy [PYPE-651] -- _(burnin)_ anatomy templates can now be used in burnins. [PYPE=626] -- _(nuke)_ new validator for render resolution -- _(nuke)_ support for attach slate to nuke renders [PYPE-630] -- _(nuke)_ png sequences were added to loaders -- _(maya)_ added maya 2020 compatibility [PYPE-677] -- _(maya)_ ability to publish and load .ASS standin sequences [PYPS-54] -- _(pype)_ thumbnails can now be published and are visible in the loader. `AVALON_THUMBNAIL_ROOT` environment variable needs to be set for this to work [PYPE-573, PYPE-132] -- _(blender)_ base implementation of blender was added with publishing and loading of .blend files [PYPE-612] -- _(ftrack)_ new action for preparing deliveries [PYPE-639] - - -**fix**: -- _(burnin)_ more robust way of finding ffmpeg for burnins. -- _(pype)_ improved UNC paths remapping when sending to farm. -- _(pype)_ float frames sometimes made their way to representation context in database, breaking loaders [PYPE-668] -- _(pype)_ `pype install --force` was failing sometimes [PYPE-600] -- _(pype)_ padding in published files got calculated wrongly sometimes. It is now instead being always read from project anatomy. [PYPE-667] -- _(publish)_ comment publishing was failing in certain situations -- _(ftrack)_ multiple edge case scenario fixes in auto sync and sync-to-avalon action -- _(ftrack)_ sync to avalon now works on empty projects -- _(ftrack)_ thumbnail update event was failing when deleting entities [PYPE-561] -- _(nuke)_ loader applies proper colorspaces from Presets -- _(nuke)_ publishing handles didn't always work correctly [PYPE-686] -- _(maya)_ assembly publishing and loading wasn't working correctly - - - - - -## 2.4.0 ## - -_**release date:** 9 Dec 2019_ - -**change:** -- _(ftrack)_ version to status ftrack event can now be configured from Presets - - based on preset `presets/ftracc/ftrack_config.json["status_version_to_task"]` -- _(ftrack)_ sync to avalon event has been completely re-written. It now supports most of the project management situations on ftrack including moving, renaming and deleting entities, updating attributes and working with tasks. -- _(ftrack)_ sync to avalon action has been also re-writen. It is now much faster (up to 100 times depending on a project structure), has much better logging and reporting on encountered problems, and is able to handle much more complex situations. -- _(ftrack)_ sync to avalon trigger by checking `auto-sync` toggle on ftrack [PYPE-504] -- _(pype)_ various new features in the REST api -- _(pype)_ new visual identity used across pype -- _(pype)_ started moving all requirements to pip installation rather than vendorising them in pype repository. Due to a few yet unreleased packages, this means that pype can temporarily be only installed in the offline mode. - -**new:** -- _(nuke)_ support for publishing gizmos and loading them as viewer processes -- _(nuke)_ support for publishing nuke nodes from backdrops and loading them back -- _(pype)_ burnins can now work with start and end frames as keys - - use keys `{frame_start}`, `{frame_end}` and `{current_frame}` in burnin preset to use them. [PYPS-44,PYPS-73, PYPE-602] -- _(pype)_ option to filter logs by user and level in loggin GUI -- _(pype)_ image family added to standalone publisher [PYPE-574] -- _(pype)_ matchmove family added to standalone publisher [PYPE-574] -- _(nuke)_ validator for comparing arbitrary knobs with values from presets -- _(maya)_ option to force maya to copy textures in the new look publish rather than hardlinking them -- _(pype)_ comments from pyblish GUI are now being added to ftrack version -- _(maya)_ validator for checking outdated containers in the scene -- _(maya)_ option to publish and load arnold standin sequence [PYPE-579, PYPS-54] - -**fix**: -- _(pype)_ burnins were not respecting codec of the input video -- _(nuke)_ lot's of various nuke and nuke studio fixes across the board [PYPS-45] -- _(pype)_ workfiles app is not launching with the start of the app by default [PYPE-569] -- _(ftrack)_ ftrack integration during publishing was failing under certain situations [PYPS-66] -- _(pype)_ minor fixes in REST api -- _(ftrack)_ status change event was crashing when the target status was missing [PYPS-68] -- _(ftrack)_ actions will try to reconnect if they fail for some reason -- _(maya)_ problems with fps mapping when using float FPS values -- _(deadline)_ overall improvements to deadline publishing -- _(setup)_ environment variables are now remapped on the fly based on the platform pype is running on. This fixes many issues in mixed platform environments. - - - -## 2.3.6 # - -_**release date:** 27 Nov 2019_ - -**hotfix**: -- _(ftrack)_ was hiding important debug logo -- _(nuke)_ crashes during workfile publishing -- _(ftrack)_ event server crashes because of signal problems -- _(muster)_ problems with muster render submissions -- _(ftrack)_ thumbnail update event syntax errors - - -## 2.3.0 ## -_release date: 6 Oct 2019_ - -**new**: -- _(maya)_ support for yeti rigs and yeti caches -- _(maya)_ validator for comparing arbitrary attributes against ftrack -- _(pype)_ burnins can now show current date and time -- _(muster)_ pools can now be set in render globals in maya -- _(pype)_ Rest API has been implemented in beta stage -- _(nuke)_ LUT loader has been added -- _(pype)_ rudimentary user module has been added as preparation for user management -- _(pype)_ a simple logging GUI has been added to pype tray -- _(nuke)_ nuke can now bake input process into mov -- _(maya)_ imported models now have selection handle displayed by defaulting -- _(avalon)_ it's is now possible to load multiple assets at once using loader -- _(maya)_ added ability to automatically connect yeti rig to a mesh upon loading - -**changed**: -- _(ftrack)_ event server now runs two parallel processes and is able to keep queue of events to process. -- _(nuke)_ task name is now added to all rendered subsets -- _(pype)_ adding more families to standalone publisher -- _(pype)_ standalone publisher now uses pyblish-lite -- _(pype)_ standalone publisher can now create review quicktimes -- _(ftrack)_ queries to ftrack were sped up -- _(ftrack)_ multiple ftrack action have been deprecated -- _(avalon)_ avalon upstream has been updated to 5.5.0 -- _(nukestudio)_ published transforms can now be animated -- - -**fix**: -- _(maya)_ fps popup button didn't work in some cases -- _(maya)_ geometry instances and references in maya were losing shader assignments -- _(muster)_ muster rendering templates were not working correctly -- _(maya)_ arnold tx texture conversion wasn't respecting colorspace set by the artist -- _(pype)_ problems with avalon db sync -- _(maya)_ ftrack was rounding FPS making it inconsistent -- _(pype)_ wrong icon names in Creator -- _(maya)_ scene inventory wasn't showing anything if representation was removed from database after it's been loaded to the scene -- _(nukestudio)_ multiple bugs squashed -- _(loader)_ loader was taking long time to show all the loading action when first launcher in maya - -## 2.2.0 ## -_release date: 8 Sept 2019_ - -**new**: -- _(pype)_ add customisable workflow for creating quicktimes from renders or playblasts -- _(nuke)_ option to choose deadline chunk size on write nodes -- _(nukestudio)_ added option to publish soft effects (subTrackItems) from NukeStudio as subsets including LUT files. these can then be loaded in nuke or NukeStudio -- _(nuke)_ option to build nuke script from previously published latest versions of plate and render subsets. -- _(nuke)_ nuke writes now have deadline tab. -- _(ftrack)_ Prepare Project action can now be used for creating the base folder structure on disk and in ftrack, setting up all the initial project attributes and it automatically prepares `pype_project_config` folder for the given project. -- _(clockify)_ Added support for time tracking in clockify. This currently in addition to ftrack time logs, but does not completely replace them. -- _(pype)_ any attributes in Creator and Loader plugins can now be customised using pype preset system - -**changed**: -- nukestudio now uses workio API for workfiles -- _(maya)_ "FIX FPS" prompt in maya now appears in the middle of the screen -- _(muster)_ can now be configured with custom templates -- _(pype)_ global publishing plugins can now be configured using presets as well as host specific ones - - -**fix**: -- wrong version retrieval from path in certain scenarios -- nuke reset resolution wasn't working in certain scenarios - -## 2.1.0 ## -_release date: 6 Aug 2019_ - -A large cleanup release. Most of the change are under the hood. - -**new**: -- _(pype)_ add customisable workflow for creating quicktimes from renders or playblasts -- _(pype)_ Added configurable option to add burnins to any generated quicktimes -- _(ftrack)_ Action that identifies what machines pype is running on. -- _(system)_ unify subprocess calls -- _(maya)_ add audio to review quicktimes -- _(nuke)_ add crop before write node to prevent overscan problems in ffmpeg -- **Nuke Studio** publishing and workfiles support -- **Muster** render manager support -- _(nuke)_ Framerange, FPS and Resolution are set automatically at startup -- _(maya)_ Ability to load published sequences as image planes -- _(system)_ Ftrack event that sets asset folder permissions based on task assignees in ftrack. -- _(maya)_ Pyblish plugin that allow validation of maya attributes -- _(system)_ added better startup logging to tray debug, including basic connection information -- _(avalon)_ option to group published subsets to groups in the loader -- _(avalon)_ loader family filters are working now - -**changed**: -- change multiple key attributes to unify their behaviour across the pipeline - - `frameRate` to `fps` - - `startFrame` to `frameStart` - - `endFrame` to `frameEnd` - - `fstart` to `frameStart` - - `fend` to `frameEnd` - - `handle_start` to `handleStart` - - `handle_end` to `handleEnd` - - `resolution_width` to `resolutionWidth` - - `resolution_height` to `resolutionHeight` - - `pixel_aspect` to `pixelAspect` - -- _(nuke)_ write nodes are now created inside group with only some attributes editable by the artist -- rendered frames are now deleted from temporary location after their publishing is finished. -- _(ftrack)_ RV action can now be launched from any entity -- after publishing only refresh button is now available in pyblish UI -- added context instance pyblish-lite so that artist knows if context plugin fails -- _(avalon)_ allow opening selected files using enter key -- _(avalon)_ core updated to v5.2.9 with our forked changes on top - -**fix**: -- faster hierarchy retrieval from db -- _(nuke)_ A lot of stability enhancements -- _(nuke studio)_ A lot of stability enhancements -- _(nuke)_ now only renders a single write node on farm -- _(ftrack)_ pype would crash when launcher project level task -- work directory was sometimes not being created correctly -- major pype.lib cleanup. Removing of unused functions, merging those that were doing the same and general house cleaning. -- _(avalon)_ subsets in maya 2019 weren't behaving correctly in the outliner - - -\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/README.md b/README.md index a79b9f2582..1f7f53cb86 100644 --- a/README.md +++ b/README.md @@ -2,358 +2,5 @@ [![All Contributors](https://img.shields.io/badge/all_contributors-28-orange.svg?style=flat-square)](#contributors-) -OpenPype +AYON-core ======== - -[![documentation](https://github.com/pypeclub/pype/actions/workflows/documentation.yml/badge.svg)](https://github.com/pypeclub/pype/actions/workflows/documentation.yml) ![GitHub VFX Platform](https://img.shields.io/badge/vfx%20platform-2022-lightgrey?labelColor=303846) - -## Important Notice! - -OpenPype as a standalone product has reach end of it's life and this repository is now used as a pipeline core code for [AYON](https://ynput.io/ayon/). You can read more details about the end of life process here https://community.ynput.io/t/openpype-end-of-life-timeline/877 - - -Introduction ------------- - -Open-source pipeline for visual effects and animation built on top of the [Avalon](https://getavalon.github.io/) framework, expanding it with extra features and integrations. OpenPype connects your DCCs, asset database, project management and time tracking into a single system. It has a tight integration with [ftrack](https://www.ftrack.com/en/), but can also run independently or be integrated into a different project management solution. - -OpenPype provides a robust platform for your studio, without the worry of a vendor lock. You will always have full access to the source-code and your project database will run locally or in the cloud of your choice. - - -To get all the information about the project, go to [OpenPype.io](http://openpype.io) - -Requirements ------------- - -We aim to closely follow [**VFX Reference Platform**](https://vfxplatform.com/) - -OpenPype is written in Python 3 with specific elements still running in Python2 until all DCCs are fully updated. To see the list of those, that are not quite there yet, go to [VFX Python3 tracker](https://vfxpy.com/) - -The main things you will need to run and build OpenPype are: - -- **Terminal** in your OS - - PowerShell 5.0+ (Windows) - - Bash (Linux) -- [**Python 3.9.6**](#python) or higher -- [**MongoDB**](#database) (needed only for local development) - - -It can be built and ran on all common platforms. We develop and test on the following: - -- **Windows** 10 -- **Linux** - - **Ubuntu** 20.04 LTS - - **Centos** 7 -- **Mac OSX** - - **10.15** Catalina - - **11.1** Big Sur (using Rosetta2) - -For more details on requirements visit [requirements documentation](https://openpype.io/docs/dev_requirements) - -Building OpenPype ------------------ - -To build OpenPype you currently need [Python 3.9](https://www.python.org/downloads/) as we are following -[vfx platform](https://vfxplatform.com). Because of some Linux distros comes with newer Python version -already, you need to install **3.9** version and make use of it. You can use perhaps [pyenv](https://github.com/pyenv/pyenv) for this on Linux. -**Note**: We do not support 3.9.0 because of [this bug](https://github.com/python/cpython/pull/22670). Please, use higher versions of 3.9.x. - -### Windows - -You will need [Python >= 3.9.1](https://www.python.org/downloads/) and [git](https://git-scm.com/downloads). -More tools might be needed for installing dependencies (for example for **OpenTimelineIO**) - mostly -development tools like [CMake](https://cmake.org/) and [Visual Studio](https://visualstudio.microsoft.com/cs/downloads/) - -#### Clone repository: -```sh -git clone --recurse-submodules git@github.com:ynput/OpenPype.git -``` - -#### To build OpenPype: - -1) Run `.\tools\create_env.ps1` to create virtual environment in `.\venv`. -2) Run `.\tools\fetch_thirdparty_libs.ps1` to download third-party dependencies like ffmpeg and oiio. Those will be included in build. -3) Run `.\tools\build.ps1` to build OpenPype executables in `.\build\`. - -To create distributable OpenPype versions, run `./tools/create_zip.ps1` - that will -create zip file with name `openpype-vx.x.x.zip` parsed from current OpenPype repository and -copy it to user data dir, or you can specify `--path /path/to/zip` to force it there. - -You can then point **Igniter** - OpenPype setup tool - to directory containing this zip and -it will install it on current computer. - -OpenPype is build using [CX_Freeze](https://cx-freeze.readthedocs.io/en/latest) to freeze itself and all dependencies. - -### macOS - -You will need [Python >= 3.9](https://www.python.org/downloads/) and [git](https://git-scm.com/downloads). You'll need also other tools to build -some OpenPype dependencies like [CMake](https://cmake.org/) and **XCode Command Line Tools** (or some other build system). - -Easy way of installing everything necessary is to use [Homebrew](https://brew.sh): - -1) Install **Homebrew**: - ```sh - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - ``` - -2) Install **cmake**: - ```sh - brew install cmake - ``` - -3) Install [pyenv](https://github.com/pyenv/pyenv): - ```sh - brew install pyenv - echo 'eval "$(pyenv init -)"' >> ~/.zshrc - pyenv init - exec "$SHELL" - PATH=$(pyenv root)/shims:$PATH - ``` - -4) Pull in required Python version 3.9.x: - ```sh - # install Python build dependences - brew install openssl readline sqlite3 xz zlib - - # replace with up-to-date 3.9.x version - pyenv install 3.9.6 - ``` - -5) Set local Python version: - ```sh - # switch to OpenPype source directory - pyenv local 3.9.6 - ``` - -#### To build OpenPype: - -1) Run `.\tools\create_env.sh` to create virtual environment in `.\venv` -2) Run `.\tools\fetch_thirdparty_libs.sh` to download third-party dependencies like ffmpeg and oiio. Those will be included in build. -3) Run `.\tools\build.sh` to build OpenPype executables in `.\build\` - -### Linux - -#### Docker -Easiest way to build OpenPype on Linux is using [Docker](https://www.docker.com/). Just run: - -```sh -sudo ./tools/docker_build.sh -``` - -This will by default use Debian as base image. If you need to make Centos 7 compatible build, please run: - -```sh -sudo ./tools/docker_build.sh centos7 -``` - -If all is successful, you'll find built OpenPype in `./build/` folder. - -Docker build can be also started from Windows machine, just use `./tools/docker_build.ps1` instead of shell script. - -This could be used even for building linux build (with argument `centos7` or `debian`) - -#### Manual build -You will need [Python >= 3.9](https://www.python.org/downloads/) and [git](https://git-scm.com/downloads). You'll also need [curl](https://curl.se) on systems that doesn't have one preinstalled. - -To build Python related stuff, you need Python header files installed (`python3-dev` on Ubuntu for example). - -You'll need also other tools to build -some OpenPype dependencies like [CMake](https://cmake.org/). Python 3 should be part of all modern distributions. You can use your package manager to install **git** and **cmake**. - -
-Details for Ubuntu -Install git, cmake and curl - -```sh -sudo apt install build-essential checkinstall -sudo apt install git cmake curl -``` -#### Note: -In case you run in error about `xcb` when running OpenPype, -you'll need also additional libraries for Qt5: - -```sh -sudo apt install qt5-default -``` -or if you are on Ubuntu > 20.04, there is no `qt5-default` packages so you need to install its content individually: - -```sh -sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools -``` -
- -
-Details for Centos -Install git, cmake and curl - -```sh -sudo yum install qit cmake -``` - -#### Note: -In case you run in error about `xcb` when running OpenPype, -you'll need also additional libraries for Qt5: - -```sh -sudo yum install qt5-qtbase-devel -``` -
- -
-Use pyenv to install Python version for OpenPype build - -You will need **bzip2**, **readline**, **sqlite3** and other libraries. - -For more details about Python build environments see: - -https://github.com/pyenv/pyenv/wiki#suggested-build-environment - -**For Ubuntu:** -```sh -sudo apt-get update; sudo apt-get install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev -``` - -**For Centos:** -```sh -yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel -``` - -**install pyenv** -```sh -curl https://pyenv.run | bash - -# you can add those to ~/.bashrc -export PATH="$HOME/.pyenv/bin:$PATH" -eval "$(pyenv init -)" -eval "$(pyenv virtualenv-init -)" - -# reload shell -exec $SHELL - -# install Python 3.9.x -pyenv install -v 3.9.6 - -# change path to OpenPype 3 -cd /path/to/openpype-3 - -# set local python version -pyenv local 3.9.6 - -``` -
- -#### To build OpenPype: - -1) Run `.\tools\create_env.sh` to create virtual environment in `.\venv` -2) Run `.\tools\build.sh` to build OpenPype executables in `.\build\` - - -Running OpenPype ----------------- - -OpenPype can by executed either from live sources (this repository) or from -*"frozen code"* - executables that can be build using steps described above. - -If OpenPype is executed from live sources, it will use OpenPype version included in them. If -it is executed from frozen code it will try to find latest OpenPype version installed locally -on current computer and if it is not found, it will ask for its location. On that location -OpenPype can be either in directories or zip files. OpenPype will try to find latest version and -install it to user data directory (on Windows to `%LOCALAPPDATA%\pypeclub\openpype`, on Linux -`~/.local/share/openpype` and on macOS in `~/Library/Application Support/openpype`). - -### From sources -OpenPype can be run directly from sources by activating virtual environment: - -```sh -poetry run python start.py tray -``` - -This will use current OpenPype version with sources. You can override this with `--use-version=x.x.x` and -then OpenPype will try to find locally installed specified version (present in user data directory). - -### From frozen code - -You need to build OpenPype first. This will produce two executables - `openpype_gui(.exe)` and `openpype_console(.exe)`. -First one will act as GUI application and will not create console (useful in production environments). -The second one will create console and will write output there - useful for headless application and -debugging purposes. If you need OpenPype version installed, just run `./tools/create_zip(.ps1|.sh)` without -arguments and it will create zip file that OpenPype can use. - - -Building documentation ----------------------- - -To build API documentation, run `.\tools\make_docs(.ps1|.sh)`. It will create html documentation -from current sources in `.\docs\build`. - -**Note that it needs existing virtual environment.** - -Running tests -------------- - -To run tests, execute `.\tools\run_tests(.ps1|.sh)`. - -**Note that it needs existing virtual environment.** - - -Developer tools ---------------- - -In case you wish to add your own tools to `.\tools` folder without git tracking, it is possible by adding it with `dev_*` suffix (example: `dev_clear_pyc(.ps1|.sh)`). - - - -## Contributors โœจ - -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Milan Kolar
Milan Kolar

๐Ÿ’ป ๐Ÿ“– ๐Ÿš‡ ๐Ÿ’ผ ๐Ÿ–‹ ๐Ÿ” ๐Ÿšง ๐Ÿ“† ๐Ÿ‘€ ๐Ÿง‘โ€๐Ÿซ ๐Ÿ’ฌ
Jakub Jeลพek
Jakub Jeลพek

๐Ÿ’ป ๐Ÿ“– ๐Ÿš‡ ๐Ÿ–‹ ๐Ÿ‘€ ๐Ÿšง ๐Ÿง‘โ€๐Ÿซ ๐Ÿ“† ๐Ÿ’ฌ
Ondล™ej Samohel
Ondล™ej Samohel

๐Ÿ’ป ๐Ÿ“– ๐Ÿš‡ ๐Ÿ–‹ ๐Ÿ‘€ ๐Ÿšง ๐Ÿง‘โ€๐Ÿซ ๐Ÿ“† ๐Ÿ’ฌ
Jakub Trllo
Jakub Trllo

๐Ÿ’ป ๐Ÿ“– ๐Ÿš‡ ๐Ÿ‘€ ๐Ÿšง ๐Ÿ’ฌ
Petr Kalis
Petr Kalis

๐Ÿ’ป ๐Ÿ“– ๐Ÿš‡ ๐Ÿ‘€ ๐Ÿšง ๐Ÿ’ฌ
64qam
64qam

๐Ÿ’ป ๐Ÿ‘€ ๐Ÿ“– ๐Ÿš‡ ๐Ÿ“† ๐Ÿšง ๐Ÿ–‹ ๐Ÿ““
Roy Nieterau
Roy Nieterau

๐Ÿ’ป ๐Ÿ“– ๐Ÿ‘€ ๐Ÿง‘โ€๐Ÿซ ๐Ÿ’ฌ
Toke Jepsen
Toke Jepsen

๐Ÿ’ป ๐Ÿ“– ๐Ÿ‘€ ๐Ÿง‘โ€๐Ÿซ ๐Ÿ’ฌ
Jiri Sindelar
Jiri Sindelar

๐Ÿ’ป ๐Ÿ‘€ ๐Ÿ“– ๐Ÿ–‹ โœ… ๐Ÿ““
Simone Barbieri
Simone Barbieri

๐Ÿ’ป ๐Ÿ“–
karimmozilla
karimmozilla

๐Ÿ’ป
Allan I. A.
Allan I. A.

๐Ÿ’ป
murphy
murphy

๐Ÿ’ป ๐Ÿ‘€ ๐Ÿ““ ๐Ÿ“– ๐Ÿ“†
Wijnand Koreman
Wijnand Koreman

๐Ÿ’ป
Bo Zhou
Bo Zhou

๐Ÿ’ป
Clรฉment Hector
Clรฉment Hector

๐Ÿ’ป ๐Ÿ‘€
David Lai
David Lai

๐Ÿ’ป ๐Ÿ‘€
Derek
Derek

๐Ÿ’ป ๐Ÿ“–
Gรกbor Marinov
Gรกbor Marinov

๐Ÿ’ป ๐Ÿ“–
icyvapor
icyvapor

๐Ÿ’ป ๐Ÿ“–
Jรฉrรดme LORRAIN
Jรฉrรดme LORRAIN

๐Ÿ’ป
David Morris-Oliveros
David Morris-Oliveros

๐Ÿ’ป
BenoitConnan
BenoitConnan

๐Ÿ’ป
Malthaldar
Malthaldar

๐Ÿ’ป
Sven Neve
Sven Neve

๐Ÿ’ป
zafrs
zafrs

๐Ÿ’ป
Fรฉlix David
Fรฉlix David

๐Ÿ’ป ๐Ÿ“–
Alexey Bogomolov
Alexey Bogomolov

๐Ÿ’ป
- - - - - - -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/app_launcher.py b/app_launcher.py deleted file mode 100644 index 6dc1518370..0000000000 --- a/app_launcher.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Launch process that is not child process of python or OpenPype. - -This is written for linux distributions where process tree may affect what -is when closed or blocked to be closed. -""" - -import os -import sys -import subprocess -import json - - -def main(input_json_path): - """Read launch arguments from json file and launch the process. - - Expected that json contains "args" key with string or list of strings. - - Arguments are converted to string using `list2cmdline`. At the end is added - `&` which will cause that launched process is detached and running as - "background" process. - - ## Notes - @iLLiCiT: This should be possible to do with 'disown' or double forking but - I didn't find a way how to do it properly. Disown didn't work as - expected for me and double forking killed parent process which is - unexpected too. - """ - with open(input_json_path, "r") as stream: - data = json.load(stream) - - # Change environment variables - env = data.get("env") or {} - for key, value in env.items(): - os.environ[key] = value - - # Prepare launch arguments - args = data["args"] - if isinstance(args, list): - args = subprocess.list2cmdline(args) - - # Run the command as background process - shell_cmd = args + " &" - os.system(shell_cmd) - sys.exit(0) - - -if __name__ == "__main__": - # Expect that last argument is path to a json with launch args information - main(sys.argv[-1]) diff --git a/conftest.py b/conftest.py deleted file mode 100644 index 835d4e01db..0000000000 --- a/conftest.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""Conftest.""" -... diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 69fe55ecfa..0000000000 --- a/docs/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 102da990aa..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,74 +0,0 @@ -API Documentation -================= - -This documents the way how to build and modify API documentation using Sphinx and AutoAPI. Ground for documentation -should be directly in sources - in docstrings and markdowns. Sphinx and AutoAPI will crawl over them and generate -RST files that are in turn used to generate HTML documentation. For docstrings we prefer "Napoleon" or "Google" style -docstrings, but RST is also acceptable mainly in cases where you need to use Sphinx directives. - -Using only docstrings is not really viable as some documentation should be done on higher level - like overview of -some modules/functionality and so on. This should be done directly in RST files and committed to repository. - -Configuration -------------- -Configuration is done in `/docs/source/conf.py`. The most important settings are: - -- `autodoc_mock_imports`: add modules that can't be actually imported by Sphinx in running environment, like `nuke`, `maya`, etc. -- `autoapi_ignore`: add directories that shouldn't be processed by **AutoAPI**, like vendor dirs, etc. -- `html_theme_options`: you can use these options to influence how the html theme of the generated files will look. -- `myst_gfm_only`: are Myst parser option for Markdown setting what flavour of Markdown should be used. - -How to build it ---------------- - -You can run: - -```sh -cd .\docs -make.bat html -``` - -on linux/macOS: - -```sh -cd ./docs -make html -``` - -This will go over our code and generate **.rst** files in `/docs/source/autoapi` and from those it will generate -full html documentation in `/docs/build/html`. - -During the build you may see tons of red errors that are pointing to our issues: - -1) **Wrong imports** - -Invalid import are usually wrong relative imports (too deep) or circular imports. -2) **Invalid docstrings** - -Docstrings to be processed into documentation needs to follow some syntax - this can be checked by running -`pydocstyle` that is already included with OpenPype -3) **Invalid markdown/rst files** - -Markdown/RST files can be included inside RST files using `.. include::` directive. But they have to be properly -formatted. - -Editing RST templates ---------------------- -Everything starts with `/docs/source/index.rst` - this file should be properly edited, Right now it just -includes `readme.rst` that in turn include and parse main `README.md`. This is entrypoint to API documentation. -All templates generated by AutoAPI are in `/docs/source/autoapi`. They should be eventually committed to repository -and edited too. - -Steps for enhancing API documentation -------------------------------------- - -1) Run `/docs/make.bat html` -2) Read the red errors/warnings - fix it in the code -3) Run `/docs/make.bat html` - again until there are no red lines -4) Edit RST files and add some meaningful content there - -Resources -========= - -- [ReStructuredText on Wikipedia](https://en.wikipedia.org/wiki/ReStructuredText) -- [RST Quick Reference](https://docutils.sourceforge.io/docs/user/rst/quickref.html) -- [Sphinx AutoAPI Documentation](https://sphinx-autoapi.readthedocs.io/en/latest/) -- [Example of Google Style Python Docstrings](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) -- [Sphinx Directives](https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html) diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 1d261df277..0000000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=..\.poetry\bin\poetry run sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/docs/source/_static/AYON_tight_G.svg b/docs/source/_static/AYON_tight_G.svg deleted file mode 100644 index 2c5b73deea..0000000000 --- a/docs/source/_static/AYON_tight_G.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - diff --git a/docs/source/_static/README.md b/docs/source/_static/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/source/_templates/autoapi/index.rst b/docs/source/_templates/autoapi/index.rst deleted file mode 100644 index 95d0ad8911..0000000000 --- a/docs/source/_templates/autoapi/index.rst +++ /dev/null @@ -1,15 +0,0 @@ -API Reference -============= - -This page contains auto-generated API reference documentation [#f1]_. - -.. toctree:: - :titlesonly: - - {% for page in pages %} - {% if page.top_level_object and page.display %} - {{ page.include_path }} - {% endif %} - {% endfor %} - -.. [#f1] Created with `sphinx-autoapi `_ diff --git a/docs/source/_templates/autoapi/python/attribute.rst b/docs/source/_templates/autoapi/python/attribute.rst deleted file mode 100644 index ebaba555ad..0000000000 --- a/docs/source/_templates/autoapi/python/attribute.rst +++ /dev/null @@ -1 +0,0 @@ -{% extends "python/data.rst" %} diff --git a/docs/source/_templates/autoapi/python/class.rst b/docs/source/_templates/autoapi/python/class.rst deleted file mode 100644 index df5edffb62..0000000000 --- a/docs/source/_templates/autoapi/python/class.rst +++ /dev/null @@ -1,58 +0,0 @@ -{% if obj.display %} -.. py:{{ obj.type }}:: {{ obj.short_name }}{% if obj.args %}({{ obj.args }}){% endif %} -{% for (args, return_annotation) in obj.overloads %} - {{ " " * (obj.type | length) }} {{ obj.short_name }}{% if args %}({{ args }}){% endif %} -{% endfor %} - - - {% if obj.bases %} - {% if "show-inheritance" in autoapi_options %} - Bases: {% for base in obj.bases %}{{ base|link_objs }}{% if not loop.last %}, {% endif %}{% endfor %} - {% endif %} - - - {% if "show-inheritance-diagram" in autoapi_options and obj.bases != ["object"] %} - .. autoapi-inheritance-diagram:: {{ obj.obj["full_name"] }} - :parts: 1 - {% if "private-members" in autoapi_options %} - :private-bases: - {% endif %} - - {% endif %} - {% endif %} - {% if obj.docstring %} - {{ obj.docstring|indent(3) }} - {% endif %} - {% if "inherited-members" in autoapi_options %} - {% set visible_classes = obj.classes|selectattr("display")|list %} - {% else %} - {% set visible_classes = obj.classes|rejectattr("inherited")|selectattr("display")|list %} - {% endif %} - {% for klass in visible_classes %} - {{ klass.render()|indent(3) }} - {% endfor %} - {% if "inherited-members" in autoapi_options %} - {% set visible_properties = obj.properties|selectattr("display")|list %} - {% else %} - {% set visible_properties = obj.properties|rejectattr("inherited")|selectattr("display")|list %} - {% endif %} - {% for property in visible_properties %} - {{ property.render()|indent(3) }} - {% endfor %} - {% if "inherited-members" in autoapi_options %} - {% set visible_attributes = obj.attributes|selectattr("display")|list %} - {% else %} - {% set visible_attributes = obj.attributes|rejectattr("inherited")|selectattr("display")|list %} - {% endif %} - {% for attribute in visible_attributes %} - {{ attribute.render()|indent(3) }} - {% endfor %} - {% if "inherited-members" in autoapi_options %} - {% set visible_methods = obj.methods|selectattr("display")|list %} - {% else %} - {% set visible_methods = obj.methods|rejectattr("inherited")|selectattr("display")|list %} - {% endif %} - {% for method in visible_methods %} - {{ method.render()|indent(3) }} - {% endfor %} -{% endif %} diff --git a/docs/source/_templates/autoapi/python/data.rst b/docs/source/_templates/autoapi/python/data.rst deleted file mode 100644 index 3d12b2d0c7..0000000000 --- a/docs/source/_templates/autoapi/python/data.rst +++ /dev/null @@ -1,37 +0,0 @@ -{% if obj.display %} -.. py:{{ obj.type }}:: {{ obj.name }} - {%- if obj.annotation is not none %} - - :type: {%- if obj.annotation %} {{ obj.annotation }}{%- endif %} - - {%- endif %} - - {%- if obj.value is not none %} - - :value: {% if obj.value is string and obj.value.splitlines()|count > 1 -%} - Multiline-String - - .. raw:: html - -
Show Value - - .. code-block:: python - - """{{ obj.value|indent(width=8,blank=true) }}""" - - .. raw:: html - -
- - {%- else -%} - {%- if obj.value is string -%} - {{ "%r" % obj.value|string|truncate(100) }} - {%- else -%} - {{ obj.value|string|truncate(100) }} - {%- endif -%} - {%- endif %} - {%- endif %} - - - {{ obj.docstring|indent(3) }} -{% endif %} diff --git a/docs/source/_templates/autoapi/python/exception.rst b/docs/source/_templates/autoapi/python/exception.rst deleted file mode 100644 index 92f3d38fd5..0000000000 --- a/docs/source/_templates/autoapi/python/exception.rst +++ /dev/null @@ -1 +0,0 @@ -{% extends "python/class.rst" %} diff --git a/docs/source/_templates/autoapi/python/function.rst b/docs/source/_templates/autoapi/python/function.rst deleted file mode 100644 index b00d5c2445..0000000000 --- a/docs/source/_templates/autoapi/python/function.rst +++ /dev/null @@ -1,15 +0,0 @@ -{% if obj.display %} -.. py:function:: {{ obj.short_name }}({{ obj.args }}){% if obj.return_annotation is not none %} -> {{ obj.return_annotation }}{% endif %} - -{% for (args, return_annotation) in obj.overloads %} - {{ obj.short_name }}({{ args }}){% if return_annotation is not none %} -> {{ return_annotation }}{% endif %} - -{% endfor %} - {% for property in obj.properties %} - :{{ property }}: - {% endfor %} - - {% if obj.docstring %} - {{ obj.docstring|indent(3) }} - {% endif %} -{% endif %} diff --git a/docs/source/_templates/autoapi/python/method.rst b/docs/source/_templates/autoapi/python/method.rst deleted file mode 100644 index 723cb7bbe5..0000000000 --- a/docs/source/_templates/autoapi/python/method.rst +++ /dev/null @@ -1,19 +0,0 @@ -{%- if obj.display %} -.. py:method:: {{ obj.short_name }}({{ obj.args }}){% if obj.return_annotation is not none %} -> {{ obj.return_annotation }}{% endif %} - -{% for (args, return_annotation) in obj.overloads %} - {{ obj.short_name }}({{ args }}){% if return_annotation is not none %} -> {{ return_annotation }}{% endif %} - -{% endfor %} - {% if obj.properties %} - {% for property in obj.properties %} - :{{ property }}: - {% endfor %} - - {% else %} - - {% endif %} - {% if obj.docstring %} - {{ obj.docstring|indent(3) }} - {% endif %} -{% endif %} diff --git a/docs/source/_templates/autoapi/python/module.rst b/docs/source/_templates/autoapi/python/module.rst deleted file mode 100644 index d2714f6c9d..0000000000 --- a/docs/source/_templates/autoapi/python/module.rst +++ /dev/null @@ -1,114 +0,0 @@ -{% if not obj.display %} -:orphan: - -{% endif %} -:py:mod:`{{ obj.name }}` -=========={{ "=" * obj.name|length }} - -.. py:module:: {{ obj.name }} - -{% if obj.docstring %} -.. autoapi-nested-parse:: - - {{ obj.docstring|indent(3) }} - -{% endif %} - -{% block subpackages %} -{% set visible_subpackages = obj.subpackages|selectattr("display")|list %} -{% if visible_subpackages %} -Subpackages ------------ -.. toctree:: - :titlesonly: - :maxdepth: 3 - -{% for subpackage in visible_subpackages %} - {{ subpackage.short_name }}/index.rst -{% endfor %} - - -{% endif %} -{% endblock %} -{% block submodules %} -{% set visible_submodules = obj.submodules|selectattr("display")|list %} -{% if visible_submodules %} -Submodules ----------- -.. toctree:: - :titlesonly: - :maxdepth: 1 - -{% for submodule in visible_submodules %} - {{ submodule.short_name }}/index.rst -{% endfor %} - - -{% endif %} -{% endblock %} -{% block content %} -{% if obj.all is not none %} -{% set visible_children = obj.children|selectattr("short_name", "in", obj.all)|list %} -{% elif obj.type is equalto("package") %} -{% set visible_children = obj.children|selectattr("display")|list %} -{% else %} -{% set visible_children = obj.children|selectattr("display")|rejectattr("imported")|list %} -{% endif %} -{% if visible_children %} -{{ obj.type|title }} Contents -{{ "-" * obj.type|length }}--------- - -{% set visible_classes = visible_children|selectattr("type", "equalto", "class")|list %} -{% set visible_functions = visible_children|selectattr("type", "equalto", "function")|list %} -{% set visible_attributes = visible_children|selectattr("type", "equalto", "data")|list %} -{% if "show-module-summary" in autoapi_options and (visible_classes or visible_functions) %} -{% block classes scoped %} -{% if visible_classes %} -Classes -~~~~~~~ - -.. autoapisummary:: - -{% for klass in visible_classes %} - {{ klass.id }} -{% endfor %} - - -{% endif %} -{% endblock %} - -{% block functions scoped %} -{% if visible_functions %} -Functions -~~~~~~~~~ - -.. autoapisummary:: - -{% for function in visible_functions %} - {{ function.id }} -{% endfor %} - - -{% endif %} -{% endblock %} - -{% block attributes scoped %} -{% if visible_attributes %} -Attributes -~~~~~~~~~~ - -.. autoapisummary:: - -{% for attribute in visible_attributes %} - {{ attribute.id }} -{% endfor %} - - -{% endif %} -{% endblock %} -{% endif %} -{% for obj_item in visible_children %} -{{ obj_item.render()|indent(0) }} -{% endfor %} -{% endif %} -{% endblock %} diff --git a/docs/source/_templates/autoapi/python/package.rst b/docs/source/_templates/autoapi/python/package.rst deleted file mode 100644 index fb9a64965e..0000000000 --- a/docs/source/_templates/autoapi/python/package.rst +++ /dev/null @@ -1 +0,0 @@ -{% extends "python/module.rst" %} diff --git a/docs/source/_templates/autoapi/python/property.rst b/docs/source/_templates/autoapi/python/property.rst deleted file mode 100644 index 70af24236f..0000000000 --- a/docs/source/_templates/autoapi/python/property.rst +++ /dev/null @@ -1,15 +0,0 @@ -{%- if obj.display %} -.. py:property:: {{ obj.short_name }} - {% if obj.annotation %} - :type: {{ obj.annotation }} - {% endif %} - {% if obj.properties %} - {% for property in obj.properties %} - :{{ property }}: - {% endfor %} - {% endif %} - - {% if obj.docstring %} - {{ obj.docstring|indent(3) }} - {% endif %} -{% endif %} diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 916a397e8e..0000000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,261 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys - -import os -import sys -import revitron_sphinx_theme - -openpype_root = os.path.abspath('../..') -sys.path.insert(0, openpype_root) -# app = QApplication([]) - -""" -repos = os.listdir(os.path.abspath("../../repos")) -repos = [os.path.join(openpype_root, "repos", repo) for repo in repos] -for repo in repos: - sys.path.append(repo) -""" - -todo_include_todos = True -autodoc_mock_imports = ["maya", "pymel", "nuke", "nukestudio", "nukescripts", - "hiero", "bpy", "fusion", "houdini", "hou", "unreal", - "__builtin__", "resolve", "pysync", "DaVinciResolveScript"] - -# -- Project information ----------------------------------------------------- - -project = 'OpenPype' -copyright = '2023 Ynput' -author = 'Ynput' - -# The short X.Y version -version = '' -# The full version, including alpha/beta/rc tags -release = '' - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.napoleon', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.mathjax', - 'sphinx.ext.autosummary', - 'revitron_sphinx_theme', - 'autoapi.extension', - 'myst_parser' -] - -############################## -# Autoapi settings -############################## - -autoapi_dirs = ['../../openpype', '../../igniter'] - -# bypass modules with a lot of python2 content for now -autoapi_ignore = [ - "*vendor*", - "*schemas*", - "*startup/*", - "*/website*", - "*openpype/hooks*", - "*openpype/style*", - "openpype/tests*", - # to many levels of relative import: - "*/modules/sync_server/*" -] -autoapi_keep_files = True -autoapi_options = [ - 'members', - 'undoc-members', - 'show-inheritance', - 'show-module-summary' -] -autoapi_add_toctree_entry = True -autoapi_template_dir = '_templates/autoapi' - - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ['.rst', '.md'] - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = "English" - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [ - "openpype.hosts.resolve.*", - "openpype.tools.*" - ] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'friendly' - -# -- Options for autodoc ----------------------------------------------------- -autodoc_default_flags = ['members'] -autosummary_generate = True - - -# -- Options for HTML output ------------------------------------------------- - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'revitron_sphinx_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -html_theme_options = { - 'collapse_navigation': True, - 'sticky_navigation': True, - 'navigation_depth': 4, - 'includehidden': True, - 'titles_only': False, - 'github_url': '', -} -html_logo = '_static/AYON_tight_G.svg' - - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'pypedoc' - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'openpype.tex', 'OpenPype Documentation', - 'Ynput', 'manual'), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'openpype', 'OpenPype Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'OpenPype', 'OpenPype Documentation', - author, 'OpenPype', 'Pipeline for studios', - 'Miscellaneous'), -] - - -# -- Options for Epub output ------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -# -# epub_identifier = '' - -# A unique identification for the text. -# -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] - - -# -- Extension configuration ------------------------------------------------- - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'https://docs.python.org/3/': None -} - -myst_gfm_only = True diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index f703468fca..0000000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. openpype documentation master file, created by - sphinx-quickstart on Mon May 13 17:18:23 2019. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to OpenPype's API documentation! -======================================== - -.. toctree:: - - Readme - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/readme.rst b/docs/source/readme.rst deleted file mode 100644 index 138b88bba8..0000000000 --- a/docs/source/readme.rst +++ /dev/null @@ -1,6 +0,0 @@ -=============== -OpenPype Readme -=============== - -.. include:: ../../README.md - :parser: myst_parser.sphinx_ diff --git a/igniter/Poppins/OFL.txt b/igniter/Poppins/OFL.txt deleted file mode 100644 index 76df3b5656..0000000000 --- a/igniter/Poppins/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/igniter/Poppins/Poppins-Black.ttf b/igniter/Poppins/Poppins-Black.ttf deleted file mode 100644 index a9520b78ac..0000000000 Binary files a/igniter/Poppins/Poppins-Black.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-BlackItalic.ttf b/igniter/Poppins/Poppins-BlackItalic.ttf deleted file mode 100644 index ebfdd707e5..0000000000 Binary files a/igniter/Poppins/Poppins-BlackItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-Bold.ttf b/igniter/Poppins/Poppins-Bold.ttf deleted file mode 100644 index b94d47f3af..0000000000 Binary files a/igniter/Poppins/Poppins-Bold.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-BoldItalic.ttf b/igniter/Poppins/Poppins-BoldItalic.ttf deleted file mode 100644 index e2e64456c7..0000000000 Binary files a/igniter/Poppins/Poppins-BoldItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-ExtraBold.ttf b/igniter/Poppins/Poppins-ExtraBold.ttf deleted file mode 100644 index 8f008c3684..0000000000 Binary files a/igniter/Poppins/Poppins-ExtraBold.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-ExtraBoldItalic.ttf b/igniter/Poppins/Poppins-ExtraBoldItalic.ttf deleted file mode 100644 index b2a9bf557a..0000000000 Binary files a/igniter/Poppins/Poppins-ExtraBoldItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-ExtraLight.ttf b/igniter/Poppins/Poppins-ExtraLight.ttf deleted file mode 100644 index ee6238251f..0000000000 Binary files a/igniter/Poppins/Poppins-ExtraLight.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-ExtraLightItalic.ttf b/igniter/Poppins/Poppins-ExtraLightItalic.ttf deleted file mode 100644 index e392492abd..0000000000 Binary files a/igniter/Poppins/Poppins-ExtraLightItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-Italic.ttf b/igniter/Poppins/Poppins-Italic.ttf deleted file mode 100644 index 46203996d3..0000000000 Binary files a/igniter/Poppins/Poppins-Italic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-Light.ttf b/igniter/Poppins/Poppins-Light.ttf deleted file mode 100644 index 2ab022196b..0000000000 Binary files a/igniter/Poppins/Poppins-Light.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-LightItalic.ttf b/igniter/Poppins/Poppins-LightItalic.ttf deleted file mode 100644 index 6f9279daef..0000000000 Binary files a/igniter/Poppins/Poppins-LightItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-Medium.ttf b/igniter/Poppins/Poppins-Medium.ttf deleted file mode 100644 index e90e87ed69..0000000000 Binary files a/igniter/Poppins/Poppins-Medium.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-MediumItalic.ttf b/igniter/Poppins/Poppins-MediumItalic.ttf deleted file mode 100644 index d8a251c7c4..0000000000 Binary files a/igniter/Poppins/Poppins-MediumItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-Regular.ttf b/igniter/Poppins/Poppins-Regular.ttf deleted file mode 100644 index be06e7fdca..0000000000 Binary files a/igniter/Poppins/Poppins-Regular.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-SemiBold.ttf b/igniter/Poppins/Poppins-SemiBold.ttf deleted file mode 100644 index dabf7c242e..0000000000 Binary files a/igniter/Poppins/Poppins-SemiBold.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-SemiBoldItalic.ttf b/igniter/Poppins/Poppins-SemiBoldItalic.ttf deleted file mode 100644 index 29d5f7419b..0000000000 Binary files a/igniter/Poppins/Poppins-SemiBoldItalic.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-Thin.ttf b/igniter/Poppins/Poppins-Thin.ttf deleted file mode 100644 index f5c0fdd531..0000000000 Binary files a/igniter/Poppins/Poppins-Thin.ttf and /dev/null differ diff --git a/igniter/Poppins/Poppins-ThinItalic.ttf b/igniter/Poppins/Poppins-ThinItalic.ttf deleted file mode 100644 index b910089316..0000000000 Binary files a/igniter/Poppins/Poppins-ThinItalic.ttf and /dev/null differ diff --git a/igniter/RobotoMono-Regular.ttf b/igniter/RobotoMono-Regular.ttf deleted file mode 100644 index 7c4ce36a44..0000000000 Binary files a/igniter/RobotoMono-Regular.ttf and /dev/null differ diff --git a/igniter/__init__.py b/igniter/__init__.py deleted file mode 100644 index 085a825860..0000000000 --- a/igniter/__init__.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -"""Open install dialog.""" - -import os -import sys - -os.chdir(os.path.dirname(__file__)) # for override sys.path in Deadline - -from .bootstrap_repos import ( - BootstrapRepos, - OpenPypeVersion -) -from .version import __version__ as version - -# Store OpenPypeVersion to 'sys.modules' -# - this makes it available in OpenPype processes without modifying -# 'sys.path' or 'PYTHONPATH' -if "OpenPypeVersion" not in sys.modules: - sys.modules["OpenPypeVersion"] = OpenPypeVersion - - -def _get_qt_app(): - from qtpy import QtWidgets, QtCore - - app = QtWidgets.QApplication.instance() - if app is not None: - return app - - for attr_name in ( - "AA_EnableHighDpiScaling", - "AA_UseHighDpiPixmaps", - ): - attr = getattr(QtCore.Qt, attr_name, None) - if attr is not None: - QtWidgets.QApplication.setAttribute(attr) - - policy = os.getenv("QT_SCALE_FACTOR_ROUNDING_POLICY") - if ( - hasattr(QtWidgets.QApplication, "setHighDpiScaleFactorRoundingPolicy") - and not policy - ): - QtWidgets.QApplication.setHighDpiScaleFactorRoundingPolicy( - QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough - ) - - return QtWidgets.QApplication(sys.argv) - - -def open_dialog(): - """Show Igniter dialog.""" - if os.getenv("OPENPYPE_HEADLESS_MODE"): - print("!!! Can't open dialog in headless mode. Exiting.") - sys.exit(1) - from .install_dialog import InstallDialog - - app = _get_qt_app() - - d = InstallDialog() - d.open() - - app.exec_() - return d.result() - - -def open_update_window(openpype_version): - """Open update window.""" - if os.getenv("OPENPYPE_HEADLESS_MODE"): - print("!!! Can't open dialog in headless mode. Exiting.") - sys.exit(1) - - from .update_window import UpdateWindow - - app = _get_qt_app() - - d = UpdateWindow(version=openpype_version) - d.open() - - app.exec_() - version_path = d.get_version_path() - return version_path - - -def show_message_dialog(title, message): - """Show dialog with a message and title to user.""" - if os.getenv("OPENPYPE_HEADLESS_MODE"): - print("!!! Can't open dialog in headless mode. Exiting.") - sys.exit(1) - - from .message_dialog import MessageDialog - - app = _get_qt_app() - - dialog = MessageDialog(title, message) - dialog.open() - - app.exec_() - - -__all__ = [ - "BootstrapRepos", - "open_dialog", - "open_update_window", - "show_message_dialog", - "version" -] diff --git a/igniter/__main__.py b/igniter/__main__.py deleted file mode 100644 index 9783b20f49..0000000000 --- a/igniter/__main__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -"""Open install dialog.""" - -import sys -from qtpy import QtWidgets - -from .install_dialog import InstallDialog - - -RESULT = 0 - - -def get_result(res: int): - """Sets result returned from dialog.""" - global RESULT - RESULT = res - - -app = QtWidgets.QApplication(sys.argv) - -d = InstallDialog() -d.finished.connect(get_result) -d.open() -app.exec() -sys.exit(RESULT) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py deleted file mode 100644 index e7b440f812..0000000000 --- a/igniter/bootstrap_repos.py +++ /dev/null @@ -1,1602 +0,0 @@ -# -*- coding: utf-8 -*- -"""Bootstrap OpenPype repositories.""" -from __future__ import annotations -import logging as log -import os -import re -import shutil -import sys -import tempfile -from pathlib import Path -from typing import Union, Callable, List, Tuple -import hashlib -import platform - -from zipfile import ZipFile, BadZipFile - -from appdirs import user_data_dir -from speedcopy import copyfile -import semver - -from .user_settings import ( - OpenPypeSecureRegistry, - OpenPypeSettingsRegistry -) -from .tools import ( - get_openpype_global_settings, - get_openpype_path_from_settings, - get_expected_studio_version_str, - get_local_openpype_path_from_settings -) - - -LOG_INFO = 0 -LOG_WARNING = 1 -LOG_ERROR = 3 - - -def sanitize_long_path(path): - """Sanitize long paths (260 characters) when on Windows. - - Long paths are not capatible with ZipFile or reading a file, so we can - shorten the path to use. - - Args: - path (str): path to either directory or file. - - Returns: - str: sanitized path - """ - if platform.system().lower() != "windows": - return path - path = os.path.abspath(path) - - if path.startswith("\\\\"): - path = "\\\\?\\UNC\\" + path[2:] - else: - path = "\\\\?\\" + path - return path - - -def sha256sum(filename): - """Calculate sha256 for content of the file. - - Args: - filename (str): Path to file. - - Returns: - str: hex encoded sha256 - - """ - h = hashlib.sha256() - b = bytearray(128 * 1024) - mv = memoryview(b) - with open(filename, 'rb', buffering=0) as f: - for n in iter(lambda: f.readinto(mv), 0): - h.update(mv[:n]) - return h.hexdigest() - - -class ZipFileLongPaths(ZipFile): - def _extract_member(self, member, targetpath, pwd): - return ZipFile._extract_member( - self, member, sanitize_long_path(targetpath), pwd - ) - - -class OpenPypeVersion(semver.VersionInfo): - """Class for storing information about OpenPype version. - - Attributes: - path (str): path to OpenPype - - """ - path = None - - _local_openpype_path = None - # this should match any string complying with https://semver.org/ - _VERSION_REGEX = re.compile(r"(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)(?:-(?P[a-zA-Z\d\-.]*))?(?:\+(?P[a-zA-Z\d\-.]*))?") # noqa: E501 - _installed_version = None - - def __init__(self, *args, **kwargs): - """Create OpenPype version. - - .. deprecated:: 3.0.0-rc.2 - `client` and `variant` are removed. - - - Args: - major (int): version when you make incompatible API changes. - minor (int): version when you add functionality in a - backwards-compatible manner. - patch (int): version when you make backwards-compatible bug fixes. - prerelease (str): an optional prerelease string - build (str): an optional build string - version (str): if set, it will be parsed and will override - parameters like `major`, `minor` and so on. - path (Path): path to version location. - - """ - self.path = None - - if "version" in kwargs.keys(): - if not kwargs.get("version"): - raise ValueError("Invalid version specified") - v = OpenPypeVersion.parse(kwargs.get("version")) - kwargs["major"] = v.major - kwargs["minor"] = v.minor - kwargs["patch"] = v.patch - kwargs["prerelease"] = v.prerelease - kwargs["build"] = v.build - kwargs.pop("version") - - if kwargs.get("path"): - if isinstance(kwargs.get("path"), str): - self.path = Path(kwargs.get("path")) - elif isinstance(kwargs.get("path"), Path): - self.path = kwargs.get("path") - else: - raise TypeError("Path must be str or Path") - kwargs.pop("path") - - if "path" in kwargs.keys(): - kwargs.pop("path") - - super().__init__(*args, **kwargs) - - def __repr__(self): - return f"<{self.__class__.__name__}: {str(self)} - path={self.path}>" - - def __lt__(self, other: OpenPypeVersion): - result = super().__lt__(other) - # prefer path over no path - if self == other and not self.path and other.path: - return True - - if self == other and self.path and other.path and \ - other.path.is_dir() and self.path.is_file(): - return True - - if self.finalize_version() == other.finalize_version() and \ - self.prerelease == other.prerelease: - return True - - return result - - def get_main_version(self) -> str: - """Return main version component. - - This returns x.x.x part of version from possibly more complex one - like x.x.x-foo-bar. - - .. deprecated:: 3.0.0-rc.2 - use `finalize_version()` instead. - Returns: - str: main version component - - """ - return str(self.finalize_version()) - - @staticmethod - def version_in_str(string: str) -> Union[None, OpenPypeVersion]: - """Find OpenPype version in given string. - - Args: - string (str): string to search. - - Returns: - OpenPypeVersion: of detected or None. - - """ - # strip .zip ext if present - string = re.sub(r"\.zip$", "", string, flags=re.IGNORECASE) - m = re.search(OpenPypeVersion._VERSION_REGEX, string) - if not m: - return None - version = OpenPypeVersion.parse(string[m.start():m.end()]) - return version - - def __hash__(self): - return hash(self.path) if self.path else hash(str(self)) - - @staticmethod - def is_version_in_dir( - dir_item: Path, version: OpenPypeVersion) -> Tuple[bool, str]: - """Test if path item is OpenPype version matching detected version. - - If item is directory that might (based on it's name) - contain OpenPype version, check if it really does contain - OpenPype and that their versions matches. - - Args: - dir_item (Path): Directory to test. - version (OpenPypeVersion): OpenPype version detected - from name. - - Returns: - Tuple: State and reason, True if it is valid OpenPype version, - False otherwise. - - """ - try: - # add one 'openpype' level as inside dir there should - # be many other repositories. - version_str = OpenPypeVersion.get_version_string_from_directory( - dir_item) # noqa: E501 - version_check = OpenPypeVersion(version=version_str) - except ValueError: - return False, f"cannot determine version from {dir_item}" - - version_main = version_check.get_main_version() - detected_main = version.get_main_version() - if version_main != detected_main: - return False, (f"dir version ({version}) and " - f"its content version ({version_check}) " - "doesn't match. Skipping.") - return True, "Versions match" - - @staticmethod - def is_version_in_zip( - zip_item: Path, version: OpenPypeVersion) -> Tuple[bool, str]: - """Test if zip path is OpenPype version matching detected version. - - Open zip file, look inside and parse version from OpenPype - inside it. If there is none, or it is different from - version specified in file name, skip it. - - Args: - zip_item (Path): Zip file to test. - version (OpenPypeVersion): Pype version detected - from name. - - Returns: - Tuple: State and reason, True if it is valid OpenPype version, - False otherwise. - - """ - # skip non-zip files - if zip_item.suffix.lower() != ".zip": - return False, "Not a zip" - - try: - with ZipFile(zip_item, "r") as zip_file: - with zip_file.open( - "openpype/version.py") as version_file: - zip_version = {} - exec(version_file.read(), zip_version) - try: - version_check = OpenPypeVersion( - version=zip_version["__version__"]) - except ValueError as e: - return False, str(e) - - version_main = version_check.get_main_version() # - # noqa: E501 - detected_main = version.get_main_version() - # noqa: E501 - - if version_main != detected_main: - return False, (f"zip version ({version}) " - f"and its content version " - f"({version_check}) " - "doesn't match. Skipping.") - except BadZipFile: - return False, f"{zip_item} is not a zip file" - except KeyError: - return False, "Zip does not contain OpenPype" - return True, "Versions match" - - @staticmethod - def get_version_string_from_directory(repo_dir: Path) -> Union[str, None]: - """Get version of OpenPype in given directory. - - Note: in frozen OpenPype installed in user data dir, this must point - one level deeper as it is: - `openpype-version-v3.0.0/openpype/version.py` - - Args: - repo_dir (Path): Path to OpenPype repo. - - Returns: - str: version string. - None: if OpenPype is not found. - - """ - # try to find version - version_file = Path(repo_dir) / "openpype" / "version.py" - if not version_file.exists(): - return None - - version = {} - with version_file.open("r") as fp: - exec(fp.read(), version) - - return version['__version__'] - - @classmethod - def get_openpype_path(cls): - """Path to openpype zip directory. - - Path can be set through environment variable 'OPENPYPE_PATH' which - is set during start of OpenPype if is not available. - """ - return os.getenv("OPENPYPE_PATH") - - @classmethod - def get_local_openpype_path(cls): - """Path to unzipped versions. - - By default it should be user appdata, but could be overridden by - settings. - """ - if cls._local_openpype_path: - return cls._local_openpype_path - - settings = get_openpype_global_settings(os.environ["OPENPYPE_MONGO"]) - data_dir = get_local_openpype_path_from_settings(settings) - if not data_dir: - data_dir = Path(user_data_dir("openpype", "pypeclub")) - cls._local_openpype_path = data_dir - return data_dir - - @classmethod - def openpype_path_is_set(cls): - """Path to OpenPype zip directory is set.""" - if cls.get_openpype_path(): - return True - return False - - @classmethod - def openpype_path_is_accessible(cls): - """Path to OpenPype zip directory is accessible. - - Exists for this machine. - """ - # First check if is set - if not cls.openpype_path_is_set(): - return False - - # Validate existence - if Path(cls.get_openpype_path()).exists(): - return True - return False - - @classmethod - def get_local_versions(cls) -> List: - """Get all versions available on this machine. - - Returns: - list: of compatible versions available on the machine. - - """ - dir_to_search = cls.get_local_openpype_path() - versions = cls.get_versions_from_directory(dir_to_search) - - return list(sorted(set(versions))) - - @classmethod - def get_remote_versions(cls) -> List: - """Get all versions available in OpenPype Path. - - Returns: - list of OpenPypeVersions: Versions found in OpenPype path. - - """ - # Return all local versions if arguments are set to None - - dir_to_search = None - if cls.openpype_path_is_accessible(): - dir_to_search = Path(cls.get_openpype_path()) - else: - registry = OpenPypeSettingsRegistry() - try: - registry_dir = Path(str(registry.get_item("openPypePath"))) - if registry_dir.exists(): - dir_to_search = registry_dir - - except ValueError: - # nothing found in registry, we'll use data dir - pass - - if not dir_to_search: - return [] - - versions = cls.get_versions_from_directory(dir_to_search) - - return list(sorted(set(versions))) - - @staticmethod - def get_versions_from_directory( - openpype_dir: Path) -> List: - """Get all detected OpenPype versions in directory. - - Args: - openpype_dir (Path): Directory to scan. - - Returns: - list of OpenPypeVersion - - Throws: - ValueError: if invalid path is specified. - - """ - openpype_versions = [] - if not openpype_dir.exists() and not openpype_dir.is_dir(): - return openpype_versions - - # iterate over directory in first level and find all that might - # contain OpenPype. - for item in openpype_dir.iterdir(): - # if the item is directory with major.minor version, dive deeper - - if item.is_dir() and re.match(r"^\d+\.\d+$", item.name): - _versions = OpenPypeVersion.get_versions_from_directory( - item) - if _versions: - openpype_versions += _versions - - # if file exists, strip extension, in case of dir don't. - name = item.name if item.is_dir() else item.stem - result = OpenPypeVersion.version_in_str(name) - - if result: - detected_version: OpenPypeVersion - detected_version = result - - if item.is_dir() and not OpenPypeVersion.is_version_in_dir( - item, detected_version - )[0]: - continue - - if item.is_file() and not OpenPypeVersion.is_version_in_zip( - item, detected_version - )[0]: - continue - - detected_version.path = item - openpype_versions.append(detected_version) - - return sorted(openpype_versions) - - @staticmethod - def get_installed_version_str() -> str: - """Get version of local OpenPype.""" - - version = {} - path = Path(os.environ["OPENPYPE_ROOT"]) / "openpype" / "version.py" - with open(path, "r") as fp: - exec(fp.read(), version) - return version["__version__"] - - @classmethod - def get_installed_version(cls): - """Get version of OpenPype inside build.""" - if cls._installed_version is None: - installed_version_str = cls.get_installed_version_str() - if installed_version_str: - cls._installed_version = OpenPypeVersion( - version=installed_version_str, - path=Path(os.environ["OPENPYPE_ROOT"]) - ) - return cls._installed_version - - @staticmethod - def get_latest_version( - local: bool = None, - remote: bool = None - ) -> Union[OpenPypeVersion, None]: - """Get the latest available version. - - The version does not contain information about path and source. - - This is utility version to get the latest version from all found. - - Arguments 'local' and 'remote' define if local and remote repository - versions are used. All versions are used if both are not set (or set - to 'None'). If only one of them is set to 'True' the other is disabled. - It is possible to set both to 'True' (same as both set to None) and to - 'False' in that case only build version can be used. - - Args: - local (bool, optional): List local versions if True. - remote (bool, optional): List remote versions if True. - - Returns: - Latest OpenPypeVersion or None - - """ - if local is None and remote is None: - local = True - remote = True - - elif local is None and not remote: - local = True - - elif remote is None and not local: - remote = True - - installed_version = OpenPypeVersion.get_installed_version() - local_versions = OpenPypeVersion.get_local_versions() if local else [] - remote_versions = OpenPypeVersion.get_remote_versions() if remote else [] # noqa: E501 - all_versions = local_versions + remote_versions + [installed_version] - - all_versions.sort() - return all_versions[-1] - - @classmethod - def get_expected_studio_version(cls, staging=False, global_settings=None): - """Expected OpenPype version that should be used at the moment. - - If version is not defined in settings the latest found version is - used. - - Using precached global settings is needed for usage inside OpenPype. - - Args: - staging (bool): Staging version or production version. - global_settings (dict): Optional precached global settings. - - Returns: - OpenPypeVersion: Version that should be used. - """ - result = get_expected_studio_version_str(staging, global_settings) - if not result: - return None - return OpenPypeVersion(version=result) - - def is_compatible(self, version: OpenPypeVersion): - """Test build compatibility. - - This will simply compare major and minor versions (ignoring patch - and the rest). - - Args: - version (OpenPypeVersion): Version to check compatibility with. - - Returns: - bool: if the version is compatible - - """ - return self.major == version.major and self.minor == version.minor - - -class BootstrapRepos: - """Class for bootstrapping local OpenPype installation. - - Attributes: - data_dir (Path): local OpenPype installation directory. - registry (OpenPypeSettingsRegistry): OpenPype registry object. - zip_filter (list): List of files to exclude from zip - openpype_filter (list): list of top level directories to - include in zip in OpenPype repository. - - """ - - def __init__(self, progress_callback: Callable = None, message=None): - """Constructor. - - Args: - progress_callback (callable): Optional callback method to report - progress. - message (QtCore.Signal, optional): Signal to report messages back. - - """ - # vendor and app used to construct user data dir - self._message = message - self._log = log.getLogger(str(__class__)) - self.set_data_dir(None) - self.secure_registry = OpenPypeSecureRegistry("mongodb") - self.registry = OpenPypeSettingsRegistry() - self.zip_filter = [".pyc", "__pycache__"] - self.openpype_filter = [ - "openpype", "LICENSE" - ] - - # dummy progress reporter - def empty_progress(x: int): - """Progress callback dummy.""" - return x - - if not progress_callback: - progress_callback = empty_progress - self._progress_callback = progress_callback - - def set_data_dir(self, data_dir): - if not data_dir: - self.data_dir = Path(user_data_dir("openpype", "pypeclub")) - else: - self._print(f"overriding local folder: {data_dir}") - self.data_dir = data_dir - - @staticmethod - def get_version_path_from_list( - version: str, version_list: list) -> Union[Path, None]: - """Get path for specific version in list of OpenPype versions. - - Args: - version (str): Version string to look for (1.2.4-nightly.1+test) - version_list (list of OpenPypeVersion): list of version to search. - - Returns: - Path: Path to given version. - - """ - for v in version_list: - if str(v) == version: - return v.path - return None - - @staticmethod - def get_version(repo_dir: Path) -> Union[str, None]: - """Get version of OpenPype in given directory. - - Note: in frozen OpenPype installed in user data dir, this must point - one level deeper as it is: - `openpype-version-v3.0.0/openpype/version.py` - - Args: - repo_dir (Path): Path to OpenPype repo. - - Returns: - str: version string. - None: if OpenPype is not found. - - """ - # try to find version - version_file = Path(repo_dir) / "openpype" / "version.py" - if not version_file.exists(): - return None - - version = {} - with version_file.open("r") as fp: - exec(fp.read(), version) - - return version['__version__'] - - def create_version_from_live_code( - self, repo_dir: Path = None) -> Union[OpenPypeVersion, None]: - """Copy zip created from OpenPype repositories to user data dir. - - This detects OpenPype version either in local "live" OpenPype - repository or in user provided path. Then it will zip it in temporary - directory, and finally it will move it to destination which is user - data directory. Existing files will be replaced. - - Args: - repo_dir (Path, optional): Path to OpenPype repository. - - Returns: - Path: path of installed repository file. - - """ - # if repo dir is not set, we detect local "live" OpenPype repository - # version and use it as a source. Otherwise, repo_dir is user - # entered location. - if repo_dir: - version = self.get_version(repo_dir) - else: - installed_version = OpenPypeVersion.get_installed_version() - version = str(installed_version) - repo_dir = installed_version.path - - if not version: - self._print("OpenPype not found.", LOG_ERROR) - return - - # create destination directory - destination = self.data_dir / f"{installed_version.major}.{installed_version.minor}" # noqa - if not destination.exists(): - destination.mkdir(parents=True) - - # create zip inside temporary directory. - with tempfile.TemporaryDirectory() as temp_dir: - temp_zip = \ - Path(temp_dir) / f"openpype-v{version}.zip" - self._print(f"creating zip: {temp_zip}") - - self._create_openpype_zip(temp_zip, repo_dir) - if not os.path.exists(temp_zip): - self._print("make archive failed.", LOG_ERROR) - return None - - destination = self._move_zip_to_data_dir(temp_zip) - - return OpenPypeVersion(version=version, path=Path(destination)) - - def _move_zip_to_data_dir(self, zip_file) -> Union[None, Path]: - """Move zip with OpenPype version to user data directory. - - Args: - zip_file (Path): Path to zip file. - - Returns: - None if move fails. - Path to moved zip on success. - - """ - version = OpenPypeVersion.version_in_str(zip_file.name) - destination_dir = self.data_dir / f"{version.major}.{version.minor}" - if not destination_dir.exists(): - destination_dir.mkdir(parents=True) - destination = destination_dir / zip_file.name - - if destination.exists(): - self._print( - f"Destination file {destination} exists, removing.", - LOG_WARNING) - try: - destination.unlink() - except Exception as e: - self._print(str(e), LOG_ERROR, exc_info=True) - return None - if not destination_dir.exists(): - destination_dir.mkdir(parents=True) - elif not destination_dir.is_dir(): - self._print( - "Destination exists but is not directory.", LOG_ERROR) - return None - - try: - shutil.move(zip_file.as_posix(), destination_dir.as_posix()) - except shutil.Error as e: - self._print(str(e), LOG_ERROR, exc_info=True) - return None - - return destination - - def _filter_dir(self, path: Path, path_filter: List) -> List[Path]: - """Recursively crawl over path and filter.""" - result = [] - for item in path.iterdir(): - if item.name in path_filter: - continue - if item.name.startswith('.'): - continue - if item.is_dir(): - result.extend(self._filter_dir(item, path_filter)) - else: - result.append(item) - return result - - def create_version_from_frozen_code(self) -> Union[None, OpenPypeVersion]: - """Create OpenPype version from *frozen* code distributed by installer. - - This should be real edge case for those wanting to try out OpenPype - without setting up whole infrastructure but is strongly discouraged - in studio setup as this use local version independent of others - that can be out of date. - - Returns: - :class:`OpenPypeVersion` zip file to be installed. - - """ - frozen_root = Path(sys.executable).parent - - openpype_list = [] - for f in self.openpype_filter: - if (frozen_root / f).is_dir(): - openpype_list += self._filter_dir( - frozen_root / f, self.zip_filter) - else: - openpype_list.append(frozen_root / f) - - version = self.get_version(frozen_root) - - # create zip inside temporary directory. - with tempfile.TemporaryDirectory() as temp_dir: - temp_zip = \ - Path(temp_dir) / f"openpype-v{version}.zip" - self._print(f"creating zip: {temp_zip}") - - with ZipFile(temp_zip, "w") as zip_file: - progress = 0 - openpype_inc = 98.0 / float(len(openpype_list)) - file: Path - for file in openpype_list: - progress += openpype_inc - self._progress_callback(int(progress)) - - arc_name = file.relative_to(frozen_root.parent) - # we need to replace first part of path which starts with - # something like `exe.win/linux....` with `openpype` as - # this is expected by OpenPype in zip archive. - arc_name = Path().joinpath(*arc_name.parts[1:]) - zip_file.write(file, arc_name) - - destination = self._move_zip_to_data_dir(temp_zip) - - return OpenPypeVersion(version=version, path=destination) - - def _create_openpype_zip(self, zip_path: Path, openpype_path: Path) -> None: - """Pack repositories and OpenPype into zip. - - We are using :mod:`ZipFile` instead :meth:`shutil.make_archive` - because we need to decide what file and directories to include in zip - and what not. They are determined by :attr:`zip_filter` on file level - and :attr:`openpype_filter` on top level directory in OpenPype - repository. - - Args: - zip_path (Path): Path to zip file. - openpype_path (Path): Path to OpenPype sources. - - """ - # get filtered list of file in Pype repository - # openpype_list = self._filter_dir(openpype_path, self.zip_filter) - openpype_list = [] - for f in self.openpype_filter: - if (openpype_path / f).is_dir(): - openpype_list += self._filter_dir( - openpype_path / f, self.zip_filter) - else: - openpype_list.append(openpype_path / f) - - openpype_files = len(openpype_list) - - openpype_inc = 98.0 / float(openpype_files) - - with ZipFile(zip_path, "w") as zip_file: - progress = 0 - openpype_root = openpype_path.resolve() - # generate list of filtered paths - dir_filter = [openpype_root / f for f in self.openpype_filter] - checksums = [] - - file: Path - for file in openpype_list: - progress += openpype_inc - self._progress_callback(int(progress)) - - # if file resides in filtered path, skip it - is_inside = None - df: Path - for df in dir_filter: - try: - is_inside = file.resolve().relative_to(df) - except ValueError: - pass - - if not is_inside: - continue - - processed_path = file - self._print(f"- processing {processed_path}") - - checksums.append( - ( - sha256sum(sanitize_long_path(file.as_posix())), - file.resolve().relative_to(openpype_root) - ) - ) - zip_file.write( - file, file.resolve().relative_to(openpype_root)) - - checksums_str = "" - for c in checksums: - file_str = c[1] - if platform.system().lower() == "windows": - file_str = c[1].as_posix().replace("\\", "/") - checksums_str += "{}:{}\n".format(c[0], file_str) - zip_file.writestr("checksums", checksums_str) - # test if zip is ok - zip_file.testzip() - self._progress_callback(100) - - def validate_openpype_version(self, path: Path) -> tuple: - """Validate version directory or zip file. - - This will load `checksums` file if present, calculate checksums - of existing files in given path and compare. It will also compare - lists of files together for missing files. - - Args: - path (Path): Path to OpenPype version to validate. - - Returns: - tuple(bool, str): with version validity as first item - and string with reason as second. - - """ - if os.getenv("OPENPYPE_DONT_VALIDATE_VERSION"): - return True, "Disabled validation" - if not path.exists(): - return False, "Path doesn't exist" - - if path.is_file(): - return self._validate_zip(path) - return self._validate_dir(path) - - @staticmethod - def _validate_zip(path: Path) -> tuple: - """Validate content of zip file.""" - with ZipFile(path, "r") as zip_file: - # read checksums - try: - checksums_data = str(zip_file.read("checksums")) - except IOError: - # FIXME: This should be set to False sometimes in the future - return True, "Cannot read checksums for archive." - - # split it to the list of tuples - checksums = [ - tuple(line.split(":")) - for line in checksums_data.split("\n") if line - ] - - # get list of files in zip minus `checksums` file itself - # and turn in to set to compare against list of files - # from checksum file. If difference exists, something is - # wrong - files_in_zip = set(zip_file.namelist()) - files_in_zip.remove("checksums") - files_in_checksum = {file[1] for file in checksums} - diff = files_in_zip.difference(files_in_checksum) - if diff: - return False, f"Missing files {diff}" - - # calculate and compare checksums in the zip file - for file_checksum, file_name in checksums: - if platform.system().lower() == "windows": - file_name = file_name.replace("/", "\\") - h = hashlib.sha256() - try: - h.update(zip_file.read(file_name)) - except FileNotFoundError: - return False, f"Missing file [ {file_name} ]" - if h.hexdigest() != file_checksum: - return False, f"Invalid checksum on {file_name}" - - return True, "All ok" - - @staticmethod - def _validate_dir(path: Path) -> tuple: - """Validate checksums in a given path. - - Args: - path (Path): path to folder to validate. - - Returns: - tuple(bool, str): returns status and reason as a bool - and str in a tuple. - - """ - checksums_file = Path(path / "checksums") - if not checksums_file.exists(): - # FIXME: This should be set to False sometimes in the future - return True, "Cannot read checksums for archive." - checksums_data = checksums_file.read_text() - checksums = [ - tuple(line.split(":")) - for line in checksums_data.split("\n") if line - ] - - # compare file list against list of files from checksum file. - # If difference exists, something is wrong and we invalidate directly - files_in_dir = set( - file.relative_to(path).as_posix() - for file in path.iterdir() if file.is_file() - ) - files_in_dir.remove("checksums") - files_in_checksum = {file[1] for file in checksums} - - diff = files_in_dir.difference(files_in_checksum) - if diff: - return False, f"Missing files {diff}" - - # calculate and compare checksums - for file_checksum, file_name in checksums: - if platform.system().lower() == "windows": - file_name = file_name.replace("/", "\\") - try: - current = sha256sum( - sanitize_long_path((path / file_name).as_posix()) - ) - except FileNotFoundError: - return False, f"Missing file [ {file_name} ]" - - if file_checksum != current: - return False, f"Invalid checksum on {file_name}" - - return True, "All ok" - - @staticmethod - def add_paths_from_archive(archive: Path) -> None: - """Add first-level directory and 'repos' as paths to :mod:`sys.path`. - - This will enable Python to import OpenPype and modules in `repos` - submodule directory in zip file. - - Adding to both `sys.path` and `PYTHONPATH`, skipping duplicates. - - Args: - archive (Path): path to archive. - - .. deprecated:: 3.0 - we don't use zip archives directly - - """ - if not archive.is_file() and not archive.exists(): - raise ValueError("Archive is not file.") - - archive_path = str(archive) - sys.path.insert(0, archive_path) - pythonpath = os.getenv("PYTHONPATH", "") - python_paths = pythonpath.split(os.pathsep) - python_paths.insert(0, archive_path) - - os.environ["PYTHONPATH"] = os.pathsep.join(python_paths) - - @staticmethod - def add_paths_from_directory(directory: Path) -> None: - """Add repos first level directories as paths to :mod:`sys.path`. - - This works the same as :meth:`add_paths_from_archive` but in - specified directory. - - Adding to both `sys.path` and `PYTHONPATH`, skipping duplicates. - - Args: - directory (Path): path to directory. - - """ - - sys.path.insert(0, directory.as_posix()) - - @staticmethod - def find_openpype_version( - version: Union[str, OpenPypeVersion] - ) -> Union[OpenPypeVersion, None]: - """Find location of specified OpenPype version. - - Args: - version (Union[str, OpenPypeVersion): Version to find. - - Returns: - requested OpenPypeVersion. - - """ - installed_version = OpenPypeVersion.get_installed_version() - if isinstance(version, str): - version = OpenPypeVersion(version=version) - - if installed_version == version: - return installed_version - - local_versions = OpenPypeVersion.get_local_versions() - zip_version = None - for local_version in local_versions: - if local_version == version: - if local_version.path.suffix.lower() == ".zip": - zip_version = local_version - else: - return local_version - - if zip_version is not None: - return zip_version - - remote_versions = OpenPypeVersion.get_remote_versions() - return next( - ( - remote_version for remote_version in remote_versions - if remote_version == version - ), None) - - @staticmethod - def find_latest_openpype_version() -> Union[OpenPypeVersion, None]: - """Find the latest available OpenPype version in all location. - - Returns: - Latest OpenPype version on None if nothing was found. - - """ - installed_version = OpenPypeVersion.get_installed_version() - local_versions = OpenPypeVersion.get_local_versions() - remote_versions = OpenPypeVersion.get_remote_versions() - all_versions = local_versions + remote_versions + [installed_version] - - if not all_versions: - return None - - all_versions.sort() - latest_version = all_versions[-1] - if latest_version == installed_version: - return latest_version - - if not latest_version.path.is_dir(): - for version in local_versions: - if version == latest_version and version.path.is_dir(): - latest_version = version - break - return latest_version - - def find_openpype( - self, - openpype_path: Union[Path, str] = None, - include_zips: bool = False - ) -> Union[List[OpenPypeVersion], None]: - """Get ordered dict of detected OpenPype version. - - Resolution order for OpenPype is following: - - 1) First we test for ``OPENPYPE_PATH`` environment variable - 2) We try to find ``openPypePath`` in registry setting - 3) We use user data directory - - Args: - openpype_path (Path or str, optional): Try to find OpenPype on - the given path or url. - include_zips (bool, optional): If set True it will try to find - OpenPype in zip files in given directory. - - Returns: - dict of Path: Dictionary of detected OpenPype version. - Key is version, value is path to zip file. - - None: if OpenPype is not found. - - Todo: - implement git/url support as OpenPype location, so it would be - possible to enter git url, OpenPype would check it out and if it is - ok install it as normal version. - - """ - if openpype_path and not isinstance(openpype_path, Path): - raise NotImplementedError( - ("Finding OpenPype in non-filesystem locations is" - " not implemented yet.")) - - # if checks bellow for OPENPYPE_PATH and registry fails, use data_dir - # DEPRECATED: lookup in root of this folder is deprecated in favour - # of major.minor sub-folders. - dirs_to_search = [self.data_dir] - - if openpype_path: - dirs_to_search = [openpype_path] - elif os.getenv("OPENPYPE_PATH") \ - and Path(os.getenv("OPENPYPE_PATH")).exists(): - # first try OPENPYPE_PATH and if that is not available, - # try registry. - dirs_to_search = [Path(os.getenv("OPENPYPE_PATH"))] - else: - try: - registry_dir = Path( - str(self.registry.get_item("openPypePath"))) - if registry_dir.exists(): - dirs_to_search = [registry_dir] - - except ValueError: - # nothing found in registry, we'll use data dir - pass - - openpype_versions = [] - for dir_to_search in dirs_to_search: - try: - openpype_versions += self.get_openpype_versions( - dir_to_search) - except ValueError: - # location is invalid, skip it - pass - - if not include_zips: - openpype_versions = [ - v for v in openpype_versions if v.path.suffix != ".zip" - ] - - # remove duplicates - openpype_versions = sorted(list(set(openpype_versions))) - - return openpype_versions - - def process_entered_location(self, location: str) -> Union[Path, None]: - """Process user entered location string. - - It decides if location string is mongodb url or path. - If it is mongodb url, it will connect and load ``OPENPYPE_PATH`` from - there and use it as path to OpenPype. In it is _not_ mongodb url, it - is assumed we have a path, this is tested and zip file is - produced and installed using :meth:`create_version_from_live_code`. - - Args: - location (str): User entered location. - - Returns: - Path: to OpenPype zip produced from this location. - None: Zipping failed. - - """ - openpype_path = None - # try to get OpenPype path from mongo. - if location.startswith("mongodb"): - global_settings = get_openpype_global_settings(location) - openpype_path = get_openpype_path_from_settings(global_settings) - if not openpype_path: - self._print("cannot find OPENPYPE_PATH in settings.") - return None - - # if not successful, consider location to be fs path. - if not openpype_path: - openpype_path = Path(location) - - # test if this path does exist. - if not openpype_path.exists(): - self._print(f"{openpype_path} doesn't exists.") - return None - - # test if entered path isn't user data dir - if self.data_dir == openpype_path: - self._print("cannot point to user data dir", LOG_ERROR) - return None - - # find openpype zip files in location. There can be - # either "live" OpenPype repository, or multiple zip files or even - # multiple OpenPype version directories. This process looks into zip - # files and directories and tries to parse `version.py` file. - versions = self.find_openpype(openpype_path, include_zips=True) - if versions: - self._print(f"found OpenPype in [ {openpype_path} ]") - self._print(f"latest version found is [ {versions[-1]} ]") - - return self.install_version(versions[-1]) - - # if we got here, it means that location is "live" - # OpenPype repository. We'll create zip from it and move it to user - # data dir. - live_openpype = self.create_version_from_live_code(openpype_path) - if not live_openpype.path.exists(): - self._print(f"installing zip {live_openpype} failed.", LOG_ERROR) - return None - # install it - return self.install_version(live_openpype) - - def _print(self, - message: str, - level: int = LOG_INFO, - exc_info: bool = False): - """Helper function passing logs to UI and to logger. - - Supporting 3 levels of logs defined with `LOG_INFO`, `LOG_WARNING` and - `LOG_ERROR` constants. - - Args: - message (str): Message to log. - level (int, optional): Log level to use. - exc_info (bool, optional): Exception info object to pass to logger. - - """ - if self._message: - self._message.emit(message, level == LOG_ERROR) - - if level == LOG_WARNING: - self._log.warning(message, exc_info=exc_info) - return - if level == LOG_ERROR: - self._log.error(message, exc_info=exc_info) - return - self._log.info(message, exc_info=exc_info) - - def extract_openpype(self, version: OpenPypeVersion) -> Union[Path, None]: - """Extract zipped OpenPype version to user data directory. - - Args: - version (OpenPypeVersion): Version of OpenPype. - - Returns: - Path: path to extracted version. - None: if something failed. - - """ - if not version.path: - raise ValueError( - f"version {version} is not associated with any file") - - destination = self.data_dir / f"{version.major}.{version.minor}" / version.path.stem # noqa - if destination.exists() and destination.is_dir(): - try: - shutil.rmtree(destination) - except OSError as e: - msg = f"!!! Cannot remove already existing {destination}" - self._print(msg, LOG_ERROR, exc_info=True) - raise e - - destination.mkdir(parents=True) - - # extract zip there - self._print("Extracting zip to destination ...") - with ZipFileLongPaths(version.path, "r") as zip_ref: - zip_ref.extractall(destination) - - self._print(f"Installed as {version.path.stem}") - - return destination - - def is_inside_user_data(self, path: Path) -> bool: - """Test if version is located in user data dir. - - Args: - path (Path) Path to test. - - Returns: - True if path is inside user data dir. - - """ - is_inside = False - try: - is_inside = path.resolve().relative_to( - self.data_dir) - except ValueError: - # if relative path cannot be calculated, OpenPype version is not - # inside user data dir - pass - return is_inside - - def install_version(self, - openpype_version: OpenPypeVersion, - force: bool = False) -> Path: - """Install OpenPype version to user data directory. - - Args: - openpype_version (OpenPypeVersion): OpenPype version to install. - force (bool, optional): Force overwrite existing version. - - Returns: - Path: Path to installed OpenPype. - - Raises: - OpenPypeVersionExists: If not forced and this version already exist - in user data directory. - OpenPypeVersionInvalid: If version to install is invalid. - OpenPypeVersionIOError: If copying or zipping fail. - - """ - if self.is_inside_user_data(openpype_version.path) and not openpype_version.path.is_file(): # noqa - raise OpenPypeVersionExists( - "OpenPype already inside user data dir") - - # determine destination directory name - # for zip file strip suffix, in case of dir use whole dir name - if openpype_version.path.is_dir(): - dir_name = openpype_version.path.name - else: - dir_name = openpype_version.path.stem - - destination = self.data_dir / f"{openpype_version.major}.{openpype_version.minor}" / dir_name # noqa - - # test if destination directory already exist, if so lets delete it. - if destination.exists() and force: - self._print("removing existing directory") - try: - shutil.rmtree(destination) - except OSError as e: - self._print( - f"cannot remove already existing {destination}", - LOG_ERROR, exc_info=True) - raise OpenPypeVersionIOError( - f"cannot remove existing {destination}") from e - elif destination.exists() and not force: - self._print("destination directory already exists") - raise OpenPypeVersionExists(f"{destination} already exist.") - else: - # create destination parent directories even if they don't exist. - destination.mkdir(parents=True) - - remove_source_file = False - # version is directory - if openpype_version.path.is_dir(): - # create zip inside temporary directory. - self._print("Creating zip from directory ...") - self._progress_callback(0) - with tempfile.TemporaryDirectory() as temp_dir: - temp_zip = \ - Path(temp_dir) / f"openpype-v{openpype_version}.zip" - self._print(f"creating zip: {temp_zip}") - - self._create_openpype_zip(temp_zip, openpype_version.path) - if not os.path.exists(temp_zip): - self._print("make archive failed.", LOG_ERROR) - raise OpenPypeVersionIOError("Zip creation failed.") - - # set zip as version source - openpype_version.path = temp_zip - - if self.is_inside_user_data(openpype_version.path): - raise OpenPypeVersionInvalid( - "Version is in user data dir.") - openpype_version.path = self._copy_zip( - openpype_version.path, destination) - - elif openpype_version.path.is_file(): - # check if file is zip (by extension) - if openpype_version.path.suffix.lower() != ".zip": - raise OpenPypeVersionInvalid("Invalid file format") - - if not self.is_inside_user_data(openpype_version.path): - self._progress_callback(35) - openpype_version.path = self._copy_zip( - openpype_version.path, destination) - # Mark zip to be deleted when done - remove_source_file = True - - # extract zip there - self._print("extracting zip to destination ...") - with ZipFileLongPaths(openpype_version.path, "r") as zip_ref: - self._progress_callback(75) - zip_ref.extractall(destination) - self._progress_callback(100) - - # Remove zip file copied to local app data - if remove_source_file: - os.remove(openpype_version.path) - - return destination - - def _copy_zip(self, source: Path, destination: Path) -> Path: - try: - # copy file to destination - self._print("Copying zip to destination ...") - _destination_zip = destination.parent / source.name # noqa: E501 - copyfile( - source.as_posix(), - _destination_zip.as_posix()) - except OSError as e: - self._print( - "cannot copy version to user data directory", LOG_ERROR, - exc_info=True) - raise OpenPypeVersionIOError(( - f"can't copy version {source.as_posix()} " - f"to destination {destination.parent.as_posix()}")) from e - return _destination_zip - - def _is_openpype_in_dir(self, - dir_item: Path, - detected_version: OpenPypeVersion) -> bool: - """Test if path item is OpenPype version matching detected version. - - If item is directory that might (based on it's name) - contain OpenPype version, check if it really does contain - OpenPype and that their versions matches. - - Args: - dir_item (Path): Directory to test. - detected_version (OpenPypeVersion): OpenPype version detected - from name. - - Returns: - True if it is valid OpenPype version, False otherwise. - - """ - try: - # add one 'openpype' level as inside dir there should - # be many other repositories. - version_str = BootstrapRepos.get_version(dir_item) - version_check = OpenPypeVersion(version=version_str) - except ValueError: - self._print( - f"cannot determine version from {dir_item}", True) - return False - - version_main = version_check.get_main_version() - detected_main = detected_version.get_main_version() - if version_main != detected_main: - self._print( - (f"dir version ({detected_version}) and " - f"its content version ({version_check}) " - "doesn't match. Skipping.")) - return False - return True - - def _is_openpype_in_zip(self, - zip_item: Path, - detected_version: OpenPypeVersion) -> bool: - """Test if zip path is OpenPype version matching detected version. - - Open zip file, look inside and parse version from OpenPype - inside it. If there is none, or it is different from - version specified in file name, skip it. - - Args: - zip_item (Path): Zip file to test. - detected_version (OpenPypeVersion): Pype version detected from - name. - - Returns: - True if it is valid OpenPype version, False otherwise. - - """ - # skip non-zip files - if zip_item.suffix.lower() != ".zip": - return False - - try: - with ZipFile(zip_item, "r") as zip_file: - with zip_file.open( - "openpype/version.py") as version_file: - zip_version = {} - exec(version_file.read(), zip_version) - try: - version_check = OpenPypeVersion( - version=zip_version["__version__"]) - except ValueError as e: - self._print(str(e), True) - return False - - version_main = version_check.get_main_version() # noqa: E501 - detected_main = detected_version.get_main_version() # noqa: E501 - - if version_main != detected_main: - self._print( - (f"zip version ({detected_version}) " - f"and its content version " - f"({version_check}) " - "doesn't match. Skipping."), True) - return False - except BadZipFile: - self._print(f"{zip_item} is not a zip file", True) - return False - except KeyError: - self._print("Zip does not contain OpenPype", True) - return False - return True - - def get_openpype_versions(self, openpype_dir: Path) -> list: - """Get all detected OpenPype versions in directory. - - Args: - openpype_dir (Path): Directory to scan. - - Returns: - list of OpenPypeVersion - - Throws: - ValueError: if invalid path is specified. - - """ - if not openpype_dir.exists() and not openpype_dir.is_dir(): - raise ValueError(f"specified directory {openpype_dir} is invalid") - - openpype_versions = [] - # iterate over directory in first level and find all that might - # contain OpenPype. - for item in openpype_dir.iterdir(): - # if the item is directory with major.minor version, dive deeper - if item.is_dir() and re.match(r"^\d+\.\d+$", item.name): - _versions = self.get_openpype_versions(item) - if _versions: - openpype_versions += _versions - - # if it is file, strip extension, in case of dir don't. - name = item.name if item.is_dir() else item.stem - result = OpenPypeVersion.version_in_str(name) - - if result: - detected_version: OpenPypeVersion - detected_version = result - - if item.is_dir() and not self._is_openpype_in_dir( - item, detected_version - ): - continue - - if item.is_file() and not self._is_openpype_in_zip( - item, detected_version - ): - continue - - detected_version.path = item - openpype_versions.append(detected_version) - - return sorted(openpype_versions) - - -class OpenPypeVersionExists(Exception): - """Exception for handling existing OpenPype version.""" - pass - - -class OpenPypeVersionInvalid(Exception): - """Exception for handling invalid OpenPype version.""" - pass - - -class OpenPypeVersionIOError(Exception): - """Exception for handling IO errors in OpenPype version.""" - pass diff --git a/igniter/install_dialog.py b/igniter/install_dialog.py deleted file mode 100644 index 551e2da918..0000000000 --- a/igniter/install_dialog.py +++ /dev/null @@ -1,509 +0,0 @@ -# -*- coding: utf-8 -*- -"""Show dialog for choosing central pype repository.""" -import os -import sys -import re -import collections - -from qtpy import QtCore, QtGui, QtWidgets - -from .install_thread import InstallThread -from .tools import ( - validate_mongo_connection, - get_openpype_icon_path -) - -from .nice_progress_bar import NiceProgressBar -from .user_settings import OpenPypeSecureRegistry -from .tools import load_stylesheet -from .version import __version__ - - -class ButtonWithOptions(QtWidgets.QFrame): - option_clicked = QtCore.Signal(str) - - def __init__(self, commands, parent=None): - super(ButtonWithOptions, self).__init__(parent) - - self.setObjectName("ButtonWithOptions") - - options_btn = QtWidgets.QToolButton(self) - options_btn.setArrowType(QtCore.Qt.DownArrow) - options_btn.setIconSize(QtCore.QSize(12, 12)) - - default = None - default_label = None - options_menu = QtWidgets.QMenu(self) - for option, option_label in commands.items(): - if default is None: - default = option - default_label = option_label - continue - action = QtWidgets.QAction(option_label, options_menu) - action.setData(option) - options_menu.addAction(action) - - main_btn = QtWidgets.QPushButton(default_label, self) - main_btn.setFlat(True) - - main_layout = QtWidgets.QHBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - main_layout.setSpacing(1) - - main_layout.addWidget(main_btn, 1, QtCore.Qt.AlignVCenter) - main_layout.addWidget(options_btn, 0, QtCore.Qt.AlignVCenter) - - main_btn.clicked.connect(self._on_main_button) - options_btn.clicked.connect(self._on_options_click) - options_menu.triggered.connect(self._on_trigger) - - self.main_btn = main_btn - self.options_btn = options_btn - self.options_menu = options_menu - - options_btn.setEnabled(not options_menu.isEmpty()) - - self._default_value = default - - def resizeEvent(self, event): - super(ButtonWithOptions, self).resizeEvent(event) - self.options_btn.setFixedHeight(self.main_btn.height()) - - def _on_options_click(self): - pos = self.main_btn.rect().bottomLeft() - point = self.main_btn.mapToGlobal(pos) - self.options_menu.popup(point) - - def _on_trigger(self, action): - self.option_clicked.emit(action.data()) - - def _on_main_button(self): - self.option_clicked.emit(self._default_value) - - -class ConsoleWidget(QtWidgets.QWidget): - def __init__(self, parent=None): - super(ConsoleWidget, self).__init__(parent) - - # style for normal and error console text - default_console_style = QtGui.QTextCharFormat() - error_console_style = QtGui.QTextCharFormat() - default_console_style.setForeground( - QtGui.QColor.fromRgb(72, 200, 150) - ) - error_console_style.setForeground( - QtGui.QColor.fromRgb(184, 54, 19) - ) - - label = QtWidgets.QLabel("Console:", self) - - console_output = QtWidgets.QPlainTextEdit(self) - console_output.setMinimumSize(QtCore.QSize(300, 200)) - console_output.setReadOnly(True) - console_output.setCurrentCharFormat(default_console_style) - console_output.setObjectName("Console") - - main_layout = QtWidgets.QVBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - main_layout.addWidget(label, 0) - main_layout.addWidget(console_output, 1) - - self.default_console_style = default_console_style - self.error_console_style = error_console_style - - self.label = label - self.console_output = console_output - - self.hide_console() - - def hide_console(self): - self.label.setVisible(False) - self.console_output.setVisible(False) - - self.updateGeometry() - - def show_console(self): - self.label.setVisible(True) - self.console_output.setVisible(True) - - self.updateGeometry() - - def update_console(self, msg: str, error: bool = False) -> None: - if not error: - self.console_output.setCurrentCharFormat( - self.default_console_style - ) - else: - self.console_output.setCurrentCharFormat( - self.error_console_style - ) - self.console_output.appendPlainText(msg) - - -class MongoUrlInput(QtWidgets.QLineEdit): - """Widget to input mongodb URL.""" - - def set_valid(self): - """Set valid state on mongo url input.""" - self.setProperty("state", "valid") - self.style().polish(self) - - def remove_state(self): - """Set invalid state on mongo url input.""" - self.setProperty("state", "") - self.style().polish(self) - - def set_invalid(self): - """Set invalid state on mongo url input.""" - self.setProperty("state", "invalid") - self.style().polish(self) - - -class InstallDialog(QtWidgets.QDialog): - """Main Igniter dialog window.""" - - mongo_url_regex = re.compile(r"^(mongodb|mongodb\+srv)://.*?") - - _width = 500 - _height = 200 - commands = collections.OrderedDict([ - ("run", "Start"), - ("run_from_code", "Run from code") - ]) - - def __init__(self, parent=None): - super(InstallDialog, self).__init__(parent) - - self.setWindowTitle( - f"OpenPype Igniter {__version__}" - ) - self.setWindowFlags( - QtCore.Qt.WindowCloseButtonHint - | QtCore.Qt.WindowMinimizeButtonHint - ) - - current_dir = os.path.dirname(os.path.abspath(__file__)) - roboto_font_path = os.path.join(current_dir, "RobotoMono-Regular.ttf") - poppins_font_path = os.path.join(current_dir, "Poppins") - - # Install roboto font - QtGui.QFontDatabase.addApplicationFont(roboto_font_path) - for filename in os.listdir(poppins_font_path): - if os.path.splitext(filename)[1] == ".ttf": - QtGui.QFontDatabase.addApplicationFont(filename) - - # Load logo - icon_path = get_openpype_icon_path() - pixmap_openpype_logo = QtGui.QPixmap(icon_path) - # Set logo as icon of window - self.setWindowIcon(QtGui.QIcon(pixmap_openpype_logo)) - - secure_registry = OpenPypeSecureRegistry("mongodb") - mongo_url = "" - try: - mongo_url = ( - os.getenv("OPENPYPE_MONGO", "") - or secure_registry.get_item("openPypeMongo") - ) - except ValueError: - pass - - self.mongo_url = mongo_url - self._pixmap_openpype_logo = pixmap_openpype_logo - - self._secure_registry = secure_registry - self._controls_disabled = False - self._install_thread = None - - self.resize(QtCore.QSize(self._width, self._height)) - self._init_ui() - - # Set stylesheet - self.setStyleSheet(load_stylesheet()) - - # Trigger Mongo URL validation - self._mongo_input.setText(self.mongo_url) - - def _init_ui(self): - # basic visual style - dark background, light text - - # Main info - # -------------------------------------------------------------------- - main_label = QtWidgets.QLabel("Welcome to OpenPype", self) - main_label.setWordWrap(True) - main_label.setObjectName("MainLabel") - - # Mongo box | OK button - # -------------------------------------------------------------------- - mongo_input = MongoUrlInput(self) - mongo_input.setPlaceholderText( - "Enter your database Address. Example: mongodb://192.168.1.10:2707" - ) - - mongo_messages_widget = QtWidgets.QWidget(self) - - mongo_connection_msg = QtWidgets.QLabel(mongo_messages_widget) - mongo_connection_msg.setVisible(True) - mongo_connection_msg.setTextInteractionFlags( - QtCore.Qt.TextSelectableByMouse - ) - - mongo_messages_layout = QtWidgets.QVBoxLayout(mongo_messages_widget) - mongo_messages_layout.setContentsMargins(0, 0, 0, 0) - mongo_messages_layout.addWidget(mongo_connection_msg) - - # Progress bar - # -------------------------------------------------------------------- - progress_bar = NiceProgressBar(self) - progress_bar.setAlignment(QtCore.Qt.AlignCenter) - progress_bar.setTextVisible(False) - - # Console - # -------------------------------------------------------------------- - console_widget = ConsoleWidget(self) - - # Bottom button bar - # -------------------------------------------------------------------- - bottom_widget = QtWidgets.QWidget(self) - - btns_widget = QtWidgets.QWidget(bottom_widget) - - openpype_logo_label = QtWidgets.QLabel("openpype logo", bottom_widget) - openpype_logo_label.setPixmap(self._pixmap_openpype_logo) - - run_button = ButtonWithOptions( - self.commands, - btns_widget - ) - run_button.setMinimumSize(64, 24) - run_button.setToolTip("Run OpenPype") - - # install button - - - - - - - - - - - - - - - - - - - - - - - - - - - - exit_button = QtWidgets.QPushButton("Exit", btns_widget) - exit_button.setObjectName("ExitBtn") - exit_button.setFlat(True) - exit_button.setMinimumSize(64, 24) - exit_button.setToolTip("Exit") - - btns_layout = QtWidgets.QHBoxLayout(btns_widget) - btns_layout.setContentsMargins(0, 0, 0, 0) - btns_layout.addWidget(run_button, 0) - btns_layout.addWidget(exit_button, 0) - - bottom_layout = QtWidgets.QHBoxLayout(bottom_widget) - bottom_layout.setContentsMargins(0, 0, 0, 0) - bottom_layout.setAlignment(QtCore.Qt.AlignHCenter) - bottom_layout.addWidget(openpype_logo_label, 0) - bottom_layout.addStretch(1) - bottom_layout.addWidget(btns_widget, 0) - - # add all to main - main = QtWidgets.QVBoxLayout(self) - main.addSpacing(15) - main.addWidget(main_label, 0) - main.addSpacing(15) - main.addWidget(mongo_input, 0) - main.addWidget(mongo_messages_widget, 0) - - main.addWidget(progress_bar, 0) - main.addSpacing(15) - - main.addWidget(console_widget, 1) - - main.addWidget(bottom_widget, 0) - - run_button.option_clicked.connect(self._on_run_btn_click) - exit_button.clicked.connect(self._on_exit_clicked) - mongo_input.textChanged.connect(self._on_mongo_url_change) - - self._console_widget = console_widget - - self.main_label = main_label - - self._mongo_input = mongo_input - - self._mongo_connection_msg = mongo_connection_msg - - self._run_button = run_button - self._exit_button = exit_button - self._progress_bar = progress_bar - - def _on_run_btn_click(self, option): - # Disable buttons - self._disable_buttons() - # Set progress to any value - self._update_progress(1) - self._progress_bar.repaint() - # Add label to show that is connecting to mongo - self.set_invalid_mongo_connection(self.mongo_url, True) - - # Process events to repaint changes - QtWidgets.QApplication.processEvents() - - if not self.validate_url(): - self._enable_buttons() - self._update_progress(0) - # Update any messages - self._mongo_input.setText(self.mongo_url) - return - - if option == "run": - self._run_openpype() - elif option == "run_from_code": - self._run_openpype_from_code() - else: - raise AssertionError("BUG: Unknown variant \"{}\"".format(option)) - - def _run_openpype_from_code(self): - os.environ["OPENPYPE_MONGO"] = self.mongo_url - try: - self._secure_registry.set_item("openPypeMongo", self.mongo_url) - except ValueError: - print("Couldn't save Mongo URL to keyring") - - self.done(2) - - def _run_openpype(self): - """Start install process. - - This will once again validate entered path and mongo if ok, start - working thread that will do actual job. - """ - # Check if install thread is not already running - if self._install_thread and self._install_thread.isRunning(): - return - - self._mongo_input.set_valid() - - install_thread = InstallThread(self) - install_thread.message.connect(self.update_console) - install_thread.progress.connect(self._update_progress) - install_thread.finished.connect(self._installation_finished) - install_thread.set_mongo(self.mongo_url) - - self._install_thread = install_thread - - install_thread.start() - - def _installation_finished(self): - # TODO we should find out why status can be set to 'None'? - # - 'InstallThread.run' should handle all cases so not sure where - # that come from - status = self._install_thread.result() - if status is not None and status >= 0: - self._update_progress(100) - QtWidgets.QApplication.processEvents() - self.done(3) - else: - self._enable_buttons() - self._show_console() - - def _update_progress(self, progress: int): - self._progress_bar.setValue(progress) - text_visible = self._progress_bar.isTextVisible() - if progress == 0: - if text_visible: - self._progress_bar.setTextVisible(False) - elif not text_visible: - self._progress_bar.setTextVisible(True) - - def _on_exit_clicked(self): - self.reject() - - def _on_mongo_url_change(self, new_value): - # Strip the value - new_value = new_value.strip() - # Store new mongo url to variable - self.mongo_url = new_value - - msg = None - # Change style of input - if not new_value: - self._mongo_input.remove_state() - elif not self.mongo_url_regex.match(new_value): - self._mongo_input.set_invalid() - msg = ( - "Mongo URL should start with" - " \"mongodb://\" or \"mongodb+srv://\"" - ) - else: - self._mongo_input.set_valid() - - self.set_invalid_mongo_url(msg) - - def validate_url(self): - """Validate if entered url is ok. - - Returns: - True if url is valid monogo string. - - """ - if self.mongo_url == "": - return False - - is_valid, reason_str = validate_mongo_connection(self.mongo_url) - if not is_valid: - self.set_invalid_mongo_connection(self.mongo_url) - self._mongo_input.set_invalid() - self.update_console(f"!!! {reason_str}", True) - return False - - self.set_invalid_mongo_connection(None) - self._mongo_input.set_valid() - return True - - def set_invalid_mongo_url(self, reason): - if reason is None: - self._mongo_connection_msg.setText("") - else: - self._mongo_connection_msg.setText("- {}".format(reason)) - - def set_invalid_mongo_connection(self, mongo_url, connecting=False): - if mongo_url is None: - self.set_invalid_mongo_url(mongo_url) - return - - if connecting: - msg = "Connecting to: {}".format(mongo_url) - else: - msg = "Can't connect to: {}".format(mongo_url) - - self.set_invalid_mongo_url(msg) - - def update_console(self, msg: str, error: bool = False) -> None: - """Display message in console. - - Args: - msg (str): message. - error (bool): if True, print it red. - """ - self._console_widget.update_console(msg, error) - - def _show_console(self): - self._console_widget.show_console() - self.updateGeometry() - - def _disable_buttons(self): - """Disable buttons so user interaction doesn't interfere.""" - self._exit_button.setEnabled(False) - self._run_button.setEnabled(False) - self._controls_disabled = True - - def _enable_buttons(self): - """Enable buttons after operation is complete.""" - self._exit_button.setEnabled(True) - self._run_button.setEnabled(True) - self._controls_disabled = False - - def closeEvent(self, event): # noqa - """Prevent closing if window when controls are disabled.""" - if self._controls_disabled: - return event.ignore() - return super(InstallDialog, self).closeEvent(event) - - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - d = InstallDialog() - d.show() - sys.exit(app.exec_()) diff --git a/igniter/install_thread.py b/igniter/install_thread.py deleted file mode 100644 index 1d55213de7..0000000000 --- a/igniter/install_thread.py +++ /dev/null @@ -1,217 +0,0 @@ -# -*- coding: utf-8 -*- -"""Working thread for installer.""" -import os -import sys -from pathlib import Path - -from qtpy import QtCore - -from .bootstrap_repos import ( - BootstrapRepos, - OpenPypeVersionInvalid, - OpenPypeVersionIOError, - OpenPypeVersionExists, - OpenPypeVersion -) - -from .tools import ( - get_openpype_global_settings, - get_local_openpype_path_from_settings, - validate_mongo_connection -) - - -class InstallThread(QtCore.QThread): - """Install Worker thread. - - This class takes care of finding OpenPype version on user entered path - (or loading this path from database). If nothing is entered by user, - OpenPype will create its zip files from repositories that comes with it. - - If path contains plain repositories, they are zipped and installed to - user data dir. - - """ - progress = QtCore.Signal(int) - message = QtCore.Signal((str, bool)) - - def __init__(self, parent=None,): - self._mongo = None - self._result = None - - super().__init__(parent) - - def result(self): - """Result of finished installation.""" - return self._result - - def _set_result(self, value): - if self._result is not None: - raise AssertionError("BUG: Result was set more than once!") - self._result = value - - def run(self): - """Thread entry point. - - Using :class:`BootstrapRepos` to either install OpenPype as zip files - or copy them from location specified by user or retrieved from - database. - - """ - self.message.emit("Installing OpenPype ...", False) - - # find local version of OpenPype - bs = BootstrapRepos( - progress_callback=self.set_progress, message=self.message) - local_version = OpenPypeVersion.get_installed_version_str() - - # user did not entered url - if self._mongo: - self.message.emit("Saving mongo connection string ...", False) - bs.secure_registry.set_item("openPypeMongo", self._mongo) - - elif os.getenv("OPENPYPE_MONGO"): - self._mongo = os.getenv("OPENPYPE_MONGO") - else: - # try to get it from settings registry - try: - self._mongo = bs.secure_registry.get_item( - "openPypeMongo") - except ValueError: - self.message.emit( - "!!! We need MongoDB URL to proceed.", True) - self._set_result(-1) - return - os.environ["OPENPYPE_MONGO"] = self._mongo - - if not validate_mongo_connection(self._mongo): - self.message.emit(f"Cannot connect to {self._mongo}", True) - self._set_result(-1) - return - - global_settings = get_openpype_global_settings(self._mongo) - data_dir = get_local_openpype_path_from_settings(global_settings) - bs.set_data_dir(data_dir) - - self.message.emit( - f"Detecting installed OpenPype versions in {bs.data_dir}", - False) - detected = bs.find_openpype(include_zips=True) - if not detected and getattr(sys, 'frozen', False): - self.message.emit("None detected.", True) - self.message.emit(("We will use OpenPype coming with " - "installer."), False) - openpype_version = bs.create_version_from_frozen_code() - if not openpype_version: - self.message.emit( - f"!!! Install failed - {openpype_version}", True) - self._set_result(-1) - return - self.message.emit(f"Using: {openpype_version}", False) - bs.install_version(openpype_version) - self.message.emit(f"Installed as {openpype_version}", False) - self.progress.emit(100) - self._set_result(1) - return - - if detected and not OpenPypeVersion.get_installed_version().is_compatible(detected[-1]): # noqa: E501 - self.message.emit(( - f"Latest detected version {detected[-1]} " - "is not compatible with the currently running " - f"{local_version}" - ), True) - self.message.emit(( - "Filtering detected versions to compatible ones..." - ), False) - - # filter results to get only compatible versions - detected = [ - version for version in detected - if version.is_compatible( - OpenPypeVersion.get_installed_version()) - ] - - if detected: - if OpenPypeVersion( - version=local_version, path=Path()) < detected[-1]: - self.message.emit(( - f"Latest installed version {detected[-1]} is newer " - f"then currently running {local_version}" - ), False) - self.message.emit("Skipping OpenPype install ...", False) - if detected[-1].path.suffix.lower() == ".zip": - bs.extract_openpype(detected[-1]) - self._set_result(0) - return - - if OpenPypeVersion(version=local_version).get_main_version() == detected[-1].get_main_version(): # noqa: E501 - self.message.emit(( - f"Latest installed version is the same as " - f"currently running {local_version}" - ), False) - self.message.emit("Skipping OpenPype install ...", False) - self._set_result(0) - return - - self.message.emit(( - "All installed versions are older then " - f"currently running one {local_version}" - ), False) - - self.message.emit("None detected.", False) - - self.message.emit( - f"We will use local OpenPype version {local_version}", False) - - local_openpype = bs.create_version_from_live_code() - if not local_openpype: - self.message.emit( - f"!!! Install failed - {local_openpype}", True) - self._set_result(-1) - return - - try: - bs.install_version(local_openpype) - except (OpenPypeVersionExists, - OpenPypeVersionInvalid, - OpenPypeVersionIOError) as e: - self.message.emit(f"Installed failed: ", True) - self.message.emit(str(e), True) - self._set_result(-1) - return - - self.message.emit(f"Installed as {local_openpype}", False) - self.progress.emit(100) - self._set_result(1) - return - - self.progress.emit(100) - self._set_result(1) - return - - def set_path(self, path: str) -> None: - """Helper to set path. - - Args: - path (str): Path to set. - - """ - self._path = path - - def set_mongo(self, mongo: str) -> None: - """Helper to set mongo url. - - Args: - mongo (str): Mongodb url. - - """ - self._mongo = mongo - - def set_progress(self, progress: int) -> None: - """Helper to set progress bar. - - Args: - progress (int): Progress in percents. - - """ - self.progress.emit(progress) diff --git a/igniter/message_dialog.py b/igniter/message_dialog.py deleted file mode 100644 index a2a8bce3a2..0000000000 --- a/igniter/message_dialog.py +++ /dev/null @@ -1,44 +0,0 @@ -from qtpy import QtWidgets, QtGui - -from .tools import ( - load_stylesheet, - get_openpype_icon_path -) - - -class MessageDialog(QtWidgets.QDialog): - """Simple message dialog with title, message and OK button.""" - def __init__(self, title, message): - super(MessageDialog, self).__init__() - - # Set logo as icon of window - icon_path = get_openpype_icon_path() - pixmap_openpype_logo = QtGui.QPixmap(icon_path) - self.setWindowIcon(QtGui.QIcon(pixmap_openpype_logo)) - - # Set title - self.setWindowTitle(title) - - # Set message - label_widget = QtWidgets.QLabel(message, self) - - ok_btn = QtWidgets.QPushButton("OK", self) - btns_layout = QtWidgets.QHBoxLayout() - btns_layout.addStretch(1) - btns_layout.addWidget(ok_btn, 0) - - layout = QtWidgets.QVBoxLayout(self) - layout.addWidget(label_widget, 1) - layout.addLayout(btns_layout, 0) - - ok_btn.clicked.connect(self._on_ok_clicked) - - self._label_widget = label_widget - self._ok_btn = ok_btn - - def _on_ok_clicked(self): - self.close() - - def showEvent(self, event): - super(MessageDialog, self).showEvent(event) - self.setStyleSheet(load_stylesheet()) diff --git a/igniter/nice_progress_bar.py b/igniter/nice_progress_bar.py deleted file mode 100644 index ee16d108d4..0000000000 --- a/igniter/nice_progress_bar.py +++ /dev/null @@ -1,20 +0,0 @@ -from qtpy import QtWidgets - - -class NiceProgressBar(QtWidgets.QProgressBar): - def __init__(self, parent=None): - super(NiceProgressBar, self).__init__(parent) - self._real_value = 0 - - def setValue(self, value): - self._real_value = value - if value != 0 and value < 11: - value = 11 - - super(NiceProgressBar, self).setValue(value) - - def value(self): - return self._real_value - - def text(self): - return "{} %".format(self._real_value) diff --git a/igniter/openpype.icns b/igniter/openpype.icns deleted file mode 100644 index 792f819ad9..0000000000 Binary files a/igniter/openpype.icns and /dev/null differ diff --git a/igniter/openpype.ico b/igniter/openpype.ico deleted file mode 100644 index f0c15accc4..0000000000 Binary files a/igniter/openpype.ico and /dev/null differ diff --git a/igniter/openpype_icon.png b/igniter/openpype_icon.png deleted file mode 100644 index 6eae8abca3..0000000000 Binary files a/igniter/openpype_icon.png and /dev/null differ diff --git a/igniter/splash.txt b/igniter/splash.txt deleted file mode 100644 index 833bcd4b9c..0000000000 --- a/igniter/splash.txt +++ /dev/null @@ -1,413 +0,0 @@ - - - - * - - - - - - - .* - - - - - - * - .* - * - - - - . - * - .* - * - . - - . - * - .* - .* - .* - * - . - . - * - .* - .* - .* - * - . - _. - /** - \ * - \* - * - * - . - __. - ---* - \ \* - \ * - \* - * - . - \___. - /* * - \ \ * - \ \* - \ * - \* - . - |____. - /* * - \|\ * - \ \ * - \ \ * - \ \* - \/. - _/_____. - /* * - / \ * - \ \ * - \ \ * - \ \__* - \/__. - __________. - --*-- ___* - \ \ \/_* - \ \ __* - \ \ \_* - \ \____\* - \/____/. - \____________ . - /* ___ \* - \ \ \/_\ * - \ \ _____* - \ \ \___/* - \ \____\ * - \/____/ . - |___________ . - /* ___ \ * - \|\ \/_\ \ * - \ \ _____/ * - \ \ \___/ * - \ \____\ / * - \/____/ \. - _/__________ . - /* ___ \ * - / \ \/_\ \ * - \ \ _____/ * - \ \ \___/ ---* - \ \____\ / \__* - \/____/ \/__. - ____________ . - --*-- ___ \ * - \ \ \/_\ \ * - \ \ _____/ * - \ \ \___/ ---- * - \ \____\ / \____\* - \/____/ \/____/. - ____________ - /\ ___ \ . - \ \ \/_\ \ * - \ \ _____/ * - \ \ \___/ ---- * - \ \____\ / \____\ . - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ . - \ \ _____/ * - \ \ \___/ ---- * - \ \____\ / \____\ . - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ . - \ \ \___/ ---- * - \ \____\ / \____\ . - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ - \ \ \___/ ---- * - \ \____\ / \____\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ - \ \ \___/ ---- . - \ \____\ / \____\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ _ - \ \ \___/ ---- - \ \____\ / \____\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- - \ \____\ / \____\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- \ - \ \____\ / \____\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- \ - \ \____\ / \____\ \ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- \ - \ \____\ / \____\ __\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- \ - \ \____\ / \____\ \__\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- \ \ - \ \____\ / \____\ \__\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ - \ \ \___/ ---- \ \ - \ \____\ / \____\ \__\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___. - \ \ \___/ ---- \ \\ - \ \____\ / \____\ \__\, - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ . - \ \ \___/ ---- \ \\ - \ \____\ / \____\ \__\\, - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ _. - \ \ \___/ ---- \ \\\ - \ \____\ / \____\ \__\\\ - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ __. - \ \ \___/ ---- \ \\ \ - \ \____\ / \____\ \__\\_/. - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___. - \ \ \___/ ---- \ \\ \\ - \ \____\ / \____\ \__\\__\. - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ . - \ \ \___/ ---- \ \\ \\ - \ \____\ / \____\ \__\\__\\. - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ _. - \ \ \___/ ---- \ \\ \\\ - \ \____\ / \____\ \__\\__\\. - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ __. - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\_. - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ __. - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__. - \/____/ \/____/ - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ * - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ O* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ .oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ ..oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . .oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . p.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . Py.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYp.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPe.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE .oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE c.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE C1.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE ClU.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE CluB.oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE Club .oO* - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE Club . .. - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE Club . .. - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE Club . . - ____________ - /\ ___ \ - \ \ \/_\ \ - \ \ _____/ ___ ___ ___ - \ \ \___/ ---- \ \\ \\ \ - \ \____\ / \____\ \__\\__\\__\ - \/____/ \/____/ . PYPE Club . diff --git a/igniter/stylesheet.css b/igniter/stylesheet.css deleted file mode 100644 index 8df2621d83..0000000000 --- a/igniter/stylesheet.css +++ /dev/null @@ -1,280 +0,0 @@ -*{ - font-size: 10pt; - font-family: "Poppins"; -} - -QWidget { - color: #bfccd6; - background-color: #282C34; - border-radius: 0px; -} - -QMenu { - border: 1px solid #555555; - background-color: #21252B; -} - -QMenu::item { - padding: 5px 10px 5px 10px; - border-left: 5px solid #313741;; -} - -QMenu::item:selected { - border-left-color: rgb(84, 209, 178); - background-color: #222d37; -} - -QLineEdit, QPlainTextEdit { - border: 1px solid #464b54; - border-radius: 3px; - background-color: #21252B; - padding: 0.5em; -} - -QLineEdit[state="valid"] { - background-color: rgb(19, 19, 19); - color: rgb(64, 230, 132); - border-color: rgb(32, 64, 32); -} - -QLineEdit[state="invalid"] { - background-color: rgb(32, 19, 19); - color: rgb(255, 69, 0); - border-color: rgb(64, 32, 32); -} - -QLabel { - background: transparent; - color: #969b9e; -} - -QLabel:hover {color: #b8c1c5;} - -QPushButton { - border: 1px solid #aaaaaa; - border-radius: 3px; - padding: 5px; -} - -QPushButton:hover { - background-color: #333840; - border: 1px solid #fff; - color: #fff; -} - -QTableView { - border: 1px solid #444; - gridline-color: #6c6c6c; - background-color: #201F1F; - alternate-background-color:#21252B; -} - -QTableView::item:pressed, QListView::item:pressed, QTreeView::item:pressed { - background: #78879b; - color: #FFFFFF; -} - -QTableView::item:selected:active, QTreeView::item:selected:active, QListView::item:selected:active { - background: #3d8ec9; -} - -QProgressBar { - border: 1px solid grey; - border-radius: 10px; - color: #222222; - font-weight: bold; -} -QProgressBar:horizontal { - height: 20px; -} - -QProgressBar::chunk { - border-radius: 10px; - background-color: qlineargradient( - x1: 0, - y1: 0.5, - x2: 1, - y2: 0.5, - stop: 0 rgb(72, 200, 150), - stop: 1 rgb(82, 172, 215) - ); -} - - -QScrollBar:horizontal { - height: 15px; - margin: 3px 15px 3px 15px; - border: 1px transparent #21252B; - border-radius: 4px; - background-color: #21252B; -} - -QScrollBar::handle:horizontal { - background-color: #4B5362; - min-width: 5px; - border-radius: 4px; -} - -QScrollBar::add-line:horizontal { - margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/right_arrow_disabled.png); - width: 10px; - height: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal { - margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/left_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on { - border-image: url(:/qss_icons/rc/right_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { - border-image: url(:/qss_icons/rc/left_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { - background: none; -} - -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { - background: none; -} - -QScrollBar:vertical { - background-color: #21252B; - width: 15px; - margin: 15px 3px 15px 3px; - border: 1px transparent #21252B; - border-radius: 4px; -} - -QScrollBar::handle:vertical { - background-color: #4B5362; - min-height: 5px; - border-radius: 4px; -} - -QScrollBar::sub-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/up_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/down_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on { - - border-image: url(:/qss_icons/rc/up_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - - -QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { - border-image: url(:/qss_icons/rc/down_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { - background: none; -} - - -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background: none; -} - -#MainLabel { - color: rgb(200, 200, 200); - font-size: 12pt; -} - -#Console { - background-color: #21252B; - color: rgb(72, 200, 150); - font-family: "Roboto Mono"; - font-size: 8pt; -} - -#ExitBtn { - /* `border` must be set to background of flat button is painted .*/ - border: none; - color: rgb(39, 39, 39); - background-color: #828a97; - padding: 0.5em; - font-weight: 400; -} - -#ExitBtn:hover{ - background-color: #b2bece -} -#ExitBtn:disabled { - background-color: rgba(185, 185, 185, 31); - color: rgba(64, 64, 64, 63); -} - -#ButtonWithOptions QPushButton{ - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - border: none; - background-color: rgb(84, 209, 178); - color: rgb(39, 39, 39); - font-weight: 400; - padding: 0.5em; -} -#ButtonWithOptions QPushButton:hover{ - background-color: rgb(85, 224, 189) -} -#ButtonWithOptions QPushButton:disabled { - background-color: rgba(72, 200, 150, 31); - color: rgba(64, 64, 64, 63); -} - -#ButtonWithOptions QToolButton{ - border: none; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - background-color: rgb(84, 209, 178); - color: rgb(39, 39, 39); -} -#ButtonWithOptions QToolButton:hover{ - background-color: rgb(85, 224, 189) -} -#ButtonWithOptions QToolButton:disabled { - background-color: rgba(72, 200, 150, 31); - color: rgba(64, 64, 64, 63); -} diff --git a/igniter/terminal_splash.py b/igniter/terminal_splash.py deleted file mode 100644 index 1d85fd3927..0000000000 --- a/igniter/terminal_splash.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -"""OpenPype terminal animation.""" -import blessed -from pathlib import Path -from time import sleep - -NO_TERMINAL = False - -try: - term = blessed.Terminal() -except AttributeError: - # this happens when blessed cannot find proper terminal. - # If so, skip printing ascii art animation. - NO_TERMINAL = True - - -def play_animation(): - """Play ASCII art OpenPype animation.""" - if NO_TERMINAL: - return - print(term.home + term.clear) - frame_size = 7 - splash_file = Path(__file__).parent / "splash.txt" - with splash_file.open("r") as sf: - animation = sf.readlines() - - animation_length = int(len(animation) / frame_size) - current_frame = 0 - for _ in range(animation_length): - frame = "".join( - scanline - for y, scanline in enumerate( - animation[current_frame : current_frame + frame_size] - ) - ) - - with term.location(0, 0): - # term.aquamarine3_bold(frame) - print(f"{term.bold}{term.aquamarine3}{frame}{term.normal}") - - sleep(0.02) - current_frame += frame_size - print(term.move_y(7)) diff --git a/igniter/tools.py b/igniter/tools.py deleted file mode 100644 index 9dea203f0c..0000000000 --- a/igniter/tools.py +++ /dev/null @@ -1,247 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tools used in **Igniter** GUI.""" -import os -from typing import Union -from urllib.parse import urlparse, parse_qs -from pathlib import Path -import platform - -import certifi -from pymongo import MongoClient -from pymongo.errors import ( - ServerSelectionTimeoutError, - InvalidURI, - ConfigurationError, - OperationFailure -) - - -class OpenPypeVersionNotFound(Exception): - """OpenPype version was not found in remote and local repository.""" - pass - - -class OpenPypeVersionIncompatible(Exception): - """OpenPype version is not compatible with the installed one (build).""" - pass - - -def should_add_certificate_path_to_mongo_url(mongo_url): - """Check if should add ca certificate to mongo url. - - Since 30.9.2021 cloud mongo requires newer certificates that are not - available on most of workstation. This adds path to certifi certificate - which is valid for it. To add the certificate path url must have scheme - 'mongodb+srv' or has 'ssl=true' or 'tls=true' in url query. - """ - parsed = urlparse(mongo_url) - query = parse_qs(parsed.query) - lowered_query_keys = set(key.lower() for key in query.keys()) - add_certificate = False - # Check if url 'ssl' or 'tls' are set to 'true' - for key in ("ssl", "tls"): - if key in query and "true" in query[key]: - add_certificate = True - break - - # Check if url contains 'mongodb+srv' - if not add_certificate and parsed.scheme == "mongodb+srv": - add_certificate = True - - # Check if url does already contain certificate path - if add_certificate and "tlscafile" in lowered_query_keys: - add_certificate = False - return add_certificate - - -def validate_mongo_connection(cnx: str) -> (bool, str): - """Check if provided mongodb URL is valid. - - Args: - cnx (str): URL to validate. - - Returns: - (bool, str): True if ok, False if not and reason in str. - - """ - parsed = urlparse(cnx) - if parsed.scheme not in ["mongodb", "mongodb+srv"]: - return False, "Not mongodb schema" - - kwargs = { - "serverSelectionTimeoutMS": os.environ.get("AVALON_TIMEOUT", 2000) - } - # Add certificate path if should be required - if should_add_certificate_path_to_mongo_url(cnx): - kwargs["tlsCAFile"] = certifi.where() - - try: - client = MongoClient(cnx, **kwargs) - client.server_info() - with client.start_session(): - pass - client.close() - except ServerSelectionTimeoutError as e: - return False, f"Cannot connect to server {cnx} - {e}" - except ValueError: - return False, f"Invalid port specified {parsed.port}" - except (ConfigurationError, OperationFailure, InvalidURI) as exc: - return False, str(exc) - else: - return True, "Connection is successful" - - -def validate_mongo_string(mongo: str) -> (bool, str): - """Validate string if it is mongo url acceptable by **Igniter**.. - - Args: - mongo (str): String to validate. - - Returns: - (bool, str): - True if valid, False if not and in second part of tuple - the reason why it failed. - - """ - if not mongo: - return True, "empty string" - return validate_mongo_connection(mongo) - - -def validate_path_string(path: str) -> (bool, str): - """Validate string if it is path to OpenPype repository. - - Args: - path (str): Path to validate. - - - Returns: - (bool, str): - True if valid, False if not and in second part of tuple - the reason why it failed. - - """ - if not path: - return False, "empty string" - - if not Path(path).exists(): - return False, "path doesn't exists" - - if not Path(path).is_dir(): - return False, "path is not directory" - - return True, "valid path" - - -def get_openpype_global_settings(url: str) -> dict: - """Load global settings from Mongo database. - - We are loading data from database `openpype` and collection `settings`. - There we expect document type `global_settings`. - - Args: - url (str): MongoDB url. - - Returns: - dict: With settings data. Empty dictionary is returned if not found. - """ - kwargs = {} - if should_add_certificate_path_to_mongo_url(url): - kwargs["tlsCAFile"] = certifi.where() - - try: - # Create mongo connection - client = MongoClient(url, **kwargs) - # Access settings collection - openpype_db = os.environ.get("OPENPYPE_DATABASE_NAME") or "openpype" - col = client[openpype_db]["settings"] - # Query global settings - global_settings = col.find_one({"type": "global_settings"}) or {} - # Close Mongo connection - client.close() - - except Exception: - # TODO log traceback or message - return {} - - return global_settings.get("data") or {} - - -def get_openpype_path_from_settings(settings: dict) -> Union[str, None]: - """Get OpenPype path from global settings. - - Args: - settings (dict): mongodb url. - - Returns: - path to OpenPype or None if not found - """ - paths = ( - settings - .get("openpype_path", {}) - .get(platform.system().lower()) - ) or [] - # For cases when `openpype_path` is a single path - if paths and isinstance(paths, str): - paths = [paths] - - return next((path for path in paths if os.path.exists(path)), None) - - -def get_local_openpype_path_from_settings(settings: dict) -> Union[str, None]: - """Get OpenPype local path from global settings. - - Used to download and unzip OP versions. - Args: - settings (dict): settings from DB. - - Returns: - path to OpenPype or None if not found - """ - path = ( - settings - .get("local_openpype_path", {}) - .get(platform.system().lower()) - ) - if path: - return Path(path) - return None - - -def get_expected_studio_version_str( - staging=False, global_settings=None -) -> str: - """Version that should be currently used in studio. - - Args: - staging (bool): Get current version for staging. - global_settings (dict): Optional precached global settings. - - Returns: - str: OpenPype version which should be used. Empty string means latest. - """ - mongo_url = os.environ.get("OPENPYPE_MONGO") - if global_settings is None: - global_settings = get_openpype_global_settings(mongo_url) - key = "staging_version" if staging else "production_version" - return global_settings.get(key) or "" - - -def load_stylesheet() -> str: - """Load css style sheet. - - Returns: - str: content of the stylesheet - - """ - stylesheet_path = Path(__file__).parent.resolve() / "stylesheet.css" - - return stylesheet_path.read_text() - - -def get_openpype_icon_path() -> str: - """Path to OpenPype icon png file.""" - return os.path.join( - os.path.dirname(os.path.abspath(__file__)), - "openpype_icon.png" - ) diff --git a/igniter/update_thread.py b/igniter/update_thread.py deleted file mode 100644 index 0223477d0a..0000000000 --- a/igniter/update_thread.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -"""Working thread for update.""" -from qtpy import QtCore - -from .bootstrap_repos import ( - BootstrapRepos, - OpenPypeVersion -) - - -class UpdateThread(QtCore.QThread): - """Install Worker thread. - - This class takes care of finding OpenPype version on user entered path - (or loading this path from database). If nothing is entered by user, - OpenPype will create its zip files from repositories that comes with it. - - If path contains plain repositories, they are zipped and installed to - user data dir. - - """ - progress = QtCore.Signal(int) - message = QtCore.Signal((str, bool)) - - def __init__(self, parent=None): - self._result = None - self._openpype_version = None - super().__init__(parent) - - def set_version(self, openpype_version: OpenPypeVersion): - self._openpype_version = openpype_version - - def result(self): - """Result of finished installation.""" - return self._result - - def _set_result(self, value): - if self._result is not None: - raise AssertionError("BUG: Result was set more than once!") - self._result = value - - def run(self): - """Thread entry point. - - Using :class:`BootstrapRepos` to either install OpenPype as zip files - or copy them from location specified by user or retrieved from - database. - """ - bs = BootstrapRepos( - progress_callback=self.set_progress, message=self.message) - - bs.set_data_dir(OpenPypeVersion.get_local_openpype_path()) - version_path = bs.install_version(self._openpype_version) - self._set_result(version_path) - - def set_progress(self, progress: int) -> None: - """Helper to set progress bar. - - Args: - progress (int): Progress in percents. - - """ - self.progress.emit(progress) diff --git a/igniter/update_window.py b/igniter/update_window.py deleted file mode 100644 index d51ae18cd0..0000000000 --- a/igniter/update_window.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- -"""Progress window to show when OpenPype is updating/installing locally.""" -import os - -from qtpy import QtCore, QtGui, QtWidgets - -from .update_thread import UpdateThread -from .bootstrap_repos import OpenPypeVersion -from .nice_progress_bar import NiceProgressBar -from .tools import load_stylesheet - - -class UpdateWindow(QtWidgets.QDialog): - """OpenPype update window.""" - - _width = 500 - _height = 100 - - def __init__(self, version: OpenPypeVersion, parent=None): - super(UpdateWindow, self).__init__(parent) - self._openpype_version = version - self._result_version_path = None - - self.setWindowTitle( - f"OpenPype is updating ..." - ) - self.setModal(True) - self.setWindowFlags( - QtCore.Qt.WindowMinimizeButtonHint - ) - - current_dir = os.path.dirname(os.path.abspath(__file__)) - roboto_font_path = os.path.join(current_dir, "RobotoMono-Regular.ttf") - poppins_font_path = os.path.join(current_dir, "Poppins") - icon_path = os.path.join(current_dir, "openpype_icon.png") - - # Install roboto font - QtGui.QFontDatabase.addApplicationFont(roboto_font_path) - for filename in os.listdir(poppins_font_path): - if os.path.splitext(filename)[1] == ".ttf": - QtGui.QFontDatabase.addApplicationFont(filename) - - # Load logo - pixmap_openpype_logo = QtGui.QPixmap(icon_path) - # Set logo as icon of window - self.setWindowIcon(QtGui.QIcon(pixmap_openpype_logo)) - - self._pixmap_openpype_logo = pixmap_openpype_logo - - self._update_thread = None - - self._init_ui() - - # Set stylesheet - self.setStyleSheet(load_stylesheet()) - self._run_update() - - def _init_ui(self): - - # Main info - # -------------------------------------------------------------------- - main_label = QtWidgets.QLabel( - f"OpenPype is updating to {self._openpype_version}", self) - main_label.setWordWrap(True) - main_label.setObjectName("MainLabel") - - # Progress bar - # -------------------------------------------------------------------- - progress_bar = NiceProgressBar(self) - progress_bar.setAlignment(QtCore.Qt.AlignCenter) - progress_bar.setTextVisible(False) - - # add all to main - main = QtWidgets.QVBoxLayout(self) - main.addSpacing(15) - main.addWidget(main_label, 0) - main.addSpacing(15) - main.addWidget(progress_bar, 0) - main.addSpacing(15) - - self._progress_bar = progress_bar - - def showEvent(self, event): - super().showEvent(event) - current_size = self.size() - new_size = QtCore.QSize( - max(current_size.width(), self._width), - max(current_size.height(), self._height) - ) - if current_size != new_size: - self.resize(new_size) - - def _run_update(self): - """Start install process. - - This will once again validate entered path and mongo if ok, start - working thread that will do actual job. - """ - # Check if install thread is not already running - if self._update_thread and self._update_thread.isRunning(): - return - self._progress_bar.setRange(0, 0) - update_thread = UpdateThread(self) - update_thread.set_version(self._openpype_version) - update_thread.message.connect(self.update_console) - update_thread.progress.connect(self._update_progress) - update_thread.finished.connect(self._installation_finished) - - self._update_thread = update_thread - - update_thread.start() - - def get_version_path(self): - return self._result_version_path - - def _installation_finished(self): - status = self._update_thread.result() - self._result_version_path = status - self._progress_bar.setRange(0, 1) - self._update_progress(100) - QtWidgets.QApplication.processEvents() - self.done(0) - - def _update_progress(self, progress: int): - # not updating progress as we are not able to determine it - # correctly now. Progress bar is set to un-deterministic mode - # until we are able to get progress in better way. - """ - self._progress_bar.setRange(0, 0) - self._progress_bar.setValue(progress) - text_visible = self._progress_bar.isTextVisible() - if progress == 0: - if text_visible: - self._progress_bar.setTextVisible(False) - elif not text_visible: - self._progress_bar.setTextVisible(True) - """ - return - - def update_console(self, msg: str, error: bool = False) -> None: - """Display message in console. - - Args: - msg (str): message. - error (bool): if True, print it red. - """ - print(msg) diff --git a/igniter/user_settings.py b/igniter/user_settings.py deleted file mode 100644 index 2a406f83dd..0000000000 --- a/igniter/user_settings.py +++ /dev/null @@ -1,493 +0,0 @@ -# -*- coding: utf-8 -*- -"""Package to deal with saving and retrieving user specific settings.""" -import os -from datetime import datetime -from abc import ABCMeta, abstractmethod -import json - -# disable lru cache in Python 2 -try: - from functools import lru_cache -except ImportError: - def lru_cache(maxsize): - def max_size(func): - def wrapper(*args, **kwargs): - value = func(*args, **kwargs) - return value - return wrapper - return max_size - -# ConfigParser was renamed in python3 to configparser -try: - import configparser -except ImportError: - import ConfigParser as configparser - -import platform - -import six -import appdirs - -_PLACEHOLDER = object() - - -class OpenPypeSecureRegistry: - """Store information using keyring. - - Registry should be used for private data that should be available only for - user. - - All passed registry names will have added prefix `OpenPype/` to easier - identify which data were created by OpenPype. - - Args: - name(str): Name of registry used as identifier for data. - """ - def __init__(self, name): - try: - import keyring - - except Exception: - raise NotImplementedError( - "Python module `keyring` is not available." - ) - - # hack for cx_freeze and Windows keyring backend - if platform.system().lower() == "windows": - from keyring.backends import Windows - - keyring.set_keyring(Windows.WinVaultKeyring()) - - # Force "OpenPype" prefix - self._name = "/".join(("OpenPype", name)) - - def set_item(self, name, value): - # type: (str, str) -> None - """Set sensitive item into system's keyring. - - This uses `Keyring module`_ to save sensitive stuff into system's - keyring. - - Args: - name (str): Name of the item. - value (str): Value of the item. - - .. _Keyring module: - https://github.com/jaraco/keyring - - """ - import keyring - - keyring.set_password(self._name, name, value) - - @lru_cache(maxsize=32) - def get_item(self, name, default=_PLACEHOLDER): - """Get value of sensitive item from system's keyring. - - See also `Keyring module`_ - - Args: - name (str): Name of the item. - default (Any): Default value if item is not available. - - Returns: - value (str): Value of the item. - - Raises: - ValueError: If item doesn't exist and default is not defined. - - .. _Keyring module: - https://github.com/jaraco/keyring - - """ - import keyring - - value = keyring.get_password(self._name, name) - if value: - return value - - if default is not _PLACEHOLDER: - return default - - # NOTE Should raise `KeyError` - raise ValueError( - "Item {}:{} does not exist in keyring.".format(self._name, name) - ) - - def delete_item(self, name): - # type: (str) -> None - """Delete value stored in system's keyring. - - See also `Keyring module`_ - - Args: - name (str): Name of the item to be deleted. - - .. _Keyring module: - https://github.com/jaraco/keyring - - """ - import keyring - - self.get_item.cache_clear() - keyring.delete_password(self._name, name) - - -@six.add_metaclass(ABCMeta) -class ASettingRegistry(): - """Abstract class defining structure of **SettingRegistry** class. - - It is implementing methods to store secure items into keyring, otherwise - mechanism for storing common items must be implemented in abstract - methods. - - Attributes: - _name (str): Registry names. - - """ - - def __init__(self, name): - # type: (str) -> ASettingRegistry - super(ASettingRegistry, self).__init__() - - self._name = name - self._items = {} - - def set_item(self, name, value): - # type: (str, str) -> None - """Set item to settings registry. - - Args: - name (str): Name of the item. - value (str): Value of the item. - - """ - self._set_item(name, value) - - @abstractmethod - def _set_item(self, name, value): - # type: (str, str) -> None - # Implement it - pass - - def __setitem__(self, name, value): - self._items[name] = value - self._set_item(name, value) - - def get_item(self, name): - # type: (str) -> str - """Get item from settings registry. - - Args: - name (str): Name of the item. - - Returns: - value (str): Value of the item. - - Raises: - ValueError: If item doesn't exist. - - """ - return self._get_item(name) - - @abstractmethod - def _get_item(self, name): - # type: (str) -> str - # Implement it - pass - - def __getitem__(self, name): - return self._get_item(name) - - def delete_item(self, name): - # type: (str) -> None - """Delete item from settings registry. - - Args: - name (str): Name of the item. - - """ - self._delete_item(name) - - @abstractmethod - def _delete_item(self, name): - # type: (str) -> None - """Delete item from settings. - - Note: - see :meth:`openpype.lib.user_settings.ARegistrySettings.delete_item` - - """ - pass - - def __delitem__(self, name): - del self._items[name] - self._delete_item(name) - - -class IniSettingRegistry(ASettingRegistry): - """Class using :mod:`configparser`. - - This class is using :mod:`configparser` (ini) files to store items. - - """ - - def __init__(self, name, path): - # type: (str, str) -> IniSettingRegistry - super(IniSettingRegistry, self).__init__(name) - # get registry file - version = os.getenv("OPENPYPE_VERSION", "N/A") - self._registry_file = os.path.join(path, "{}.ini".format(name)) - if not os.path.exists(self._registry_file): - with open(self._registry_file, mode="w") as cfg: - print("# Settings registry", cfg) - print("# Generated by OpenPype {}".format(version), cfg) - now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") - print("# {}".format(now), cfg) - - def set_item_section( - self, section, name, value): - # type: (str, str, str) -> None - """Set item to specific section of ini registry. - - If section doesn't exists, it is created. - - Args: - section (str): Name of section. - name (str): Name of the item. - value (str): Value of the item. - - """ - value = str(value) - config = configparser.ConfigParser() - - config.read(self._registry_file) - if not config.has_section(section): - config.add_section(section) - current = config[section] - current[name] = value - - with open(self._registry_file, mode="w") as cfg: - config.write(cfg) - - def _set_item(self, name, value): - # type: (str, str) -> None - self.set_item_section("MAIN", name, value) - - def set_item(self, name, value): - # type: (str, str) -> None - """Set item to settings ini file. - - This saves item to ``DEFAULT`` section of ini as each item there - must reside in some section. - - Args: - name (str): Name of the item. - value (str): Value of the item. - - """ - # this does the some, overridden just for different docstring. - # we cast value to str as ini options values must be strings. - super(IniSettingRegistry, self).set_item(name, str(value)) - - def get_item(self, name): - # type: (str) -> str - """Gets item from settings ini file. - - This gets settings from ``DEFAULT`` section of ini file as each item - there must reside in some section. - - Args: - name (str): Name of the item. - - Returns: - str: Value of item. - - Raises: - ValueError: If value doesn't exist. - - """ - return super(IniSettingRegistry, self).get_item(name) - - @lru_cache(maxsize=32) - def get_item_from_section(self, section, name): - # type: (str, str) -> str - """Get item from section of ini file. - - This will read ini file and try to get item value from specified - section. If that section or item doesn't exist, :exc:`ValueError` - is risen. - - Args: - section (str): Name of ini section. - name (str): Name of the item. - - Returns: - str: Item value. - - Raises: - ValueError: If value doesn't exist. - - """ - config = configparser.ConfigParser() - config.read(self._registry_file) - try: - value = config[section][name] - except KeyError: - raise ValueError( - "Registry doesn't contain value {}:{}".format(section, name)) - return value - - def _get_item(self, name): - # type: (str) -> str - return self.get_item_from_section("MAIN", name) - - def delete_item_from_section(self, section, name): - # type: (str, str) -> None - """Delete item from section in ini file. - - Args: - section (str): Section name. - name (str): Name of the item. - - Raises: - ValueError: If item doesn't exist. - - """ - self.get_item_from_section.cache_clear() - config = configparser.ConfigParser() - config.read(self._registry_file) - try: - _ = config[section][name] - except KeyError: - raise ValueError( - "Registry doesn't contain value {}:{}".format(section, name)) - config.remove_option(section, name) - - # if section is empty, delete it - if len(config[section].keys()) == 0: - config.remove_section(section) - - with open(self._registry_file, mode="w") as cfg: - config.write(cfg) - - def _delete_item(self, name): - """Delete item from default section. - - Note: - See :meth:`~openpype.lib.IniSettingsRegistry.delete_item_from_section` - - """ - self.delete_item_from_section("MAIN", name) - - -class JSONSettingRegistry(ASettingRegistry): - """Class using json file as storage.""" - - def __init__(self, name, path): - # type: (str, str) -> JSONSettingRegistry - super(JSONSettingRegistry, self).__init__(name) - #: str: name of registry file - self._registry_file = os.path.join(path, "{}.json".format(name)) - now = datetime.now().strftime("%d/%m/%Y %H:%M:%S") - header = { - "__metadata__": { - "openpype-version": os.getenv("OPENPYPE_VERSION", "N/A"), - "generated": now - }, - "registry": {} - } - - if not os.path.exists(os.path.dirname(self._registry_file)): - os.makedirs(os.path.dirname(self._registry_file), exist_ok=True) - if not os.path.exists(self._registry_file): - with open(self._registry_file, mode="w") as cfg: - json.dump(header, cfg, indent=4) - - @lru_cache(maxsize=32) - def _get_item(self, name): - # type: (str) -> object - """Get item value from registry json. - - Note: - See :meth:`openpype.lib.JSONSettingRegistry.get_item` - - """ - with open(self._registry_file, mode="r") as cfg: - data = json.load(cfg) - try: - value = data["registry"][name] - except KeyError: - raise ValueError( - "Registry doesn't contain value {}".format(name)) - return value - - def get_item(self, name): - # type: (str) -> object - """Get item value from registry json. - - Args: - name (str): Name of the item. - - Returns: - value of the item - - Raises: - ValueError: If item is not found in registry file. - - """ - return self._get_item(name) - - def _set_item(self, name, value): - # type: (str, object) -> None - """Set item value to registry json. - - Note: - See :meth:`openpype.lib.JSONSettingRegistry.set_item` - - """ - with open(self._registry_file, "r+") as cfg: - data = json.load(cfg) - data["registry"][name] = value - cfg.truncate(0) - cfg.seek(0) - json.dump(data, cfg, indent=4) - - def set_item(self, name, value): - # type: (str, object) -> None - """Set item and its value into json registry file. - - Args: - name (str): name of the item. - value (Any): value of the item. - - """ - self._set_item(name, value) - - def _delete_item(self, name): - # type: (str) -> None - self._get_item.cache_clear() - with open(self._registry_file, "r+") as cfg: - data = json.load(cfg) - del data["registry"][name] - cfg.truncate(0) - cfg.seek(0) - json.dump(data, cfg, indent=4) - - -class OpenPypeSettingsRegistry(JSONSettingRegistry): - """Class handling OpenPype general settings registry. - - Attributes: - vendor (str): Name used for path construction. - product (str): Additional name used for path construction. - - """ - - def __init__(self, name=None): - self.vendor = "pypeclub" - self.product = "openpype" - if not name: - name = "openpype_settings" - path = appdirs.user_data_dir(self.product, self.vendor) - super(OpenPypeSettingsRegistry, self).__init__(name, path) diff --git a/igniter/version.py b/igniter/version.py deleted file mode 100644 index 8e7731f6d6..0000000000 --- a/igniter/version.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -"""Definition of Igniter version.""" - -__version__ = "1.0.2" diff --git a/inno_setup.iss b/inno_setup.iss deleted file mode 100644 index d9a41d22ee..0000000000 --- a/inno_setup.iss +++ /dev/null @@ -1,55 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - - -#define MyAppName "OpenPype" -#define Build GetEnv("BUILD_DIR") -#define AppVer GetEnv("BUILD_VERSION") - - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{B9E9DF6A-5BDA-42DD-9F35-C09D564C4D93} -AppName={#MyAppName} -AppVersion={#AppVer} -AppVerName={#MyAppName} version {#AppVer} -AppPublisher=Ynput s.r.o -AppPublisherURL=https://ynput.io -AppSupportURL=https://ynput.io -AppUpdatesURL=https://ynput.io -DefaultDirName={autopf}\{#MyAppName}\{#AppVer} -UsePreviousAppDir=no -DisableProgramGroupPage=yes -OutputBaseFilename={#MyAppName}-{#AppVer}-install -AllowCancelDuringInstall=yes -; Uncomment the following line to run in non administrative install mode (install for current user only.) -;PrivilegesRequired=lowest -PrivilegesRequiredOverridesAllowed=dialog -SetupIconFile=igniter\openpype.ico -OutputDir=build\ -Compression=lzma2 -SolidCompression=yes -WizardStyle=modern - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}" - -[InstallDelete] -; clean everything in previous installation folder -Type: filesandordirs; Name: "{app}\*" - - -[Files] -Source: "build\{#build}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs -; NOTE: Don't use "Flags: ignoreversion" on any shared system files - -[Icons] -Name: "{autoprograms}\{#MyAppName} {#AppVer}"; Filename: "{app}\openpype_gui.exe" -Name: "{autodesktop}\{#MyAppName} {#AppVer}"; Filename: "{app}\openpype_gui.exe"; Tasks: desktopicon - -[Run] -Filename: "{app}\openpype_gui.exe"; Description: "{cm:LaunchProgram,OpenPype}"; Flags: nowait postinstall skipifsilent diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index d074a0c3d9..0000000000 --- a/poetry.lock +++ /dev/null @@ -1,3500 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "acre" -version = "1.0.0" -description = "Lightweight cross-platform environment management Python package that makes it trivial to launch applications in their own configurable working environment." -optional = false -python-versions = ">=2.7" -files = [] -develop = false - -[package.source] -type = "git" -url = "https://github.com/pypeclub/acre.git" -reference = "HEAD" -resolved_reference = "126f7a188cfe36718f707f42ebbc597e86aa86c3" - -[[package]] -name = "aiohttp" -version = "3.8.4" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" -attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiohttp-json-rpc" -version = "0.13.3" -description = "Implementation JSON-RPC 2.0 server and client using aiohttp on top of websockets transport" -optional = false -python-versions = ">=3.5" -files = [ - {file = "aiohttp-json-rpc-0.13.3.tar.gz", hash = "sha256:6237a104478c22c6ef96c7227a01d6832597b414e4b79a52d85593356a169e99"}, - {file = "aiohttp_json_rpc-0.13.3-py3-none-any.whl", hash = "sha256:4fbd197aced61bd2df7ae3237ead7d3e08833c2ccf48b8581e1828c95ebee680"}, -] - -[package.dependencies] -aiohttp = ">=3,<4" - -[[package]] -name = "aiohttp-middlewares" -version = "2.2.0" -description = "Collection of useful middlewares for aiohttp applications." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "aiohttp_middlewares-2.2.0-py3-none-any.whl", hash = "sha256:f4b87665667d4d3e818d70495e832e368f11a1fdc9c2fd8157a7d9e5d5147c5d"}, - {file = "aiohttp_middlewares-2.2.0.tar.gz", hash = "sha256:3967b2a0d17a2c094681e7c2f246977a365479a2820e48f8a01136c910f4aa93"}, -] - -[package.dependencies] -aiohttp = ">=3.8.1,<4.0.0" -async-timeout = ">=4.0.2,<5.0.0" -yarl = ">=1.5.1,<2.0.0" - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" -optional = false -python-versions = ">=3.6" -files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, -] - -[[package]] -name = "ansicon" -version = "1.89.0" -description = "Python wrapper for loading Jason Hood's ANSICON" -optional = false -python-versions = "*" -files = [ - {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, - {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, -] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [] -develop = false - -[package.source] -type = "git" -url = "https://github.com/ActiveState/appdirs.git" -reference = "master" -resolved_reference = "8734277956c1df3b85385e6b308e954910533884" - -[[package]] -name = "arrow" -version = "0.17.0" -description = "Better dates & times for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "arrow-0.17.0-py2.py3-none-any.whl", hash = "sha256:e098abbd9af3665aea81bdd6c869e93af4feb078e98468dd351c383af187aac5"}, - {file = "arrow-0.17.0.tar.gz", hash = "sha256:ff08d10cda1d36c68657d6ad20d74fbea493d980f8b2d45344e00d6ed2bf6ed4"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" - -[[package]] -name = "astroid" -version = "2.15.5" -description = "An abstract syntax tree for Python with inference support." -optional = false -python-versions = ">=3.7.2" -files = [ - {file = "astroid-2.15.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, - {file = "astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, -] - -[package.dependencies] -lazy-object-proxy = ">=1.4.0" -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = {version = ">=1.11,<2", markers = "python_version < \"3.11\""} - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.6" -files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] - -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "autopep8" -version = "2.0.2" -description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" -optional = false -python-versions = ">=3.6" -files = [ - {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, - {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, -] - -[package.dependencies] -pycodestyle = ">=2.10.0" -tomli = {version = "*", markers = "python_version < \"3.11\""} - -[[package]] -name = "babel" -version = "2.12.1" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, -] - -[[package]] -name = "bcrypt" -version = "4.0.1" -description = "Modern password hashing for your software and your servers" -optional = false -python-versions = ">=3.6" -files = [ - {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, - {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, - {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, - {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, -] - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - -[[package]] -name = "bidict" -version = "0.22.1" -description = "The bidirectional mapping library for Python." -optional = false -python-versions = ">=3.7" -files = [ - {file = "bidict-0.22.1-py3-none-any.whl", hash = "sha256:6ef212238eb884b664f28da76f33f1d28b260f665fc737b413b287d5487d1e7b"}, - {file = "bidict-0.22.1.tar.gz", hash = "sha256:1e0f7f74e4860e6d0943a05d4134c63a2fad86f3d4732fb265bd79e4e856d81d"}, -] - -[package.extras] -docs = ["furo", "sphinx", "sphinx-copybutton"] -lint = ["pre-commit"] -test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "pytest-xdist", "sortedcollections", "sortedcontainers", "sphinx"] - -[[package]] -name = "blessed" -version = "1.20.0" -description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." -optional = false -python-versions = ">=2.7" -files = [ - {file = "blessed-1.20.0-py2.py3-none-any.whl", hash = "sha256:0c542922586a265e699188e52d5f5ac5ec0dd517e5a1041d90d2bbf23f906058"}, - {file = "blessed-1.20.0.tar.gz", hash = "sha256:2cdd67f8746e048f00df47a2880f4d6acbcdb399031b604e34ba8f71d5787680"}, -] - -[package.dependencies] -jinxed = {version = ">=1.1.0", markers = "platform_system == \"Windows\""} -six = ">=1.9.0" -wcwidth = ">=0.1.4" - -[[package]] -name = "cachetools" -version = "5.3.1" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, -] - -[[package]] -name = "certifi" -version = "2023.7.22" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "cfgv" -version = "3.3.1" -description = "Validate configuration and produce human readable error messages." -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.1.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, -] - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] - -[[package]] -name = "clique" -version = "1.6.1" -description = "Manage collections with common numerical component" -optional = false -python-versions = ">=2.7, <4.0" -files = [ - {file = "clique-1.6.1-py2.py3-none-any.whl", hash = "sha256:8619774fa035661928dd8c93cd805acf2d42533ccea1b536c09815ed426c9858"}, - {file = "clique-1.6.1.tar.gz", hash = "sha256:90165c1cf162d4dd1baef83ceaa1afc886b453e379094fa5b60ea470d1733e66"}, -] - -[package.extras] -dev = ["lowdown (>=0.2.0,<1)", "pytest (>=2.3.5,<5)", "pytest-cov (>=2,<3)", "pytest-runner (>=2.7,<3)", "sphinx (>=2,<4)", "sphinx-rtd-theme (>=0.1.6,<1)"] -doc = ["lowdown (>=0.2.0,<1)", "sphinx (>=2,<4)", "sphinx-rtd-theme (>=0.1.6,<1)"] -test = ["pytest (>=2.3.5,<5)", "pytest-cov (>=2,<3)", "pytest-runner (>=2.7,<3)"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" -optional = false -python-versions = "*" -files = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] - -[package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] - -[[package]] -name = "coolname" -version = "2.2.0" -description = "Random name and slug generator" -optional = false -python-versions = "*" -files = [ - {file = "coolname-2.2.0-py2.py3-none-any.whl", hash = "sha256:4d1563186cfaf71b394d5df4c744f8c41303b6846413645e31d31915cdeb13e8"}, - {file = "coolname-2.2.0.tar.gz", hash = "sha256:6c5d5731759104479e7ca195a9b64f7900ac5bead40183c09323c7d0be9e75c7"}, -] - -[[package]] -name = "coverage" -version = "7.2.7" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, -] - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "cryptography" -version = "39.0.0" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.6" -files = [ - {file = "cryptography-39.0.0-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288"}, - {file = "cryptography-39.0.0-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72"}, - {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9"}, - {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f"}, - {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b"}, - {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c"}, - {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96"}, - {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717"}, - {file = "cryptography-39.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df"}, - {file = "cryptography-39.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1"}, - {file = "cryptography-39.0.0-cp36-abi3-win32.whl", hash = "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de"}, - {file = "cryptography-39.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e"}, - {file = "cryptography-39.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb"}, - {file = "cryptography-39.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f"}, - {file = "cryptography-39.0.0-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458"}, - {file = "cryptography-39.0.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190"}, - {file = "cryptography-39.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773"}, - {file = "cryptography-39.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856"}, - {file = "cryptography-39.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f"}, - {file = "cryptography-39.0.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce"}, - {file = "cryptography-39.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8"}, - {file = "cryptography-39.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39"}, - {file = "cryptography-39.0.0.tar.gz", hash = "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf"}, -] - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1,!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "ruff"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] - -[[package]] -name = "cx-freeze" -version = "6.12.0" -description = "Create standalone executables from Python scripts" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cx_Freeze-6.12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b1d64fad066dca4b70b9cf3e80026f380efc7b44ccea86d0a8991600f412dfd"}, - {file = "cx_Freeze-6.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8518162462fec973b9c89bf8d2f34452f74386e00b533ff655994608a8a56c6"}, - {file = "cx_Freeze-6.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8b0ed69d6e3733171c7bf78cb8544445cc36df7d96a20a40831d067b407a086"}, - {file = "cx_Freeze-6.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad47aa57a89f0d86a6a08395c9eadce2780d1104002bf4c733ba7ac760a388c"}, - {file = "cx_Freeze-6.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab810343e921d2bdd6e313c3df8234b276a3838f8f0d1d2ec6c500a47b6a016"}, - {file = "cx_Freeze-6.12.0-cp310-cp310-win32.whl", hash = "sha256:a7c77ef922d2f3020409ef7e71d44fb90aa1df62be3a4f1a0210ea4e84fc2037"}, - {file = "cx_Freeze-6.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c56c29c95c81149d9265883bf48ff72b2788dccbf651f1443784a059e433c6b4"}, - {file = "cx_Freeze-6.12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:79fa96b39c51d4df912aa6d918f0a19d19b94f38bfff9ea199cdf33e373d7b8b"}, - {file = "cx_Freeze-6.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b6a8f361bae56daa4bf0170bc1eeb368a3515e23773e46b3578af07924633ab"}, - {file = "cx_Freeze-6.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ed10f5d81c2964928b52bb4ec5f4d473177d14b181d248b157a88f364ad2b24"}, - {file = "cx_Freeze-6.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:159f9fdfc86adc57c6f2a3a522275c195d2021c9890c54c007dccb7cb9db8383"}, - {file = "cx_Freeze-6.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6424852ab6b3fa71330bd65d5e86defd73b8811cbc6d9996e54e3e83ce46af16"}, - {file = "cx_Freeze-6.12.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3e1a61c4ce43914198ded561ef487fc6963f7d7c662f380814758e6f55b94f7c"}, - {file = "cx_Freeze-6.12.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e152398c5dbb1030245febb5c10537063c514ea7513e1fe6048a4ee07d678f5c"}, - {file = "cx_Freeze-6.12.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee93c21515a7e13fb55b34eb5e35eb5c904cb74e66771317b61d799028bdd5ad"}, - {file = "cx_Freeze-6.12.0-cp36-cp36m-win32.whl", hash = "sha256:890fee78b114083fecb82802d5dbbad6b37c3a9396aae1e4c959d213678fbc7d"}, - {file = "cx_Freeze-6.12.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2220ab28abd29ae25da2f86e79e85b37f30fa81dcb31e8da550cfb312be31b9f"}, - {file = "cx_Freeze-6.12.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c92cda2706764bc17d8b8162bf6c2df1026891ae3f48e52e067ec3fb227513a9"}, - {file = "cx_Freeze-6.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:072af5bb5543882578d586c0d2baaded7da3298673bd5072318b0011111a41b8"}, - {file = "cx_Freeze-6.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:918cab0c6a0eec7db285e3bddbafcdb4dbb16ec60c998b4898da4edf4f663670"}, - {file = "cx_Freeze-6.12.0-cp37-cp37m-win32.whl", hash = "sha256:36d7be0e1b1fe0812c9cc626867989e2fc7cb6fcf4002eb385156d1ca84d4bd6"}, - {file = "cx_Freeze-6.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8f82f11307bbf1332eb7aa2b91b93ff14519dc88e122134935e95e85f7df9f0d"}, - {file = "cx_Freeze-6.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4299bb469c0a94d72313d5b6259c5f9917a4389d400a156eff6269159168d986"}, - {file = "cx_Freeze-6.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:228c482687b1bd1451bb64dba219fedf10a1fa8f0aa0ada92059a29af1dfcf4f"}, - {file = "cx_Freeze-6.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffabcc6fde64ea851ccc6c0acda29de5e6ad4c35ca6949b22ba3e89285274ee6"}, - {file = "cx_Freeze-6.12.0-cp38-cp38-win32.whl", hash = "sha256:80b791e40184f8d3a26a9b8eae81a98778cadf23136f4de27c0b585eb9c5662a"}, - {file = "cx_Freeze-6.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:104c9a7d641e3f21faea8a64805bf24bbb79b599018e93add927372fa88532fd"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3be232b1dfcd498e497c44fa18e74d4a8ce7e877a22d765ddfa89b2b5bbef1db"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:358cd51f2978370aebaf00452ec997153cf1dd830513554d186d1d2f591a6c8b"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:596fb0ac82199c9d6120f34fdff5331fd6fab4cfbb10ed1605e2149f15ec6748"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6360a195c3f48d4617bff0bfbf23201d238727e8bec7cf34d4d9ab571877a0d"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d99446adae63480e60aeb4c7275e7034a2eb4269c6e8db18e4e917220d0d29"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-win32.whl", hash = "sha256:fba3fd32c46a0dec08674ad280fc94f1d55f14881396cb205a6a36ec0d69babe"}, - {file = "cx_Freeze-6.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:2eef6954b5152153440dadf6bc29d1233f1c4af9ba1c09f00b48b268af5d9fc5"}, - {file = "cx_Freeze-6.12.0.tar.gz", hash = "sha256:4caf5258192337e1d0c63376d79cc875a6af17690b676461d09e2ef018f67096"}, -] - -[package.dependencies] -cx-logging = {version = ">=3.0", markers = "sys_platform == \"win32\" and python_version < \"3.10\""} -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -lief = {version = ">=0.11.5", markers = "sys_platform == \"win32\""} -packaging = ">=21.0" -patchelf = {version = ">=0.12", markers = "sys_platform == \"linux\""} -setuptools = ">=59.0.1,<66" - -[package.extras] -dev = ["bump2version (>=1.0.1)", "cibuildwheel (>=2.8.1)", "pre-commit (>=2.17.0)", "pylint (>=2.13.0)", "wheel (>=0.36.2)"] -doc = ["sphinx (>=5.0.1,<5.2.0)", "sphinx-rtd-theme (==1.0.0)"] -test = ["nose (==1.3.7)", "pygments (>=2.11.2)", "pytest (>=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-mock (>=3.6.1)", "pytest-timeout (>=1.4.2)"] - -[[package]] -name = "cx-logging" -version = "3.1.0" -description = "Python and C interfaces for logging" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cx_Logging-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d6aee2d91d4abeafa8ae1a5cacdcc363031ab6e69a3c5b221b294f5b94b0830"}, - {file = "cx_Logging-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7f2d686ca7347e14d248e4f57279b9340b305f86888806313111ab7964835f4"}, - {file = "cx_Logging-3.1.0-cp310-cp310-win32.whl", hash = "sha256:93ee6c9109d129f63344aa9da10dfc6c0d2ac3b2656599a4f884bf482c1fd2f6"}, - {file = "cx_Logging-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d69b2986e53f8f14d6fcd1614472f378edf63eea6c71c04d42cb215f7012717"}, - {file = "cx_Logging-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e16a66e8ce16b28a79c9dcf9bda2f36297bd552ec7d9a80cc70e19970d49460"}, - {file = "cx_Logging-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:564bea49c30342478ff2301c39a61c47c926e01146052b2a505ac11896ef51d2"}, - {file = "cx_Logging-3.1.0-cp311-cp311-win32.whl", hash = "sha256:cfd260cd431f2087cac2a9bfb738c2e428eb30e2b85ba0e0bce8dde2cb4843eb"}, - {file = "cx_Logging-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:c61388bd9410817839187dab602f47d307f3f58df2dd11fb698cd321b8b48985"}, - {file = "cx_Logging-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1937991c2daab59ced3bf8f52b1052b0157c0c30f229aa87bd384ab18dc8d1f3"}, - {file = "cx_Logging-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8129e2d6bbff03fa7b09e9b587a5aed178fa16032508bae0f4db7e933fb43d08"}, - {file = "cx_Logging-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:80aac0557464995780769535edf8057bab79a54cb4126363a7134b4ae38d25a3"}, - {file = "cx_Logging-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ce9a37ab15890a87d144a7206c30d16192b67e63e8e52f02c579daa72a10767e"}, - {file = "cx_Logging-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8040a77b922eacd342d2dc0804a06425d772cf9cde61dd4c01e61aaaf9189f9f"}, - {file = "cx_Logging-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3accfa4ae945c3f65d7fc830058272e263b27e09672539d8dc2ed190a07be99e"}, - {file = "cx_Logging-3.1.0-cp38-cp38-win32.whl", hash = "sha256:ae6d01072625de14584e79af4aade249b3b7080e90a3df6b47ada72b0ecd8b79"}, - {file = "cx_Logging-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:10fca1790e3467548472987e1a39379a96b93da09bdc1b64b3075605d473aaf6"}, - {file = "cx_Logging-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78b82737e589d5805b044a64afa8d2782a388a42898af084c6ab76153bc531fb"}, - {file = "cx_Logging-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82fc9cd57a4c151856759d76b9e44700913de60d6b97d661000577dad89f383b"}, - {file = "cx_Logging-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a98781f59652c58b0648a835b5f5a9cfcdc90957283818d1babf98aed3a5e28f"}, - {file = "cx_Logging-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a1548d8339baf54c7f1f372e68d381be7ce3e9506f2aa0987e88670a446a773"}, - {file = "cx_Logging-3.1.0.tar.gz", hash = "sha256:8a06834d8527aa904a68b25c9c1a5fa09f0dfdc94dbd9f86b81cd8d2f7a0e487"}, -] - -[[package]] -name = "dill" -version = "0.3.6" -description = "serialize all of python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - -[[package]] -name = "distlib" -version = "0.3.6" -description = "Distribution utilities" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] - -[[package]] -name = "dnspython" -version = "2.3.0" -description = "DNS toolkit" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, - {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, -] - -[package.extras] -curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] -dnssec = ["cryptography (>=2.6,<40.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] - -[[package]] -name = "docutils" -version = "0.19" -description = "Docutils -- Python Documentation Utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] - -[[package]] -name = "dropbox" -version = "11.36.0" -description = "Official Dropbox API Client" -optional = false -python-versions = "*" -files = [ - {file = "dropbox-11.36.0-py2-none-any.whl", hash = "sha256:91d26a47a6db294e5d787d233e70d8f785efee6d456564588e81a6a2ac4c550b"}, - {file = "dropbox-11.36.0-py3-none-any.whl", hash = "sha256:5d36e3b08c2e542f31469d82031be2606963f774b2f1105e3aa11c9913c67697"}, - {file = "dropbox-11.36.0.tar.gz", hash = "sha256:830ce522d8bc3905b4a99b67dc009aa9542550d1de9fa1743c1927de70888b47"}, -] - -[package.dependencies] -requests = ">=2.16.2" -six = ">=1.12.0" -stone = ">=2" - -[[package]] -name = "enlighten" -version = "1.11.2" -description = "Enlighten Progress Bar" -optional = false -python-versions = "*" -files = [ - {file = "enlighten-1.11.2-py2.py3-none-any.whl", hash = "sha256:98c9eb20e022b6a57f1c8d4f17e16760780b6881e6d658c40f52d21255ea45f3"}, - {file = "enlighten-1.11.2.tar.gz", hash = "sha256:9284861dee5a272e0e1a3758cd3f3b7180b1bd1754875da76876f2a7f46ccb61"}, -] - -[package.dependencies] -blessed = ">=1.17.7" -prefixed = ">=0.3.2" - -[[package]] -name = "evdev" -version = "1.6.1" -description = "Bindings to the Linux input handling subsystem" -optional = false -python-versions = "*" -files = [ - {file = "evdev-1.6.1.tar.gz", hash = "sha256:299db8628cc73b237fc1cc57d3c2948faa0756e2a58b6194b5bf81dc2081f1e3"}, -] - -[[package]] -name = "filelock" -version = "3.12.0" -description = "A platform independent file lock." -optional = false -python-versions = ">=3.7" -files = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, -] - -[package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "flake8" -version = "6.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, - {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.10.0,<2.11.0" -pyflakes = ">=3.0.0,<3.1.0" - -[[package]] -name = "frozenlist" -version = "1.3.3" -description = "A list-like structure which implements collections.abc.MutableSequence" -optional = false -python-versions = ">=3.7" -files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, -] - -[[package]] -name = "ftrack-python-api" -version = "2.5.0" -description = "Python API for ftrack." -optional = false -python-versions = ">=2.7.9, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "ftrack-python-api-2.5.0.tar.gz", hash = "sha256:95205022552b1abadec5e9dcb225762b8e8b9f16ebeadba374e56c25e69e6954"}, - {file = "ftrack_python_api-2.5.0-py2.py3-none-any.whl", hash = "sha256:59ef3f1d47e5c1df8c3f7ebcc937bbc9a5613b147f9ed083f10cff6370f0750d"}, -] - -[package.dependencies] -appdirs = ">=1,<2" -arrow = ">=0.4.4,<1" -clique = "1.6.1" -future = ">=0.16.0,<1" -pyparsing = ">=2.0,<3" -requests = ">=2,<3" -six = ">=1.13.0,<2" -termcolor = ">=1.1.0,<2" -websocket-client = ">=0.40.0,<1" - -[[package]] -name = "future" -version = "0.18.3" -description = "Clean single-source support for Python 3 and 2" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, -] - -[[package]] -name = "gazu" -version = "0.9.3" -description = "Gazu is a client for Zou, the API to store the data of your CG production." -optional = false -python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*, != 3.4.*, != 3.5.*, != 3.6.1, != 3.6.2" -files = [ - {file = "gazu-0.9.3-py2.py3-none-any.whl", hash = "sha256:daa6e4bdaa364b68a048ad97837aec011a0060d12edc3a5ac6ae34c13a05cb2b"}, -] - -[package.dependencies] -python-socketio = {version = "5.8.0", extras = ["client"], markers = "python_version != \"2.7\""} -requests = ">=2.25.1" - -[package.extras] -dev = ["wheel"] -lint = ["black (==23.3.0)", "pre-commit (==3.2.2)"] -test = ["pytest", "pytest-cov", "requests-mock"] - -[[package]] -name = "gitdb" -version = "4.0.10" -description = "Git Object Database" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, -] - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.31" -description = "GitPython is a Python library used to interact with Git repositories" -optional = false -python-versions = ">=3.7" -files = [ - {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, - {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, -] - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "google-api-core" -version = "2.11.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.11.0.tar.gz", hash = "sha256:4b9bb5d5a380a0befa0573b302651b8a9a89262c1730e37bf423cec511804c22"}, - {file = "google_api_core-2.11.0-py3-none-any.whl", hash = "sha256:ce222e27b0de0d7bc63eb043b956996d6dccab14cc3b690aaea91c9cc99dc16e"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)", "grpcio-status (>=1.49.1,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] - -[[package]] -name = "google-api-python-client" -version = "1.12.11" -description = "Google API Client Library for Python" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -files = [ - {file = "google-api-python-client-1.12.11.tar.gz", hash = "sha256:1b4bd42a46321e13c0542a9e4d96fa05d73626f07b39f83a73a947d70ca706a9"}, - {file = "google_api_python_client-1.12.11-py2.py3-none-any.whl", hash = "sha256:7e0a1a265c8d3088ee1987778c72683fcb376e32bada8d7767162bd9c503fd9b"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.21.0,<3dev", markers = "python_version >= \"3\""} -google-auth = {version = ">=1.16.0,<3dev", markers = "python_version >= \"3\""} -google-auth-httplib2 = ">=0.0.3" -httplib2 = ">=0.15.0,<1dev" -six = ">=1.13.0,<2dev" -uritemplate = ">=3.0.0,<4dev" - -[[package]] -name = "google-auth" -version = "2.17.3" -description = "Google Authentication Library" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" -files = [ - {file = "google-auth-2.17.3.tar.gz", hash = "sha256:ce311e2bc58b130fddf316df57c9b3943c2a7b4f6ec31de9663a9333e4064efc"}, - {file = "google_auth-2.17.3-py2.py3-none-any.whl", hash = "sha256:f586b274d3eb7bd932ea424b1c702a30e0393a2e2bc4ca3eae8263ffd8be229f"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0dev)"] - -[[package]] -name = "google-auth-httplib2" -version = "0.1.0" -description = "Google Authentication Library: httplib2 transport" -optional = false -python-versions = "*" -files = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, -] - -[package.dependencies] -google-auth = "*" -httplib2 = ">=0.15.0" -six = "*" - -[[package]] -name = "googleapis-common-protos" -version = "1.59.0" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis-common-protos-1.59.0.tar.gz", hash = "sha256:4168fcb568a826a52f23510412da405abd93f4d23ba544bb68d943b14ba3cb44"}, - {file = "googleapis_common_protos-1.59.0-py2.py3-none-any.whl", hash = "sha256:b287dc48449d1d41af0c69f4ea26242b5ae4c3d7249a38b0984c86a4caffff1f"}, -] - -[package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] - -[[package]] -name = "httplib2" -version = "0.22.0" -description = "A comprehensive HTTP client library." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, - {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, -] - -[package.dependencies] -pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} - -[[package]] -name = "identify" -version = "2.5.24" -description = "File identification library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, -] - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "imagesize" -version = "1.4.1" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] - -[[package]] -name = "importlib-metadata" -version = "6.6.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "isort" -version = "5.12.0" -description = "A Python utility / library to sort Python imports." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] - -[package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - -[[package]] -name = "jedi" -version = "0.13.3" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "jedi-0.13.3-py2.py3-none-any.whl", hash = "sha256:2c6bcd9545c7d6440951b12b44d373479bf18123a401a52025cf98563fbd826c"}, - {file = "jedi-0.13.3.tar.gz", hash = "sha256:2bb0603e3506f708e792c7f4ad8fc2a7a9d9c2d292a358fbbd58da531695595b"}, -] - -[package.dependencies] -parso = ">=0.3.0" - -[package.extras] -testing = ["colorama", "docopt", "pytest (>=3.1.0)"] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "jinxed" -version = "1.2.0" -description = "Jinxed Terminal Library" -optional = false -python-versions = "*" -files = [ - {file = "jinxed-1.2.0-py2.py3-none-any.whl", hash = "sha256:cfc2b2e4e3b4326954d546ba6d6b9a7a796ddcb0aef8d03161d005177eb0d48b"}, - {file = "jinxed-1.2.0.tar.gz", hash = "sha256:032acda92d5c57cd216033cbbd53de731e6ed50deb63eb4781336ca55f72cda5"}, -] - -[package.dependencies] -ansicon = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "jsonschema" -version = "2.6.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-2.6.0-py2.py3-none-any.whl", hash = "sha256:000e68abd33c972a5248544925a0cae7d1125f9bf6c58280d37546b946769a08"}, - {file = "jsonschema-2.6.0.tar.gz", hash = "sha256:6ff5f3180870836cae40f06fa10419f557208175f13ad7bc26caa77beb1f6e02"}, -] - -[package.extras] -format = ["rfc3987", "strict-rfc3339", "webcolors"] - -[[package]] -name = "keyring" -version = "22.4.0" -description = "Store and access your passwords safely." -optional = false -python-versions = ">=3.6" -files = [ - {file = "keyring-22.4.0-py3-none-any.whl", hash = "sha256:d6c531f6d12f3304db6029af1d19894bd446ecbbadd22465fa0f096b3e12d258"}, - {file = "keyring-22.4.0.tar.gz", hash = "sha256:d981e02d134cc3d636a716fbc3ca967bc9609bae5dc21b0063e4409355993ddf"}, -] - -[package.dependencies] -importlib-metadata = ">=3.6" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] - -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -optional = false -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - -[[package]] -name = "lief" -version = "0.13.1" -description = "Library to instrument executable formats" -optional = false -python-versions = ">=3.8" -files = [ - {file = "lief-0.13.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:b53317d78f8b7528e3f2f358b3f9334a1a84fae88c5aec1a3b7717ed31bfb066"}, - {file = "lief-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb8b285a6c670df590c36fc0c19b9d2e32b99f17e57afa29bb3052f1d55aa50f"}, - {file = "lief-0.13.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:be871116faa698b6d9da76b0caec2ec5b7e7b8781cfb3a4ac0c4e348fb37ab49"}, - {file = "lief-0.13.1-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:c6839df875e912edd3fc553ab5d1b916527adee9c57ba85c69314a93f7ba2e15"}, - {file = "lief-0.13.1-cp310-cp310-win32.whl", hash = "sha256:b1f295dbb57094443926ac6051bee9a1945d92344f470da1cb506060eb2f91ac"}, - {file = "lief-0.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:8439805a389cc67b6d4ea7d757a3211f22298edce53c5b064fdf8bf05fabba54"}, - {file = "lief-0.13.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:3cfbc6c50f9e3a8015cd5ee88dfe83f423562c025439143bbd5c086a3f9fe599"}, - {file = "lief-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:661abaa48bc032b9a7529e0b73d2ced3e4a1f13381592f6b9e940750b07a5ac2"}, - {file = "lief-0.13.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:23617d96d162081f8bf315d9b0494845891f8d0f04ad60991b83367ee9e261aa"}, - {file = "lief-0.13.1-cp311-cp311-manylinux_2_24_x86_64.whl", hash = "sha256:aa7f45c5125be80a513624d3a5f6bd50751c2edc6de5357fde218580111c8535"}, - {file = "lief-0.13.1-cp311-cp311-win32.whl", hash = "sha256:018b542f09fe2305e1585a3e63a7e5132927b835062b456e5c8c571db7784d1e"}, - {file = "lief-0.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:bfbf8885a3643ea9aaf663d039f50ca58b228886c3fe412725b22851aeda3b77"}, - {file = "lief-0.13.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a0472636ab15b9afecf8b5d55966912af8cb4de2f05b98fc05c87d51880d0208"}, - {file = "lief-0.13.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ccfba33c02f21d4ede26ab85eb6539a00e74e236569c13dcbab2e157b73673c4"}, - {file = "lief-0.13.1-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:e414d6c23f26053f4824d080885ab1b75482122796cba7d09cbf157900646289"}, - {file = "lief-0.13.1-cp38-cp38-win32.whl", hash = "sha256:a18fee5cf69adf9d5ee977778ccd46c39c450960f806231b26b69011f81bc712"}, - {file = "lief-0.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:04c87039d1e68ebc467f83136179626403547dd1ce851541345f8ca0b1fe6c5b"}, - {file = "lief-0.13.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0283a4c749afe58be8e21cdd9be79c657c51ca9b8346f75f4b97349b1f022851"}, - {file = "lief-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95a4b6d1f8dba9360aecf7542e54ce5eb02c0e88f2d827b5445594d5d51109f5"}, - {file = "lief-0.13.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:16753bd72b1e3932d94d088a93b64e08c1f6c8bce1b064b47fe66ed73d9562b2"}, - {file = "lief-0.13.1-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:965fadb1301d1a81f16067e4fa743d2be3f6aa71391a83b752ff811ec74b0766"}, - {file = "lief-0.13.1-cp39-cp39-win32.whl", hash = "sha256:57bdb0471760c4ff520f5e5d005e503cc7ea3ebe22df307bb579a1a561b8c4e9"}, - {file = "lief-0.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:a3c900f49c3d3135c728faeb386d13310bb3511eb2d4e1c9b109b48ae2658361"}, -] - -[[package]] -name = "linkify-it-py" -version = "2.0.2" -description = "Links recognition library with FULL unicode support." -optional = false -python-versions = ">=3.7" -files = [ - {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, - {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, -] - -[package.dependencies] -uc-micro-py = "*" - -[package.extras] -benchmark = ["pytest", "pytest-benchmark"] -dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] -doc = ["myst-parser", "sphinx", "sphinx-book-theme"] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "log4mongo" -version = "1.7.0" -description = "mongo database handler for python logging" -optional = false -python-versions = "*" -files = [ - {file = "log4mongo-1.7.0.tar.gz", hash = "sha256:dc374617206162a0b14167fbb5feac01dbef587539a235dadba6200362984a68"}, -] - -[package.dependencies] -pymongo = "*" - -[[package]] -name = "m2r2" -version = "0.3.3.post2" -description = "Markdown and reStructuredText in a single file." -optional = false -python-versions = ">=3.7" -files = [ - {file = "m2r2-0.3.3.post2-py3-none-any.whl", hash = "sha256:86157721eb6eabcd54d4eea7195890cc58fa6188b8d0abea633383cfbb5e11e3"}, - {file = "m2r2-0.3.3.post2.tar.gz", hash = "sha256:e62bcb0e74b3ce19cda0737a0556b04cf4a43b785072fcef474558f2c1482ca8"}, -] - -[package.dependencies] -docutils = ">=0.19" -mistune = "0.8.4" - -[[package]] -name = "markdown-it-py" -version = "2.2.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.7" -files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mdit-py-plugins" -version = "0.3.5" -description = "Collection of plugins for markdown-it-py" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, - {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, -] - -[package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" - -[package.extras] -code-style = ["pre-commit"] -rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -optional = false -python-versions = "*" -files = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "myst-parser" -version = "0.18.1" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." -optional = false -python-versions = ">=3.7" -files = [ - {file = "myst-parser-0.18.1.tar.gz", hash = "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d"}, - {file = "myst_parser-0.18.1-py3-none-any.whl", hash = "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8"}, -] - -[package.dependencies] -docutils = ">=0.15,<0.20" -jinja2 = "*" -markdown-it-py = ">=1.0.0,<3.0.0" -mdit-py-plugins = ">=0.3.1,<0.4.0" -pyyaml = "*" -sphinx = ">=4,<6" -typing-extensions = "*" - -[package.extras] -code-style = ["pre-commit (>=2.12,<3.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme", "sphinx-design", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] -testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=6,<7)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx (<5.2)", "sphinx-pytest"] - -[[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "paramiko" -version = "3.2.0" -description = "SSH2 protocol library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "paramiko-3.2.0-py3-none-any.whl", hash = "sha256:df0f9dd8903bc50f2e10580af687f3015bf592a377cd438d2ec9546467a14eb8"}, - {file = "paramiko-3.2.0.tar.gz", hash = "sha256:93cdce625a8a1dc12204439d45033f3261bdb2c201648cfcdc06f9fd0f94ec29"}, -] - -[package.dependencies] -bcrypt = ">=3.2" -cryptography = ">=3.3" -pynacl = ">=1.5" - -[package.extras] -all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=2.0)"] - -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "patchelf" -version = "0.17.2.1" -description = "A small utility to modify the dynamic linker and RPATH of ELF executables." -optional = false -python-versions = "*" -files = [ - {file = "patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:fc329da0e8f628bd836dfb8eaf523547e342351fa8f739bf2b3fe4a6db5a297c"}, - {file = "patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:ccb266a94edf016efe80151172c26cff8c2ec120a57a1665d257b0442784195d"}, - {file = "patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:f47b5bdd6885cfb20abdd14c707d26eb6f499a7f52e911865548d4aa43385502"}, - {file = "patchelf-0.17.2.1-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.musllinux_1_1_s390x.whl", hash = "sha256:a9e6ebb0874a11f7ed56d2380bfaa95f00612b23b15f896583da30c2059fcfa8"}, - {file = "patchelf-0.17.2.1-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.musllinux_1_1_i686.whl", hash = "sha256:3c8d58f0e4c1929b1c7c45ba8da5a84a8f1aa6a82a46e1cfb2e44a4d40f350e5"}, - {file = "patchelf-0.17.2.1-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:d1a9bc0d4fd80c038523ebdc451a1cce75237cfcc52dbd1aca224578001d5927"}, - {file = "patchelf-0.17.2.1.tar.gz", hash = "sha256:a6eb0dd452ce4127d0d5e1eb26515e39186fa609364274bc1b0b77539cfa7031"}, -] - -[package.extras] -test = ["importlib-metadata", "pytest"] - -[[package]] -name = "pathlib2" -version = "2.3.7.post1" -description = "Object-oriented filesystem paths" -optional = false -python-versions = "*" -files = [ - {file = "pathlib2-2.3.7.post1-py2.py3-none-any.whl", hash = "sha256:5266a0fd000452f1b3467d782f079a4343c63aaa119221fbdc4e39577489ca5b"}, - {file = "pathlib2-2.3.7.post1.tar.gz", hash = "sha256:9fe0edad898b83c0c3e199c842b27ed216645d2e177757b2dd67384d4113c641"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "pillow" -version = "9.5.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "platformdirs" -version = "3.5.1" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, - {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, -] - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "ply" -version = "3.11" -description = "Python Lex & Yacc" -optional = false -python-versions = "*" -files = [ - {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, - {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, -] - -[[package]] -name = "pockets" -version = "0.9.1" -description = "A collection of helpful Python tools!" -optional = false -python-versions = "*" -files = [ - {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"}, - {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"}, -] - -[package.dependencies] -six = ">=1.5.2" - -[[package]] -name = "pre-commit" -version = "3.3.2" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pre_commit-3.3.2-py2.py3-none-any.whl", hash = "sha256:8056bc52181efadf4aac792b1f4f255dfd2fb5a350ded7335d251a68561e8cb6"}, - {file = "pre_commit-3.3.2.tar.gz", hash = "sha256:66e37bec2d882de1f17f88075047ef8962581f83c234ac08da21a0c58953d1f0"}, -] - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "prefixed" -version = "0.7.0" -description = "Prefixed alternative numeric library" -optional = false -python-versions = "*" -files = [ - {file = "prefixed-0.7.0-py2.py3-none-any.whl", hash = "sha256:537b0e4ff4516c4578f277a41d7104f769d6935ae9cdb0f88fed82ec7b3c0ca5"}, - {file = "prefixed-0.7.0.tar.gz", hash = "sha256:0b54d15e602eb8af4ac31b1db21a37ea95ce5890e0741bb0dd9ded493cefbbe9"}, -] - -[[package]] -name = "protobuf" -version = "4.23.2" -description = "" -optional = false -python-versions = ">=3.7" -files = [ - {file = "protobuf-4.23.2-cp310-abi3-win32.whl", hash = "sha256:384dd44cb4c43f2ccddd3645389a23ae61aeb8cfa15ca3a0f60e7c3ea09b28b3"}, - {file = "protobuf-4.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:09310bce43353b46d73ba7e3bca78273b9bc50349509b9698e64d288c6372c2a"}, - {file = "protobuf-4.23.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2cfab63a230b39ae603834718db74ac11e52bccaaf19bf20f5cce1a84cf76df"}, - {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:c52cfcbfba8eb791255edd675c1fe6056f723bf832fa67f0442218f8817c076e"}, - {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:86df87016d290143c7ce3be3ad52d055714ebaebb57cc659c387e76cfacd81aa"}, - {file = "protobuf-4.23.2-cp37-cp37m-win32.whl", hash = "sha256:281342ea5eb631c86697e1e048cb7e73b8a4e85f3299a128c116f05f5c668f8f"}, - {file = "protobuf-4.23.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ce744938406de1e64b91410f473736e815f28c3b71201302612a68bf01517fea"}, - {file = "protobuf-4.23.2-cp38-cp38-win32.whl", hash = "sha256:6c081863c379bb1741be8f8193e893511312b1d7329b4a75445d1ea9955be69e"}, - {file = "protobuf-4.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:25e3370eda26469b58b602e29dff069cfaae8eaa0ef4550039cc5ef8dc004511"}, - {file = "protobuf-4.23.2-cp39-cp39-win32.whl", hash = "sha256:efabbbbac1ab519a514579ba9ec52f006c28ae19d97915951f69fa70da2c9e91"}, - {file = "protobuf-4.23.2-cp39-cp39-win_amd64.whl", hash = "sha256:54a533b971288af3b9926e53850c7eb186886c0c84e61daa8444385a4720297f"}, - {file = "protobuf-4.23.2-py3-none-any.whl", hash = "sha256:8da6070310d634c99c0db7df48f10da495cc283fd9e9234877f0cd182d43ab7f"}, - {file = "protobuf-4.23.2.tar.gz", hash = "sha256:20874e7ca4436f683b64ebdbee2129a5a2c301579a67d1a7dda2cdf62fb7f5f7"}, -] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - -[[package]] -name = "pyasn1" -version = "0.5.0" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.3.0" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" - -[[package]] -name = "pyblish-base" -version = "1.8.11" -description = "Plug-in driven automation framework for content" -optional = false -python-versions = "*" -files = [ - {file = "pyblish-base-1.8.11.tar.gz", hash = "sha256:86dfeec0567430eb7eb25f89a18312054147a729ec66f6ac8c7e421fd15b66e1"}, - {file = "pyblish_base-1.8.11-py2.py3-none-any.whl", hash = "sha256:c321be7020c946fe9dfa11941241bd985a572c5009198b4f9810e5afad1f0b4b"}, -] - -[[package]] -name = "pycodestyle" -version = "2.10.0" -description = "Python style guide checker" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, - {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, -] - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydocstyle" -version = "6.3.0" -description = "Python docstring style checker" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, - {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, -] - -[package.dependencies] -snowballstemmer = ">=2.2.0" - -[package.extras] -toml = ["tomli (>=1.2.3)"] - -[[package]] -name = "pyflakes" -version = "3.0.1" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, - {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, -] - -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pylint" -version = "2.17.4" -description = "python code static checker" -optional = false -python-versions = ">=3.7.2" -files = [ - {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, - {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, -] - -[package.dependencies] -astroid = ">=2.15.4,<=2.17.0-dev0" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = {version = ">=0.2", markers = "python_version < \"3.11\""} -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.8" -platformdirs = ">=2.2.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.10.1" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -spelling = ["pyenchant (>=3.2,<4.0)"] -testutils = ["gitpython (>3)"] - -[[package]] -name = "pymongo" -version = "3.13.0" -description = "Python driver for MongoDB " -optional = false -python-versions = "*" -files = [ - {file = "pymongo-3.13.0-cp27-cp27m-macosx_10_14_intel.whl", hash = "sha256:3ad3a3df830f7df7e0856c2bdb54d19f5bf188bd7420985e18643b8e4d2a075f"}, - {file = "pymongo-3.13.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b96e0e9d2d48948240b510bac81614458fc10adcd3a93240c2fd96448b4efd35"}, - {file = "pymongo-3.13.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f592b202d77923498b32ddc5b376e5fa9ba280d3e16ed56cb8c932fe6d6a478"}, - {file = "pymongo-3.13.0-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:851f2bb52b5cb2f4711171ca925e0e05344a8452972a748a8a8ffdda1e1d72a7"}, - {file = "pymongo-3.13.0-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1c9d23f62a3fa7523d849c4942acc0d9ff7081ebc00c808ee7cfdc070df0687f"}, - {file = "pymongo-3.13.0-cp27-cp27m-win32.whl", hash = "sha256:a17b81f22398e3e0f72bdf938e98c810286994b2bcc0a125cd5ad8fd4ea54ad7"}, - {file = "pymongo-3.13.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4f6dd55dab77adf60b445c11f426ee5cdfa1b86f6d54cb937bfcbf09572333ab"}, - {file = "pymongo-3.13.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:776f90bf2252f90a4ae838e7917638894c6356bef7265f424592e2fd1f577d05"}, - {file = "pymongo-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:50b99f4d3eee6f03778fe841d6f470e6c18e744dc665156da6da3bc6e65b398d"}, - {file = "pymongo-3.13.0-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50a81b2d9f188c7909e0a1084fa969bb92a788076809c437ac1ae80393f46df9"}, - {file = "pymongo-3.13.0-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c7c45a8a1a752002b0a7c81ab3a4c5e3b6f67f9826b16fbe3943f5329f565f24"}, - {file = "pymongo-3.13.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1037097708498bdc85f23c8798a5c46c7bce432d77d23608ff14e0d831f1a971"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux1_i686.whl", hash = "sha256:b5b733694e7df22d5c049581acfc487695a6ff813322318bed8dd66f79978636"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d7c91747ec8dde51440dd594603158cc98abb3f7df84b2ed8a836f138285e4fb"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:f4175fcdddf764d371ee52ec4505a40facee2533e84abf2953cda86d050cfa1f"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:93d4e9a02c17813b34e4bd9f6fbf07310c140c8f74341537c24d07c1cdeb24d1"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:3b261d593f2563299062733ae003a925420a86ff4ddda68a69097d67204e43f3"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:172db03182a22e9002157b262c1ea3b0045c73d4ff465adc152ce5b4b0e7b8d4"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09de3bfc995ae8cb955abb0c9ae963c134dba1b5622be3bcc527b89b0fd4091c"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0379447587ee4b8f983ba183202496e86c0358f47c45612619d634d1fcd82bd"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30245a8747dc90019a3c9ad9df987e0280a3ea632ad36227cde7d1d8dcba0830"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6fddf6a7b91da044f202771a38e71bbb9bf42720a406b26b25fe2256e7102"}, - {file = "pymongo-3.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5831a377d15a626fbec10890ffebc4c6abcd37e4126737932cd780a171eabdc1"}, - {file = "pymongo-3.13.0-cp310-cp310-win32.whl", hash = "sha256:944249aa83dee314420c37d0f40c30a8f6dc4a3877566017b87062e53af449f4"}, - {file = "pymongo-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea8824ebc9a1a5c8269e8f1e3989b5a6bec876726e2f3c33ebd036cb488277f0"}, - {file = "pymongo-3.13.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdd34c57b4da51a7961beb33645646d197e41f8517801dc76b37c1441e7a4e10"}, - {file = "pymongo-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f9cc42a162faa241c82e117ac85734ae9f14343dc2df1c90c6b2181f791b22"}, - {file = "pymongo-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a82a1c10f5608e6494913faa169e213d703194bfca0aa710901f303be212414"}, - {file = "pymongo-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8927f22ef6a16229da7f18944deac8605bdc2c0858be5184259f2f7ce7fd4459"}, - {file = "pymongo-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f8191a282ef77e526f8f8f63753a437e4aa4bc78f5edd8b6b6ed0eaebd5363"}, - {file = "pymongo-3.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d9ed67c987bf9ac2ac684590ba3d2599cdfb0f331ee3db607f9684469b3b59d"}, - {file = "pymongo-3.13.0-cp311-cp311-win32.whl", hash = "sha256:e8f6979664ff477cd61b06bf8aba206df7b2334209815ab3b1019931dab643d6"}, - {file = "pymongo-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:174fd1000e896d0dfbc7f6d7e6a1992a4868796c7dec31679e38218c78d6a942"}, - {file = "pymongo-3.13.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:d1ee773fb72ba024e7e3bb6ea8907fe52bccafcb5184aaced6bad995bd30ea20"}, - {file = "pymongo-3.13.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:28565e3dbd69fe5fe35a210067064dbb6ed5abe997079f653c19c873c3896fe6"}, - {file = "pymongo-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5c1db7d366004d6c699eb08c716a63ae0a3e946d061cbebea65d7ce361950265"}, - {file = "pymongo-3.13.0-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1956f3338c10308e2f99c2c9ff46ae412035cbcd7aaa76c39ccdb806854a247"}, - {file = "pymongo-3.13.0-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:10f0fddc1d63ba3d4a4bffcc7720184c1b7efd570726ad5e2f55818da320239f"}, - {file = "pymongo-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:570ae3365b23d4fd8c669cb57613b1a90b2757e993588d3370ef90945dbeec4b"}, - {file = "pymongo-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:79f777eaf3f5b2c6d81f9ef00d87837001d7063302503bbcbfdbf3e9bc27c96f"}, - {file = "pymongo-3.13.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:d42eb29ba314adfd9c11234b4b646f61b0448bf9b00f14db4b317e6e4b947e77"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e5e87c0eb774561c546f979342a8ff36ebee153c60a0b6c6b03ba989ceb9538c"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0f2c5a5984599a88d087a15859860579b825098b473d8c843f1979a83d159f2e"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:59c98e86c5e861032b71e6e5b65f23e6afaacea6e82483b66f1191a5021a7b4f"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:70b67390e27e58876853efbb87e43c85252de2515e2887f7dd901b4fa3d21973"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:42ba8606492d76e6f9e4c7a458ed4bc712603be393259a52450345f0945da2cf"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:0e5536994cf2d8488c6fd9dea71df3c4dbb3e0d2ba5e695da06d9142a29a0969"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:fe8194f107f0fa3cabd14e9e809f174eca335993c1db72d1e74e0f496e7afe1f"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d593d50815771f517d3ac4367ff716e3f3c78edae51d98e1e25791459f8848ff"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5136ebe8da6a1604998a8eb96be55935aa5f7129c41cc7bddc400d48e8df43be"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a424bdedfd84454d2905a861e0d4bb947cc5bd024fdeb3600c1a97d2be0f4255"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5161167b3840e9c84c80f2534ea6a099f51749d5673b662a3dd248be17c3208"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644470442beaf969df99c4e00367a817eee05f0bba5d888f1ba6fe97b5e1c102"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2406df90b2335371706c59b7d79e9633b81ed2a7ecd48c1faf8584552bdf2d90"}, - {file = "pymongo-3.13.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:222591b828de10ac90064047b5d4916953f38c38b155009c4b8b5e0d33117c2b"}, - {file = "pymongo-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:7cb987b199fa223ad78eebaa9fbc183d5a5944bfe568a9d6f617316ca1c1f32f"}, - {file = "pymongo-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6cbb73d9fc2282677e2b7a137d13da987bd0b13abd88ed27bba5534c226db06"}, - {file = "pymongo-3.13.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:b1223b826acbef07a7f5eb9bf37247b0b580119916dca9eae19d92b1290f5855"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:398fb86d374dc351a4abc2e24cd15e5e14b2127f6d90ce0df3fdf2adcc55ac1b"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9c3d07ea19cd2856d9943dce37e75d69ecbb5baf93c3e4c82f73b6075c481292"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:2943d739715f265a2983ac43747595b6af3312d0a370614040959fd293763adf"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:c3b70ed82f20d18d22eafc9bda0ea656605071762f7d31f3c5afc35c59d3393b"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:7ec2bb598847569ae34292f580842d37619eea3e546005042f485e15710180d5"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:8cc37b437cba909bef06499dadd91a39c15c14225e8d8c7870020049f8a549fe"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:65a063970e15a4f338f14b820561cf6cdaf2839691ac0adb2474ddff9d0b8b0b"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02f0e1a75d3bc0e16c7e15daf9c56185642be055e425f3b34888fc6eb1b22401"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e74b9c2aca2734c7f49f00fe68d6830a30d26df60e2ace7fe40ccb92087b94"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24e954be35ad4537840f20bbc8d75320ae647d3cb4fab12cb8fcd2d55f408e76"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a149377d1ff766fd618500798d0d94637f66d0ae222bb6d28f41f3e15c626297"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61660710b054ae52c8fc10368e91d74719eb05554b631d7f8ca93d21d2bff2e6"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bbc0d27dfef7689285e54f2e0a224f0c7cd9d5c46d2638fabad5500b951c92f"}, - {file = "pymongo-3.13.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b2ed9c3b30f11cd4a3fbfc22167af7987b01b444215c2463265153fe7cf66d6"}, - {file = "pymongo-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:1c2c5e2b00e2fadcd590c0b2e293d71215e98ed1cb635cfca2be4998d197e534"}, - {file = "pymongo-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:32eac95bbb030b2376ffd897376c6f870222a3457f01a9ce466b9057876132f8"}, - {file = "pymongo-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a796ef39dadf9d73af05d24937644d386495e43a7d13617aa3651d836da542c8"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b6793baf4639c72a500698a49e9250b293e17ae1faf11ac1699d8141194786fe"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:80d8576b04d0824f63bf803190359c0d3bcb6e7fa63fefbd4bc0ceaa7faae38c"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:db2e11507fe9cc2a722be21ccc62c1b1295398fe9724c1f14900cdc7166fc0d7"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:b01ce58eec5edeededf1992d2dce63fb8565e437be12d6f139d75b15614c4d08"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:d1a19d6c5098f1f4e11430cd74621699453cbc534dd7ade9167e582f50814b19"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:7219b1a726ced3bacecabef9bd114529bbb69477901373e800d7d0140baadc95"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:2dae3b353a10c3767e0aa1c1492f2af388f1012b08117695ab3fd1f219e5814e"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12721d926d43d33dd3318e58dce9b0250e8a9c6e1093fa8e09f4805193ff4b43"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6af0a4b17faf26779d5caee8542a4f2cba040cea27d3bffc476cbc6ccbd4c8ee"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b9d0f5a445c7e0ddcc021b09835aa6556f0166afc498f57dfdd72cdf6f02ad"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db5b4f8ad8607a3d612da1d4c89a84e4cf5c88f98b46365820d9babe5884ba45"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dbf5fecf653c152edb75a35a8b15dfdc4549473484ee768aeb12c97983cead"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34cd48df7e1fc69222f296d8f69e3957eb7c6b5aa0709d3467184880ed7538c0"}, - {file = "pymongo-3.13.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c8f755ff1f4ab4ca790d1d6d3229006100b301475948021b6b2757822e0d6c97"}, - {file = "pymongo-3.13.0-cp38-cp38-win32.whl", hash = "sha256:b0746d0d4535f56bbaa63a8f6da362f330804d578e66e126b226eebe76c2bf00"}, - {file = "pymongo-3.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:8ad0515abb132f52ce9d8abd1a29681a1e65dba7b7fe13ea01e1a8db5715bf80"}, - {file = "pymongo-3.13.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3c5cb6c93c94df76a879bad4b89db0104b01806d17c2b803c1316ba50962b6d6"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2e0854170813238f0c3131050c67cb1fb1ade75c93bf6cd156c1bd9a16095528"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1410faa51ce835cc1234c99ec42e98ab4f3c6f50d92d86a2d4f6e11c97ee7a4e"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d7910135f5de1c5c3578e61d6f4b087715b15e365f11d4fa51a9cee92988b2bd"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:028175dd8d2979a889153a2308e8e500b3df7d9e3fd1c33ca7fdeadf61cc87a2"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:2bfc39276c0e6d07c95bd1088b5003f049e986e089509f7dbd68bb7a4b1e65ac"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:4092b660ec720d44d3ca81074280dc25c7a3718df1b6c0fe9fe36ac6ed2833e4"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:5bdeb71a610a7b801416268e500e716d0fe693fb10d809e17f0fb3dac5be5a34"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3bca8e76f5c00ed2bb4325e0e383a547d71595926d5275d7c88175aaf7435e"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c7cab8155f430ca460a6fc7ae8a705b34f3e279a57adb5f900eb81943ec777c"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a32f3dfcca4a4816373bdb6256c18c78974ebb3430e7da988516cd95b2bd6e4"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ed2788a6ec68743e2040ab1d16573d7d9f6e7333e45070ce9268cbc93d148c"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e61a536ffed84d10376c21c13a6ed1ebefb61989a844952547c229d6aeedf3"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0665412dce26b2318092a33bd2d2327d487c4490cfcde158d6946d39b1e28d78"}, - {file = "pymongo-3.13.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64ed1a5ce5e5926727eb0f87c698c4d9a7a9f7b0953683a65e9ce2b7cc5f8e91"}, - {file = "pymongo-3.13.0-cp39-cp39-win32.whl", hash = "sha256:7593cb1214185a0c5b43b96effc51ce82ddc933298ee36db7dc2bd45d61b4adc"}, - {file = "pymongo-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:3cfc9bc1e8b5667bc1f3dbe46d2f85b3f24ff7533893bdc1203058012db2c046"}, - {file = "pymongo-3.13.0.tar.gz", hash = "sha256:e22d6cf5802cd09b674c307cc9e03870b8c37c503ebec3d25b86f2ce8c535dc7"}, -] - -[package.extras] -aws = ["pymongo-auth-aws (<2.0.0)"] -encryption = ["pymongocrypt (>=1.1.0,<2.0.0)"] -gssapi = ["pykerberos"] -ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] -snappy = ["python-snappy"] -srv = ["dnspython (>=1.16.0,<1.17.0)"] -tls = ["ipaddress"] -zstd = ["zstandard"] - -[[package]] -name = "pynacl" -version = "1.5.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] - -[package.dependencies] -cffi = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] - -[[package]] -name = "pynput" -version = "1.7.6" -description = "Monitor and control user input devices" -optional = false -python-versions = "*" -files = [ - {file = "pynput-1.7.6-py2.py3-none-any.whl", hash = "sha256:19861b2a0c430d646489852f89500e0c9332e295f2c020e7c2775e7046aa2e2f"}, - {file = "pynput-1.7.6.tar.gz", hash = "sha256:3a5726546da54116b687785d38b1db56997ce1d28e53e8d22fc656d8b92e533c"}, -] - -[package.dependencies] -evdev = {version = ">=1.3", markers = "sys_platform in \"linux\""} -pyobjc-framework-ApplicationServices = {version = ">=8.0", markers = "sys_platform == \"darwin\""} -pyobjc-framework-Quartz = {version = ">=8.0", markers = "sys_platform == \"darwin\""} -python-xlib = {version = ">=0.17", markers = "sys_platform in \"linux\""} -six = "*" - -[[package]] -name = "pyobjc-core" -version = "9.1.1" -description = "Python<->ObjC Interoperability Module" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyobjc-core-9.1.1.tar.gz", hash = "sha256:4b6cb9053b5fcd3c0e76b8c8105a8110786b20f3403c5643a688c5ec51c55c6b"}, - {file = "pyobjc_core-9.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4bd07049fd9fe5b40e4b7c468af9cf942508387faf383a5acb043d20627bad2c"}, - {file = "pyobjc_core-9.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a8307527621729ff2ab67860e7ed84f76ad0da881b248c2ef31e0da0088e4ba"}, - {file = "pyobjc_core-9.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:083004d28b92ccb483a41195c600728854843b0486566aba2d6e63eef51f80e6"}, - {file = "pyobjc_core-9.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d61e9517d451bc062a7fae8b3648f4deba4fa54a24926fa1cf581b90ef4ced5a"}, - {file = "pyobjc_core-9.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1626909916603a3b04c07c721cf1af0e0b892cec85bb3db98d05ba024f1786fc"}, - {file = "pyobjc_core-9.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2dde96462b52e952515d142e2afbb6913624a02c13582047e06211e6c3993728"}, -] - -[[package]] -name = "pyobjc-framework-applicationservices" -version = "9.1.1" -description = "Wrappers for the framework ApplicationServices on macOS" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyobjc-framework-ApplicationServices-9.1.1.tar.gz", hash = "sha256:50c613bee364150bbd6cd992ca32b0848a780922cb57d112f6a4a56e29802e19"}, - {file = "pyobjc_framework_ApplicationServices-9.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9286c05d80a6aafc7388a4c2a35801db9ea6bab960acf2df079110debb659cb"}, - {file = "pyobjc_framework_ApplicationServices-9.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3db1c79d7420052320529432e8562cd339a7ef0841df83a85bbf3648abb55b6b"}, - {file = "pyobjc_framework_ApplicationServices-9.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:baf5a0d72c9e2d2a3b402823a2ea53eccdc27b8b9319d61cee7d753a30cb9411"}, - {file = "pyobjc_framework_ApplicationServices-9.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7cc5aad93bb6b178f838fe9b78cdcf1217c7baab157b1f3525e0acf696cc3490"}, - {file = "pyobjc_framework_ApplicationServices-9.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a03434605873b9f83255a0b16bbc539d06afd77f5969a3b11a1fc293dfd56680"}, - {file = "pyobjc_framework_ApplicationServices-9.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9f18e9b92674be0e503a2bd451a328693450e6f80ee510bbc375238b14117e24"}, -] - -[package.dependencies] -pyobjc-core = ">=9.1.1" -pyobjc-framework-Cocoa = ">=9.1.1" -pyobjc-framework-Quartz = ">=9.1.1" - -[[package]] -name = "pyobjc-framework-cocoa" -version = "9.1.1" -description = "Wrappers for the Cocoa frameworks on macOS" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyobjc-framework-Cocoa-9.1.1.tar.gz", hash = "sha256:345c32b6d1f3db45f635e400f2d0d6c0f0f7349d45ec823f76fc1df43d13caeb"}, - {file = "pyobjc_framework_Cocoa-9.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9176a4276f3b4b4758e9b9ca10698be5341ceffaeaa4fa055133417179e6bc37"}, - {file = "pyobjc_framework_Cocoa-9.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5e1e96fb3461f46ff951413515f2029e21be268b0e033db6abee7b64ec8e93d3"}, - {file = "pyobjc_framework_Cocoa-9.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:083b195c496d30c6b9dd86126a6093c4b95e0138e9b052b13e54103fcc0b4872"}, - {file = "pyobjc_framework_Cocoa-9.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1b3333b1aa045608848bd68bbab4c31171f36aeeaa2fabeb4527c6f6f1e33cd"}, - {file = "pyobjc_framework_Cocoa-9.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:54c017354671f0d955432986c42218e452ca69906a101c8e7acde8510432303a"}, - {file = "pyobjc_framework_Cocoa-9.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:10c0075688ce95b92caf59e368585fffdcc98c919bc345067af070222f5d01d2"}, -] - -[package.dependencies] -pyobjc-core = ">=9.1.1" - -[[package]] -name = "pyobjc-framework-quartz" -version = "9.1.1" -description = "Wrappers for the Quartz frameworks on macOS" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyobjc-framework-Quartz-9.1.1.tar.gz", hash = "sha256:8d03bc52bd6d90f00f274fd709b82e53dc5dfca19f3fc744997634e03faaa159"}, - {file = "pyobjc_framework_Quartz-9.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32602f46353a5eadb0843a0940635c8ec103f47d5b1ce84284604e01c6393fa8"}, - {file = "pyobjc_framework_Quartz-9.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b3a56f52f9bb7fbd45c5a5f0de312ee9c104dfce6e1731015048d9e65a95e43"}, - {file = "pyobjc_framework_Quartz-9.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b3138773dfb269e6e3894e20dcfaf90102bad84ba44aa2bba8683b8426a69cdd"}, - {file = "pyobjc_framework_Quartz-9.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b583e6953e9c65525db908c33c1c97cead3ac8aa0cf2759fcc568666a1b7373"}, - {file = "pyobjc_framework_Quartz-9.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:c3efcbba62e9c5351c2a9469faabb7f400f214cd8cf98f57798d6b6c93c76efb"}, - {file = "pyobjc_framework_Quartz-9.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a82d43c6c5fe0f5d350cfc97212bef7c572e345aa9c6e23909d23dace6448c99"}, -] - -[package.dependencies] -pyobjc-core = ">=9.1.1" -pyobjc-framework-Cocoa = ">=9.1.1" - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] - -[[package]] -name = "pysftp" -version = "0.2.9" -description = "A friendly face on SFTP" -optional = false -python-versions = "*" -files = [ - {file = "pysftp-0.2.9.tar.gz", hash = "sha256:fbf55a802e74d663673400acd92d5373c1c7ee94d765b428d9f977567ac4854a"}, -] - -[package.dependencies] -paramiko = ">=1.17" - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "4.1.0" -description = "Pytest plugin for measuring coverage." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, -] - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] - -[[package]] -name = "pytest-print" -version = "0.3.1" -description = "pytest-print adds the printer fixture you can use to print messages to the user (directly to the pytest runner, not stdout)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest_print-0.3.1-py2.py3-none-any.whl", hash = "sha256:3be6c66e4b23e53b489edfdf16857da9adf2c309dcc7c6fea01ae2ce3c7542ed"}, - {file = "pytest_print-0.3.1.tar.gz", hash = "sha256:60457fbef7ce49936484a65ee6fd5f8dc95a1309f2c9ea707f98324d92e8527b"}, -] - -[package.dependencies] -pytest = ">=6" - -[package.extras] -test = ["coverage (>=5)"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-engineio" -version = "4.4.1" -description = "Engine.IO server and client for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-engineio-4.4.1.tar.gz", hash = "sha256:eb3663ecb300195926b526386f712dff84cd092c818fb7b62eeeda9160120c29"}, - {file = "python_engineio-4.4.1-py3-none-any.whl", hash = "sha256:28ab67f94cba2e5f598cbb04428138fd6bb8b06d3478c939412da445f24f0773"}, -] - -[package.extras] -asyncio-client = ["aiohttp (>=3.4)"] -client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] - -[[package]] -name = "python-socketio" -version = "5.8.0" -description = "Socket.IO server and client for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-socketio-5.8.0.tar.gz", hash = "sha256:e714f4dddfaaa0cb0e37a1e2deef2bb60590a5b9fea9c343dd8ca5e688416fd9"}, - {file = "python_socketio-5.8.0-py3-none-any.whl", hash = "sha256:7adb8867aac1c2929b9c1429f1c02e12ca4c36b67c807967393e367dfbb01441"}, -] - -[package.dependencies] -bidict = ">=0.21.0" -python-engineio = ">=4.3.0" -requests = {version = ">=2.21.0", optional = true, markers = "extra == \"client\""} -websocket-client = {version = ">=0.54.0", optional = true, markers = "extra == \"client\""} - -[package.extras] -asyncio-client = ["aiohttp (>=3.4)"] -client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] - -[[package]] -name = "python-xlib" -version = "0.33" -description = "Python X Library" -optional = false -python-versions = "*" -files = [ - {file = "python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32"}, - {file = "python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398"}, -] - -[package.dependencies] -six = ">=1.10.0" - -[[package]] -name = "python3-xlib" -version = "0.15" -description = "Python3 X Library" -optional = false -python-versions = "*" -files = [ - {file = "python3-xlib-0.15.tar.gz", hash = "sha256:dc4245f3ae4aa5949c1d112ee4723901ade37a96721ba9645f2bfa56e5b383f8"}, -] - -[[package]] -name = "pywin32" -version = "301" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, - {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, - {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, - {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, - {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, - {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, - {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, - {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, - {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, - {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, -] - -[[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "qt-py" -version = "1.3.8" -description = "Python 2 & 3 compatibility wrapper around all Qt bindings - PySide, PySide2, PyQt4 and PyQt5." -optional = false -python-versions = "*" -files = [ - {file = "Qt.py-1.3.8-py2.py3-none-any.whl", hash = "sha256:665b9d4cfefaff2d697876d5027e145a0e0b1ba62dda9652ea114db134bc9911"}, - {file = "Qt.py-1.3.8.tar.gz", hash = "sha256:6d330928f7ec8db8e329b19116c52482b6abfaccfa5edef0248e57d012300895"}, -] - -[package.dependencies] -types-PySide2 = "*" - -[[package]] -name = "qtawesome" -version = "0.7.3" -description = "FontAwesome icons in PyQt and PySide applications" -optional = false -python-versions = "*" -files = [ - {file = "QtAwesome-0.7.3-py2.py3-none-any.whl", hash = "sha256:ddf4530b4af71cec13b24b88a4cdb56ec85b1e44c43c42d0698804c7137b09b0"}, - {file = "QtAwesome-0.7.3.tar.gz", hash = "sha256:b98b9038d19190e83ab26d91c4d8fc3a36591ee2bc7f5016d4438b8240d097bd"}, -] - -[package.dependencies] -qtpy = "*" -six = "*" - -[[package]] -name = "qtpy" -version = "2.3.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = false -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.3.1-py3-none-any.whl", hash = "sha256:5193d20e0b16e4d9d3bc2c642d04d9f4e2c892590bd1b9c92bfe38a95d5a2e12"}, - {file = "QtPy-2.3.1.tar.gz", hash = "sha256:a8c74982d6d172ce124d80cafd39653df78989683f760f2281ba91a6e7b9de8b"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - -[[package]] -name = "recommonmark" -version = "0.7.1" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -optional = false -python-versions = "*" -files = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] - -[package.dependencies] -commonmark = ">=0.8.1" -docutils = ">=0.11" -sphinx = ">=1.3.1" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "revitron-sphinx-theme" -version = "0.7.2" -description = "Revitron theme for Sphinx" -optional = false -python-versions = "*" -files = [] -develop = false - -[package.dependencies] -sphinx = "*" - -[package.extras] -dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client"] - -[package.source] -type = "git" -url = "https://github.com/revitron/revitron-sphinx-theme.git" -reference = "master" -resolved_reference = "c0779c66365d9d258d93575ebaff7db9d3aee282" - -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "semver" -version = "2.13.0" -description = "Python helper for Semantic Versioning (http://semver.org/)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, - {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, -] - -[[package]] -name = "setuptools" -version = "65.7.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-65.7.0-py3-none-any.whl", hash = "sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd"}, - {file = "setuptools-65.7.0.tar.gz", hash = "sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "shotgun-api3" -version = "3.3.3" -description = "Shotgun Python API" -optional = false -python-versions = "*" -files = [] -develop = false - -[package.source] -type = "git" -url = "https://github.com/shotgunsoftware/python-api.git" -reference = "v3.3.3" -resolved_reference = "b9f066c0edbea6e0733242e18f32f75489064840" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "slack-sdk" -version = "3.21.3" -description = "The Slack API Platform SDK for Python" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "slack_sdk-3.21.3-py2.py3-none-any.whl", hash = "sha256:de3c07b92479940b61cd68c566f49fbc9974c8f38f661d26244078f3903bb9cc"}, - {file = "slack_sdk-3.21.3.tar.gz", hash = "sha256:20829bdc1a423ec93dac903470975ebf3bc76fd3fd91a4dadc0eeffc940ecb0c"}, -] - -[package.extras] -optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=10,<11)"] -testing = ["Flask (>=1,<2)", "Flask-Sockets (>=0.2,<1)", "Jinja2 (==3.0.3)", "Werkzeug (<2)", "black (==22.8.0)", "boto3 (<=2)", "click (==8.0.4)", "databases (>=0.5)", "flake8 (>=5,<6)", "itsdangerous (==1.1.0)", "moto (>=3,<4)", "psutil (>=5,<6)", "pytest (>=6.2.5,<7)", "pytest-asyncio (<1)", "pytest-cov (>=2,<3)"] - -[[package]] -name = "smmap" -version = "5.0.0" -description = "A pure Python implementation of a sliding window memory map manager" -optional = false -python-versions = ">=3.6" -files = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -optional = false -python-versions = "*" -files = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] - -[[package]] -name = "speedcopy" -version = "2.1.4" -description = "Replacement or alternative for python copyfile() utilizing server side copy on network shares for faster copying." -optional = false -python-versions = "*" -files = [ - {file = "speedcopy-2.1.4-py3-none-any.whl", hash = "sha256:e09eb1de67ae0e0b51d5b99a28882009d565a37a3cb3c6bae121e3a5d3cccb17"}, - {file = "speedcopy-2.1.4.tar.gz", hash = "sha256:eff007a97e49ec1934df4fa8074f4bd1cf4a3b14c5499d914988785cff0c199a"}, -] - -[[package]] -name = "sphinx" -version = "5.3.0" -description = "Python documentation generator" -optional = false -python-versions = ">=3.6" -files = [ - {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, - {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, -] - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.20" -imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.12" -requests = ">=2.5.0" -snowballstemmer = ">=2.0" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] - -[[package]] -name = "sphinx-autoapi" -version = "2.1.0" -description = "Sphinx API documentation generator" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx-autoapi-2.1.0.tar.gz", hash = "sha256:5b5c58064214d5a846c9c81d23f00990a64654b9bca10213231db54a241bc50f"}, - {file = "sphinx_autoapi-2.1.0-py2.py3-none-any.whl", hash = "sha256:b25c7b2cda379447b8c36b6a0e3bdf76e02fd64f7ca99d41c6cbdf130a01768f"}, -] - -[package.dependencies] -astroid = ">=2.7" -Jinja2 = "*" -PyYAML = "*" -sphinx = ">=5.2.0" -unidecode = "*" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -dotnet = ["sphinxcontrib-dotnetdomain"] -go = ["sphinxcontrib-golangdomain"] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.4" -description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -optional = false -python-versions = ">=3.8" -files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.1" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["html5lib", "pytest"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] - -[package.extras] -test = ["flake8", "mypy", "pytest"] - -[[package]] -name = "sphinxcontrib-napoleon" -version = "0.7" -description = "Sphinx \"napoleon\" extension." -optional = false -python-versions = "*" -files = [ - {file = "sphinxcontrib-napoleon-0.7.tar.gz", hash = "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8"}, - {file = "sphinxcontrib_napoleon-0.7-py2.py3-none-any.whl", hash = "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef"}, -] - -[package.dependencies] -pockets = ">=0.3" -six = ">=1.5.2" - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "stone" -version = "3.3.1" -description = "Stone is an interface description language (IDL) for APIs." -optional = false -python-versions = "*" -files = [ - {file = "stone-3.3.1-py2-none-any.whl", hash = "sha256:cd2f7f9056fc39b16c8fd46a26971dc5ccd30b5c2c246566cd2c0dd27ff96609"}, - {file = "stone-3.3.1-py3-none-any.whl", hash = "sha256:e15866fad249c11a963cce3bdbed37758f2e88c8ff4898616bc0caeb1e216047"}, - {file = "stone-3.3.1.tar.gz", hash = "sha256:4ef0397512f609757975f7ec09b35639d72ba7e3e17ce4ddf399578346b4cb50"}, -] - -[package.dependencies] -ply = ">=3.4" -six = ">=1.12.0" - -[[package]] -name = "termcolor" -version = "1.1.0" -description = "ANSII Color formatting for output in terminal." -optional = false -python-versions = "*" -files = [ - {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, -] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tomlkit" -version = "0.11.8" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, - {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, -] - -[[package]] -name = "types-pyside2" -version = "5.15.2.1.5" -description = "The most accurate stubs for PySide2" -optional = false -python-versions = "*" -files = [ - {file = "types_PySide2-5.15.2.1.5-py2.py3-none-any.whl", hash = "sha256:4bbee2c8f09961101013d05bb5c506b7351b3020494fc8b5c3b73c95014fa1b0"}, -] - -[[package]] -name = "typing-extensions" -version = "4.6.2" -description = "Backported and Experimental Type Hints for Python 3.7+" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.6.2-py3-none-any.whl", hash = "sha256:3a8b36f13dd5fdc5d1b16fe317f5668545de77fa0b8e02006381fd49d731ab98"}, - {file = "typing_extensions-4.6.2.tar.gz", hash = "sha256:06006244c70ac8ee83fa8282cb188f697b8db25bc8b4df07be1873c43897060c"}, -] - -[[package]] -name = "uc-micro-py" -version = "1.0.2" -description = "Micro subset of unicode data files for linkify-it-py projects." -optional = false -python-versions = ">=3.7" -files = [ - {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, - {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, -] - -[package.extras] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "unidecode" -version = "1.2.0" -description = "ASCII transliterations of Unicode text" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Unidecode-1.2.0-py2.py3-none-any.whl", hash = "sha256:12435ef2fc4cdfd9cf1035a1db7e98b6b047fe591892e81f34e94959591fad00"}, - {file = "Unidecode-1.2.0.tar.gz", hash = "sha256:8d73a97d387a956922344f6b74243c2c6771594659778744b2dbdaad8f6b727d"}, -] - -[[package]] -name = "uritemplate" -version = "3.0.1" -description = "URI templates" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "uritemplate-3.0.1-py2.py3-none-any.whl", hash = "sha256:07620c3f3f8eed1f12600845892b0e036a2420acf513c53f7de0abd911a5894f"}, - {file = "uritemplate-3.0.1.tar.gz", hash = "sha256:5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae"}, -] - -[[package]] -name = "urllib3" -version = "1.26.16" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "virtualenv" -version = "20.23.0" -description = "Virtual Python Environment builder" -optional = false -python-versions = ">=3.7" -files = [ - {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, - {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, -] - -[package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.11,<4" -platformdirs = ">=3.2,<4" - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] - -[[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, -] - -[[package]] -name = "websocket-client" -version = "0.59.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, - {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "wheel" -version = "0.40.0" -description = "A built-package format for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)"] - -[[package]] -name = "wrapt" -version = "1.15.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, -] - -[[package]] -name = "wsrpc-aiohttp" -version = "3.2.0" -description = "WSRPC is the RPC over WebSocket for aiohttp" -optional = false -python-versions = ">3.5.*, <4" -files = [ - {file = "wsrpc-aiohttp-3.2.0.tar.gz", hash = "sha256:f467abc51bcdc760fc5aeb7041abdeef46eeca3928dc43dd6e7fa7a533563818"}, - {file = "wsrpc_aiohttp-3.2.0-py3-none-any.whl", hash = "sha256:fa9b0bf5cb056898cb5c9f64cbc5eacb8a5dd18ab1b7f0cd4a2208b4a7fde282"}, -] - -[package.dependencies] -aiohttp = "<4" -yarl = "*" - -[package.extras] -develop = ["Sphinx", "async-timeout", "coverage (!=4.3)", "coveralls", "pytest", "pytest-aiohttp", "pytest-cov", "sphinxcontrib-plantuml", "tox (>=2.4)"] -testing = ["async-timeout", "coverage (!=4.3)", "coveralls", "pytest", "pytest-aiohttp", "pytest-cov"] -ujson = ["ujson"] - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[extras] -docs = [] - -[metadata] -lock-version = "2.0" -python-versions = "~3.9" -content-hash = "bc3e256094db6e33894840bb6a5adda4473d3736b852433ad8d5bd478c7e0c1c" diff --git a/poetry.toml b/poetry.toml deleted file mode 100644 index 19eca443f8..0000000000 --- a/poetry.toml +++ /dev/null @@ -1,5 +0,0 @@ -[virtualenvs] -in-project = true - -[repositories.pype] -url = "https://distribute.openpype.io/wheels/" diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 453833aae2..0000000000 --- a/pyproject.toml +++ /dev/null @@ -1,188 +0,0 @@ -[tool.poetry] -name = "OpenPype" -version = "3.18.6" # OpenPype -description = "Open VFX and Animation pipeline with support." -authors = ["OpenPype Team "] -license = "MIT License" -homepage = "https://openpype.io" -documentation = "https://openpype.io/docs/artist_getting_started" -repository = "https://github.com/pypeclub/openpype" -readme = "README.md" -keywords = ["Pipeline", "Avalon", "VFX", "animation", "automation", "tracking", "asset management"] -packages = [ - {include = "igniter"}, - {include = "repos"}, - {include = "tools"}, - {include = "tests"}, - {include = "docs"}, - {include = "openpype"}, - {include = "start.py"}, - {include = "LICENSE"}, - {include = "README.md"}, - {include = "setup.py"}, - {include = "pyproject.toml"}, - {include = "poetry.lock"} -] - -[tool.poetry.scripts] -openpype = 'start:boot' - -[tool.poetry.dependencies] -python = ">=3.9.1,<3.10" -aiohttp = "^3.7" -aiohttp_json_rpc = "*" # TVPaint server -acre = { git = "https://github.com/pypeclub/acre.git" } -appdirs = { git = "https://github.com/ActiveState/appdirs.git", branch = "master" } -blessed = "^1.17" # openpype terminal formatting -coolname = "*" -clique = "1.6.*" -Click = "7.1.2" -dnspython = "^2.1.0" -ftrack-python-api = "^2.3.3" -arrow = "^0.17" -shotgun_api3 = {git = "https://github.com/shotgunsoftware/python-api.git", rev = "v3.3.3"} -gazu = "^0.9.3" -google-api-python-client = "^1.12.8" # sync server google support (should be separate?) -jsonschema = "^2.6.0" -keyring = "^22.0.1" -log4mongo = "^1.7" -pathlib2= "^2.3.5" # deadline submit publish job only (single place, maybe not needed?) -Pillow = "^9.0" # used in TVPaint and for slates -pyblish-base = "^1.8.11" -pynput = "^1.7.2" # idle manager in tray -pymongo = "^3.11.2" -"Qt.py" = "^1.3.3" -QtPy = "^2.3.0" -qtawesome = "0.7.3" -speedcopy = "^2.1" -six = "^1.15" -urllib3 = "1.26.16" -semver = "^2.13.0" # for version resolution -wsrpc_aiohttp = "^3.1.1" # websocket server -pywin32 = { version = "301", markers = "sys_platform == 'win32'" } -jinxed = [ - { version = "^1.0.1", markers = "sys_platform == 'darwin'" }, - { version = "^1.0.1", markers = "sys_platform == 'linux'" } -] -python3-xlib = { version="*", markers = "sys_platform == 'linux'"} -enlighten = "^1.9.0" -slack-sdk = "^3.6.0" -requests = "^2.25.1" -pysftp = "^0.2.9" -dropbox = "^11.20.0" -aiohttp-middlewares = "^2.0.0" -Unidecode = "1.2.0" -cryptography = "39.0.0" - -[tool.poetry.dev-dependencies] -flake8 = "^6.0" -autopep8 = "^2.0" -coverage = "*" -cx_freeze = "6.12.0" -GitPython = "^3.1.17" -jedi = "^0.13" -Jinja2 = "^3" -markupsafe = "2.0.1" -pycodestyle = "*" -pydocstyle = "*" -linkify-it-py = "^2.0.0" -myst-parser = "^0.18.1" -pylint = "^2.4.4" -pytest = "^6.1" -pytest-cov = "*" -pytest-print = "*" -Sphinx = "^5.3" -m2r2 = "^0.3.3.post2" -sphinx-autoapi = "^2.0.1" -sphinxcontrib-napoleon = "^0.7" -revitron-sphinx-theme = { git = "https://github.com/revitron/revitron-sphinx-theme.git", branch = "master" } -recommonmark = "*" -wheel = "*" -enlighten = "*" # cool terminal progress bars -toml = "^0.10.2" # for parsing pyproject.toml -pre-commit = "*" - -[tool.poetry.urls] -"Bug Tracker" = "https://github.com/pypeclub/openpype/issues" -"Discussions" = "https://github.com/pypeclub/openpype/discussions" - -[[tool.poetry.source]] -name = "openpype" -url = "https://distribute.openpype.io/wheels/" -secondary = true - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - -[openpype] -# note: in here we can use pip version specifiers as this is installed with pip until -# Poetry will support custom location (-t flag for pip) -# https://pip.pypa.io/en/stable/cli/pip_install/#requirement-specifiers -[openpype.qtbinding.windows] -package = "PySide2" -version = "5.15.2" - -[openpype.qtbinding.darwin] -package = "PySide6" -version = "6.4.3" - -[openpype.qtbinding.linux] -package = "PySide2" -version = "5.15.2" - -# Python dependencies that will be available only in runtime of -# OpenPype process - do not interfere with DCCs dependencies -[openpype.runtime-deps] -opencolorio = "2.2.1" -opentimelineio = "0.14.1" - -# TODO: we will need to handle different linux flavours here and -# also different macos versions too. -[openpype.thirdparty.ffmpeg.windows] -url = "https://distribute.openpype.io/thirdparty/ffmpeg-4.4-windows.zip" -hash = "dd51ba29d64ee238e7c4c3c7301b19754c3f0ee2e2a729c20a0e2789e72db925" - -[openpype.thirdparty.ffmpeg.linux] -url = "https://distribute.openpype.io/thirdparty/ffmpeg-4.4-linux.tgz" -hash = "10b9beda57cfbb69b9ed0ce896c0c8d99227b26ca8b9f611040c4752e365cbe9" - -[openpype.thirdparty.ffmpeg.darwin] -url = "https://distribute.openpype.io/thirdparty/ffmpeg-4.4-macos.tgz" -hash = "95f43568338c275f80dc0cab1e1836a2e2270f856f0e7b204440d881dd74fbdb" - -[openpype.thirdparty.oiio.windows] -url = "https://distribute.openpype.io/thirdparty/oiio_tools-2.3.10-windows.zip" -hash = "b9950f5d2fa3720b52b8be55bacf5f56d33f9e029d38ee86534995f3d8d253d2" - -[openpype.thirdparty.oiio.linux] -url = "https://distribute.openpype.io/thirdparty/oiio_tools-2.2.20-linux-centos7.tgz" -hash = "3894dec7e4e521463891a869586850e8605f5fd604858b674c87323bf33e273d" - -[openpype.thirdparty.ocioconfig] -url = "https://distribute.openpype.io/thirdparty/OpenColorIO-Configs-1.0.2.zip" -hash = "4ac17c1f7de83465e6f51dd352d7117e07e765b66d00443257916c828e35b6ce" - -[tool.pyright] -include = [ - "igniter", - "openpype", - "repos", - "vendor" -] -exclude = [ - "**/node_modules", - "**/__pycache__" -] -ignore = ["website", "docs", ".git"] - -reportMissingImports = true -reportMissingTypeStubs = false - -[tool.poetry.extras] -docs = ["Sphinx", "furo", "sphinxcontrib-napoleon"] - -[tool.pydocstyle] -inherit = false -convetion = "google" -match = "(?!test_).*\\.py" diff --git a/setup.cfg b/setup.cfg index f0f754fb24..05c52f9823 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,10 +5,6 @@ max-line-length = 79 exclude = .git, __pycache__, - docs, - */vendor, - website, - openpype/vendor, *deadline/repository/custom/plugins max-complexity = 30 @@ -23,9 +19,6 @@ omit = /tests [coverage:html] directory = ./coverage -[tool:pytest] -norecursedirs = openpype/modules/ftrack/* - [isort] line_length = 79 multi_line_output = 3 diff --git a/setup.py b/setup.py deleted file mode 100644 index 6179de1d34..0000000000 --- a/setup.py +++ /dev/null @@ -1,200 +0,0 @@ -# -*- coding: utf-8 -*- -"""Setup info for building OpenPype 3.0.""" -import os -import re -import platform -import distutils.spawn -from pathlib import Path - -from cx_Freeze import setup, Executable -from sphinx.setup_command import BuildDoc - -openpype_root = Path(os.path.dirname(__file__)) - - -def validate_thirdparty_binaries(): - """Check existence of thirdpart executables.""" - low_platform = platform.system().lower() - binary_vendors_dir = os.path.join( - openpype_root, - "vendor", - "bin" - ) - - error_msg = ( - "Missing binary dependency {}. Please fetch thirdparty dependencies." - ) - # Validate existence of FFmpeg - ffmpeg_dir = os.path.join(binary_vendors_dir, "ffmpeg", low_platform) - if low_platform == "windows": - ffmpeg_dir = os.path.join(ffmpeg_dir, "bin") - ffmpeg_executable = os.path.join(ffmpeg_dir, "ffmpeg") - ffmpeg_result = distutils.spawn.find_executable(ffmpeg_executable) - if ffmpeg_result is None: - raise RuntimeError(error_msg.format("FFmpeg")) - - # Validate existence of OpenImageIO (not on MacOs) - oiio_tool_path = None - if low_platform == "linux": - oiio_tool_path = os.path.join( - binary_vendors_dir, - "oiio", - low_platform, - "bin", - "oiiotool" - ) - elif low_platform == "windows": - oiio_tool_path = os.path.join( - binary_vendors_dir, - "oiio", - low_platform, - "oiiotool" - ) - oiio_result = None - if oiio_tool_path is not None: - oiio_result = distutils.spawn.find_executable(oiio_tool_path) - if oiio_result is None: - raise RuntimeError(error_msg.format("OpenImageIO")) - - -# Give ability to skip vaidation -if not os.getenv("SKIP_THIRD_PARTY_VALIDATION"): - validate_thirdparty_binaries() - -version = {} - -with open(openpype_root / "openpype" / "version.py") as fp: - exec(fp.read(), version) - -version_match = re.search(r"(\d+\.\d+.\d+).*", version["__version__"]) -__version__ = version_match.group(1) - -low_platform_name = platform.system().lower() -IS_WINDOWS = low_platform_name == "windows" -IS_LINUX = low_platform_name == "linux" -IS_MACOS = low_platform_name == "darwin" - -base = None -if IS_WINDOWS: - base = "Win32GUI" - -# ----------------------------------------------------------------------- -# build_exe -# Build options for cx_Freeze. Manually add/exclude packages and binaries - -install_requires = [ - "appdirs", - "cx_Freeze", - "keyring", - "clique", - "jsonschema", - "pathlib2", - "pkg_resources", - "PIL", - "pymongo", - "pynput", - "jinxed", - "blessed", - "Qt", - "qtpy", - "speedcopy", - "googleapiclient", - "httplib2", - # Harmony implementation - "filecmp", - "dns", - # Python defaults (cx_Freeze skip them by default) - "dbm", - "sqlite3", - "dataclasses", - "timeit" -] - -includes = [] -# WARNING: As of cx_freeze there is a bug? -# when this is empty, its hooks will not kick in -# and won't clean platform irrelevant modules -# like dbm mentioned above. -excludes = [ - "openpype" -] -bin_includes = [ - "vendor" -] -include_files = [ - "igniter", - "openpype", - "LICENSE", - "README.md" -] - -if IS_WINDOWS: - install_requires.extend([ - # `pywin32` packages - "win32ctypes", - "win32comext", - "pythoncom" - ]) - - -icon_path = openpype_root / "igniter" / "openpype.ico" -mac_icon_path = openpype_root / "igniter" / "openpype.icns" - -build_exe_options = dict( - packages=install_requires, - includes=includes, - excludes=excludes, - bin_includes=bin_includes, - include_files=include_files, - optimize=0 -) - -bdist_mac_options = dict( - bundle_name=f"OpenPype {__version__}", - iconfile=mac_icon_path -) - -executables = [ - Executable( - "start.py", - base=base, - target_name="openpype_gui", - icon=icon_path.as_posix() - ), - Executable( - "start.py", - base=None, - target_name="openpype_console", - icon=icon_path.as_posix() - ), -] - -if IS_LINUX: - executables.append( - Executable( - "app_launcher.py", - base=None, - target_name="app_launcher", - icon=icon_path.as_posix() - ) - ) - -setup( - name="OpenPype", - version=__version__, - description="OpenPype", - cmdclass={"build_sphinx": BuildDoc}, - options={ - "build_exe": build_exe_options, - "bdist_mac": bdist_mac_options, - "build_sphinx": { - "project": "OpenPype", - "version": __version__, - "release": __version__, - "source_dir": (openpype_root / "docs" / "source").as_posix(), - "build_dir": (openpype_root / "docs" / "build").as_posix() - } - }, - executables=executables, - packages=[] -) diff --git a/start.py b/start.py deleted file mode 100644 index e4ada05822..0000000000 --- a/start.py +++ /dev/null @@ -1,1213 +0,0 @@ -# -*- coding: utf-8 -*- -"""Main entry point for OpenPype command. - -Bootstrapping process of OpenPype is as follows: - -`OPENPYPE_PATH` is checked for existence - either one from environment or -from user settings. Precedence takes the one set by environment. - -On this path we try to find OpenPype in directories version string in their -names. For example: `openpype-v3.0.1-foo` is valid name, or -even `foo_3.0.2` - as long as version can be determined from its name -_AND_ file `openpype/openpype/version.py` can be found inside, it is -considered OpenPype installation. - -If no OpenPype repositories are found in `OPENPYPE_PATH` (user data dir) -then **Igniter** (OpenPype setup tool) will launch its GUI. - -It can be used to specify `OPENPYPE_PATH` or if it is _not_ specified, current -*"live"* repositories will be used to create zip file and copy it to -appdata dir in user home and extract it there. Version will be determined by -version specified in OpenPype module. - -If OpenPype repository directories are found in default install location -(user data dir) or in `OPENPYPE_PATH`, it will get list of those dirs -there and use latest one or the one specified with optional `--use-version` -command line argument. If the one specified doesn't exist then latest -available version will be used. All repositories in that dir will be added -to `sys.path` and `PYTHONPATH`. - -If OpenPype is live (not frozen) then current version of OpenPype module -will be used. All directories under `repos` will be added to `sys.path` and -`PYTHONPATH`. - -OpenPype depends on connection to `MongoDB`_. You can specify MongoDB -connection string via `OPENPYPE_MONGO` set in environment or it can be set -in user settings or via **Igniter** GUI. - -So, bootstrapping OpenPype looks like this:: - -.. code-block:: bash - -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ Determine MongoDB connection: โ”‚ -โ”‚ Use `OPENPYPE_MONGO`, system keyring `openPypeMongo` โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”Œโ”€โ”€โ”€- Found? -โ”€โ” - YES NO - โ”‚ โ”‚ - โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ”‚ โ”‚ Fire up Igniter GUI โ”œ<-โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” - โ”‚ โ”‚ and ask User โ”‚ โ”‚ - โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ - โ”‚ โ”‚ - โ”‚ โ”‚ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ -โ”‚ Get location of OpenPype: โ”‚ โ”‚ -โ”‚ 1) Test for `OPENPYPE_PATH` environment variable โ”‚ โ”‚ -โ”‚ 2) Test `openPypePath` in registry setting โ”‚ โ”‚ -โ”‚ 3) Test user data directory โ”‚ โ”‚ -โ”‚ ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท โ”‚ โ”‚ -โ”‚ If running from frozen code: โ”‚ โ”‚ -โ”‚ - Use latest one found in user data dir โ”‚ โ”‚ -โ”‚ If running from live code: โ”‚ โ”‚ -โ”‚ - Use live code and install it to user data dir โ”‚ โ”‚ -โ”‚ * can be overridden with `--use-version` argument โ”‚ โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ - โ”Œโ”€- Is OpenPype found? -โ”€โ” โ”‚ - YES NO โ”‚ - โ”‚ โ”‚ โ”‚ - โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ - โ”‚ โ”‚ Look in `OPENPYPE_PATH`, find โ”‚ โ”‚ - โ”‚ โ”‚ latest version and install it โ”‚ โ”‚ - โ”‚ โ”‚ to user data dir. โ”‚ โ”‚ - โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ - โ”‚ โ”Œโ”€- Is OpenPype found? -โ”€โ” โ”‚ - โ”‚ YES NO -โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ โ”‚ - โ”œ<-โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ Run OpenPype โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - - -Todo: - Move or remove bootstrapping environments out of the code. - -Attributes: - silent_commands (set): list of commands for which we won't print OpenPype - logo and info header. - -.. _MongoDB: - https://www.mongodb.com/ - -""" -import os -import re -import sys -import platform -import traceback -import subprocess -import site -import distutils.spawn -from pathlib import Path - - -silent_mode = False - -# OPENPYPE_ROOT is variable pointing to build (or code) directory -# WARNING `OPENPYPE_ROOT` must be defined before igniter import -# - igniter changes cwd which cause that filepath of this script won't lead -# to right directory -if not getattr(sys, 'frozen', False): - # Code root defined by `start.py` directory - OPENPYPE_ROOT = os.path.dirname(os.path.abspath(__file__)) -else: - OPENPYPE_ROOT = os.path.dirname(sys.executable) - - # add dependencies folder to sys.pat for frozen code - frozen_libs = os.path.normpath( - os.path.join(OPENPYPE_ROOT, "dependencies") - ) - sys.path.append(frozen_libs) - sys.path.insert(0, OPENPYPE_ROOT) - # add stuff from `/dependencies` to PYTHONPATH. - pythonpath = os.getenv("PYTHONPATH", "") - paths = pythonpath.split(os.pathsep) - paths.append(frozen_libs) - os.environ["PYTHONPATH"] = os.pathsep.join(paths) - -# Vendored python modules that must not be in PYTHONPATH environment but -# are required for OpenPype processes -vendor_python_path = os.path.join(OPENPYPE_ROOT, "vendor", "python") -sys.path.insert(0, vendor_python_path) - -# Add common package to sys path -# - common contains common code for bootstraping and OpenPype processes -sys.path.insert(0, os.path.join(OPENPYPE_ROOT, "common")) - -import blessed # noqa: E402 -import certifi # noqa: E402 - - -if sys.__stdout__: - term = blessed.Terminal() - - def _print(message: str, force=False): - if silent_mode and not force: - return - if message.startswith("!!! "): - print(f'{term.orangered2("!!! ")}{message[4:]}') - return - if message.startswith(">>> "): - print(f'{term.aquamarine3(">>> ")}{message[4:]}') - return - if message.startswith("--- "): - print(f'{term.darkolivegreen3("--- ")}{message[4:]}') - return - if message.startswith("*** "): - print(f'{term.gold("*** ")}{message[4:]}') - return - if message.startswith(" - "): - print(f'{term.wheat(" - ")}{message[4:]}') - return - if message.startswith(" . "): - print(f'{term.tan(" . ")}{message[4:]}') - return - if message.startswith(" - "): - print(f'{term.seagreen3(" - ")}{message[7:]}') - return - if message.startswith(" ! "): - print(f'{term.goldenrod(" ! ")}{message[7:]}') - return - if message.startswith(" * "): - print(f'{term.aquamarine1(" * ")}{message[7:]}') - return - if message.startswith(" "): - print(f'{term.darkseagreen3(" ")}{message[4:]}') - return - - print(message) -else: - def _print(message: str): - if silent_mode: - return - print(message) - - -# if SSL_CERT_FILE is not set prior to OpenPype launch, we set it to point -# to certifi bundle to make sure we have reasonably new CA certificates. -if os.getenv("SSL_CERT_FILE") and \ - os.getenv("SSL_CERT_FILE") != certifi.where(): - _print("--- your system is set to use custom CA certificate bundle.") -else: - ssl_cert_file = certifi.where() - os.environ["SSL_CERT_FILE"] = ssl_cert_file - -if "--headless" in sys.argv: - os.environ["OPENPYPE_HEADLESS_MODE"] = "1" - sys.argv.remove("--headless") -elif os.getenv("OPENPYPE_HEADLESS_MODE") != "1": - os.environ.pop("OPENPYPE_HEADLESS_MODE", None) - -# Set builtin ocio root -os.environ["BUILTIN_OCIO_ROOT"] = os.path.join( - OPENPYPE_ROOT, - "vendor", - "bin", - "ocioconfig", - "OpenColorIOConfigs" -) - -# Enabled logging debug mode when "--debug" is passed -if "--verbose" in sys.argv: - expected_values = ( - "Expected: notset, debug, info, warning, error, critical" - " or integer [0-50]." - ) - idx = sys.argv.index("--verbose") - sys.argv.pop(idx) - if idx < len(sys.argv): - value = sys.argv.pop(idx) - else: - raise RuntimeError(( - f"Expect value after \"--verbose\" argument. {expected_values}" - )) - - log_level = None - low_value = value.lower() - if low_value.isdigit(): - log_level = int(low_value) - elif low_value == "notset": - log_level = 0 - elif low_value == "debug": - log_level = 10 - elif low_value == "info": - log_level = 20 - elif low_value == "warning": - log_level = 30 - elif low_value == "error": - log_level = 40 - elif low_value == "critical": - log_level = 50 - - if log_level is None: - raise RuntimeError(( - "Unexpected value after \"--verbose\" " - f"argument \"{value}\". {expected_values}" - )) - - os.environ["OPENPYPE_LOG_LEVEL"] = str(log_level) - -# Enable debug mode, may affect log level if log level is not defined -if "--debug" in sys.argv: - sys.argv.remove("--debug") - os.environ["OPENPYPE_DEBUG"] = "1" - -if "--automatic-tests" in sys.argv: - sys.argv.remove("--automatic-tests") - os.environ["IS_TEST"] = "1" - -if "--use-staging" in sys.argv: - sys.argv.remove("--use-staging") - os.environ["OPENPYPE_USE_STAGING"] = "1" - -import igniter # noqa: E402 -from igniter import BootstrapRepos # noqa: E402 -from igniter.tools import ( - get_openpype_global_settings, - get_openpype_path_from_settings, - get_local_openpype_path_from_settings, - validate_mongo_connection, - OpenPypeVersionNotFound, - OpenPypeVersionIncompatible -) # noqa -from igniter.bootstrap_repos import OpenPypeVersion # noqa: E402 - -bootstrap = BootstrapRepos() -silent_commands = {"run", "igniter", "standalonepublisher", - "extractenvironments", "version"} - - -def list_versions(openpype_versions: list, local_version=None) -> None: - """Print list of detected versions.""" - _print(" - Detected versions:") - for v in sorted(openpype_versions): - _print(f" - {v}: {v.path}") - if not openpype_versions: - _print(" ! none in repository detected") - if local_version: - _print(f" * local version {local_version}") - - -def set_openpype_global_environments() -> None: - """Set global OpenPype's environments.""" - import acre - - from openpype.settings import get_general_environments - - general_env = get_general_environments() - - # first resolve general environment because merge doesn't expect - # values to be list. - # TODO: switch to OpenPype environment functions - merged_env = acre.merge( - acre.compute(acre.parse(general_env), cleanup=False), - dict(os.environ) - ) - env = acre.compute( - merged_env, - cleanup=False - ) - os.environ.clear() - os.environ.update(env) - - # Hardcoded default values - os.environ["PYBLISH_GUI"] = "pyblish_pype" - # Change scale factor only if is not set - if "QT_AUTO_SCREEN_SCALE_FACTOR" not in os.environ: - os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1" - - -def run(arguments: list, env: dict = None) -> int: - """Use correct executable to run stuff. - - This passing arguments to correct OpenPype executable. If OpenPype is run - from live sources, executable will be `python` in virtual environment. - If running from frozen code, executable will be `openpype_console` or - `openpype_gui`. Its equivalent in live code is `python start.py`. - - Args: - arguments (list): Argument list to pass OpenPype. - env (dict, optional): Dictionary containing environment. - - Returns: - int: Process return code. - - """ - if getattr(sys, 'frozen', False): - interpreter = [sys.executable] - else: - interpreter = [sys.executable, __file__] - - interpreter.extend(arguments) - - p = subprocess.Popen(interpreter, env=env) - p.wait() - _print(f">>> done [{p.returncode}]") - return p.returncode - - -def run_disk_mapping_commands(settings): - """ Run disk mapping command - - Used to map shared disk for OP to pull codebase. - """ - - low_platform = platform.system().lower() - disk_mapping = settings.get("disk_mapping") - if not disk_mapping: - return - - mappings = disk_mapping.get(low_platform) or [] - for source, destination in mappings: - if low_platform == "windows": - destination = destination.replace("/", "\\").rstrip("\\") - source = source.replace("/", "\\").rstrip("\\") - # Add slash after ':' ('G:' -> 'G:\') - if source.endswith(":"): - source += "\\" - else: - destination = destination.rstrip("/") - source = source.rstrip("/") - - if low_platform == "darwin": - scr = f'do shell script "ln -s {source} {destination}" with administrator privileges' # noqa - - args = ["osascript", "-e", scr] - elif low_platform == "windows": - args = ["subst", destination, source] - else: - args = ["sudo", "ln", "-s", source, destination] - - _print(f"*** disk mapping arguments: {args}") - try: - if not os.path.exists(destination): - output = subprocess.Popen(args) - if output.returncode and output.returncode != 0: - exc_msg = f'Executing was not successful: "{args}"' - - raise RuntimeError(exc_msg) - except TypeError as exc: - _print( - f"Error {str(exc)} in mapping drive {source}, {destination}") - raise - - -def set_avalon_environments(): - """Set avalon specific environments. - - These are non-modifiable environments for avalon workflow that must be set - before avalon module is imported because avalon works with globals set with - environment variables. - """ - - avalon_db = os.environ.get("AVALON_DB") or "avalon" # for tests - os.environ.update({ - # Mongo DB name where avalon docs are stored - "AVALON_DB": avalon_db, - # Name of config - "AVALON_LABEL": "OpenPype" - }) - - -def set_modules_environments(): - """Set global environments for OpenPype modules. - - This requires to have OpenPype in `sys.path`. - """ - - from openpype.modules import ModulesManager - import acre - - modules_manager = ModulesManager() - - module_envs = modules_manager.collect_global_environments() - - # Merge environments with current environments and update values - if module_envs: - parsed_envs = acre.parse(module_envs) - env = acre.merge(parsed_envs, dict(os.environ)) - os.environ.clear() - os.environ.update(env) - - -def _startup_validations(): - """Validations before OpenPype starts.""" - try: - _validate_thirdparty_binaries() - except Exception as exc: - if os.environ.get("OPENPYPE_HEADLESS_MODE"): - raise - - import tkinter - from tkinter.messagebox import showerror - - root = tkinter.Tk() - root.attributes("-alpha", 0.0) - root.wm_state("iconic") - if platform.system().lower() != "windows": - root.withdraw() - - showerror( - "Startup validations didn't pass", - str(exc) - ) - root.withdraw() - sys.exit(1) - - -def _validate_thirdparty_binaries(): - """Check existence of thirdpart executables.""" - low_platform = platform.system().lower() - binary_vendors_dir = os.path.join( - os.environ["OPENPYPE_ROOT"], - "vendor", - "bin" - ) - - error_msg = ( - "Missing binary dependency {}. Please fetch thirdparty dependencies." - ) - # Validate existence of FFmpeg - ffmpeg_dir = os.path.join(binary_vendors_dir, "ffmpeg", low_platform) - if low_platform == "windows": - ffmpeg_dir = os.path.join(ffmpeg_dir, "bin") - ffmpeg_executable = os.path.join(ffmpeg_dir, "ffmpeg") - ffmpeg_result = distutils.spawn.find_executable(ffmpeg_executable) - if ffmpeg_result is None: - raise RuntimeError(error_msg.format("FFmpeg")) - - # Validate existence of OpenImageIO (not on MacOs) - oiio_tool_path = None - if low_platform == "linux": - oiio_tool_path = os.path.join( - binary_vendors_dir, - "oiio", - low_platform, - "bin", - "oiiotool" - ) - elif low_platform == "windows": - oiio_tool_path = os.path.join( - binary_vendors_dir, - "oiio", - low_platform, - "oiiotool" - ) - oiio_result = None - if oiio_tool_path is not None: - oiio_result = distutils.spawn.find_executable(oiio_tool_path) - if oiio_result is None: - raise RuntimeError(error_msg.format("OpenImageIO")) - - -def _process_arguments() -> tuple: - """Process command line arguments. - - Returns: - tuple: Return tuple with specific version to use (if any) and flag - to prioritize staging (if set) - """ - # check for `--use-version=3.0.0` argument and `--use-staging` - use_version = None - commands = [] - - # OpenPype version specification through arguments - use_version_arg = "--use-version" - - for arg in sys.argv: - if arg.startswith(use_version_arg): - # Remove arg from sys argv - sys.argv.remove(arg) - # Extract string after use version arg - use_version_value = arg[len(use_version_arg):] - - if ( - not use_version_value - or not use_version_value.startswith("=") - ): - _print("!!! Please use option --use-version like:", True) - _print(" --use-version=3.0.0", True) - sys.exit(1) - - version_str = use_version_value[1:] - use_version = None - if version_str.lower() == "latest": - use_version = "latest" - else: - m = re.search( - r"(?P\d+\.\d+\.\d+(?:\S*)?)", version_str - ) - if m and m.group('version'): - use_version = m.group('version') - _print(f">>> Requested version [ {use_version} ]") - break - - if use_version is None: - _print("!!! Requested version isn't in correct format.", True) - _print((" Use --list-versions to find out" - " proper version string."), True) - sys.exit(1) - - if arg == "--validate-version": - _print("!!! Please use option --validate-version like:", True) - _print(" --validate-version=3.0.0", True) - sys.exit(1) - - if arg.startswith("--validate-version="): - m = re.search( - r"--validate-version=(?P\d+\.\d+\.\d+(?:\S*)?)", arg) - if m and m.group('version'): - use_version = m.group('version') - sys.argv.remove(arg) - commands.append("validate") - else: - _print("!!! Requested version isn't in correct format.", True) - _print((" Use --list-versions to find out" - " proper version string."), True) - sys.exit(1) - - if "--list-versions" in sys.argv: - commands.append("print_versions") - sys.argv.remove("--list-versions") - - # handle igniter - # this is helper to run igniter before anything else - if "igniter" in sys.argv: - if os.getenv("OPENPYPE_HEADLESS_MODE") == "1": - _print("!!! Cannot open Igniter dialog in headless mode.", True) - sys.exit(1) - - return_code = igniter.open_dialog() - - # this is when we want to run OpenPype without installing anything. - # or we are ready to run. - if return_code not in [2, 3]: - sys.exit(return_code) - - idx = sys.argv.index("igniter") - sys.argv.pop(idx) - sys.argv.insert(idx, "tray") - - return use_version, commands - - -def _determine_mongodb() -> str: - """Determine mongodb connection string. - - First use ``OPENPYPE_MONGO`` environment variable, then system keyring. - Then try to run **Igniter UI** to let user specify it. - - Returns: - str: mongodb connection URL - - Raises: - RuntimeError: if mongodb connection url cannot by determined. - - """ - - openpype_mongo = os.getenv("OPENPYPE_MONGO", None) - if not openpype_mongo: - # try system keyring - try: - openpype_mongo = bootstrap.secure_registry.get_item( - "openPypeMongo" - ) - except ValueError: - pass - - if openpype_mongo: - result, msg = validate_mongo_connection(openpype_mongo) - if not result: - _print(msg) - openpype_mongo = None - - if not openpype_mongo: - _print("*** No DB connection string specified.") - if os.getenv("OPENPYPE_HEADLESS_MODE") == "1": - _print("!!! Cannot open Igniter dialog in headless mode.", True) - _print(("!!! Please use `OPENPYPE_MONGO` to specify " - "server address."), True) - sys.exit(1) - _print("--- launching setup UI ...") - - result = igniter.open_dialog() - if result == 0: - raise RuntimeError("MongoDB URL was not defined") - - openpype_mongo = os.getenv("OPENPYPE_MONGO") - if not openpype_mongo: - try: - openpype_mongo = bootstrap.secure_registry.get_item( - "openPypeMongo") - except ValueError as e: - raise RuntimeError("Missing MongoDB url") from e - - return openpype_mongo - - -def _initialize_environment(openpype_version: OpenPypeVersion) -> None: - version_path = openpype_version.path - if not version_path: - _print(f"!!! Version {openpype_version} doesn't have path set.") - raise ValueError("No path set in specified OpenPype version.") - os.environ["OPENPYPE_VERSION"] = str(openpype_version) - # set OPENPYPE_REPOS_ROOT to point to currently used OpenPype version. - os.environ["OPENPYPE_REPOS_ROOT"] = os.path.normpath( - version_path.as_posix() - ) - # inject version to Python environment (sys.path, ...) - _print(">>> Injecting OpenPype version to running environment ...") - bootstrap.add_paths_from_directory(version_path) - - # Additional sys paths related to OPENPYPE_REPOS_ROOT directory - # TODO move additional paths to `boot` part when OPENPYPE_REPOS_ROOT will - # point to same hierarchy from code and from frozen OpenPype - additional_paths = [ - os.environ["OPENPYPE_REPOS_ROOT"], - # add OpenPype tools - os.path.join(os.environ["OPENPYPE_REPOS_ROOT"], "openpype", "tools"), - # add common OpenPype vendor - # (common for multiple Python interpreter versions) - os.path.join( - os.environ["OPENPYPE_REPOS_ROOT"], - "openpype", - "vendor", - "python", - "common" - ) - ] - - split_paths = os.getenv("PYTHONPATH", "").split(os.pathsep) - for path in additional_paths: - split_paths.insert(0, path) - sys.path.insert(0, path) - - os.environ["PYTHONPATH"] = os.pathsep.join(split_paths) - - -def _find_frozen_openpype(use_version: str = None, - use_staging: bool = False) -> Path: - """Find OpenPype to run from frozen code. - - This will process and modify environment variables: - ``PYTHONPATH``, ``OPENPYPE_VERSION``, ``OPENPYPE_REPOS_ROOT`` - - Args: - use_version (str, optional): Try to use specified version. - use_staging (bool, optional): Prefer *staging* flavor over production. - - Returns: - Path: Path to version to be used. - - Raises: - RuntimeError: If no OpenPype version are found. - - """ - # Collect OpenPype versions - installed_version = OpenPypeVersion.get_installed_version() - # Expected version that should be used by studio settings - # - this option is used only if version is not explicitly set and if - # studio has set explicit version in settings - studio_version = OpenPypeVersion.get_expected_studio_version(use_staging) - - if use_version is not None: - # Specific version is defined - if use_version.lower() == "latest": - # Version says to use latest version - _print(">>> Finding latest version defined by use version") - openpype_version = bootstrap.find_latest_openpype_version() - else: - _print(f">>> Finding specified version \"{use_version}\"") - openpype_version = bootstrap.find_openpype_version(use_version) - - if openpype_version is None: - raise OpenPypeVersionNotFound( - f"Requested version \"{use_version}\" was not found." - ) - - elif studio_version is not None: - # Studio has defined a version to use - _print(f">>> Finding studio version \"{studio_version}\"") - openpype_version = bootstrap.find_openpype_version(studio_version) - if openpype_version is None: - raise OpenPypeVersionNotFound(( - "Requested OpenPype version " - f"\"{studio_version}\" defined by settings" - " was not found." - )) - - else: - # Default behavior to use latest version - _print(( - ">>> Finding latest version " - f"with [ {installed_version} ]")) - openpype_version = bootstrap.find_latest_openpype_version() - - if openpype_version is None: - raise OpenPypeVersionNotFound("Didn't find any versions.") - - # get local frozen version and add it to detected version so if it is - # newer it will be used instead. - if installed_version == openpype_version: - version_path = _bootstrap_from_code(use_version) - openpype_version = OpenPypeVersion( - version=BootstrapRepos.get_version(version_path), - path=version_path) - _initialize_environment(openpype_version) - return version_path - - in_headless_mode = os.getenv("OPENPYPE_HEADLESS_MODE") == "1" - if not installed_version.is_compatible(openpype_version): - message = "Version {} is not compatible with installed version {}." - # Show UI to user - if not in_headless_mode: - igniter.show_message_dialog( - "Incompatible OpenPype installation", - message.format( - "{}".format(openpype_version), - "{}".format(installed_version) - ) - ) - # Raise incompatible error - raise OpenPypeVersionIncompatible( - message.format(openpype_version, installed_version) - ) - - # test if latest detected is installed (in user data dir) - is_inside = False - try: - is_inside = openpype_version.path.resolve().relative_to( - bootstrap.data_dir) - except ValueError: - # if relative path cannot be calculated, openpype version is not - # inside user data dir - pass - - if not is_inside: - # install latest version to user data dir - if in_headless_mode: - version_path = bootstrap.install_version( - openpype_version, force=True - ) - else: - version_path = igniter.open_update_window(openpype_version) - - openpype_version.path = version_path - _initialize_environment(openpype_version) - return openpype_version.path - - if openpype_version.path.is_file(): - _print(">>> Extracting zip file ...") - try: - version_path = bootstrap.extract_openpype(openpype_version) - except OSError as e: - _print("!!! failed: {}".format(str(e)), True) - sys.exit(1) - else: - # cleanup zip after extraction - os.unlink(openpype_version.path) - - openpype_version.path = version_path - - _initialize_environment(openpype_version) - return openpype_version.path - - -def _bootstrap_from_code(use_version): - """Bootstrap live code (or the one coming with frozen OpenPype). - - Args: - use_version: (str): specific version to use. - - Returns: - Path: path to sourced version. - - """ - # run through repos and add them to `sys.path` and `PYTHONPATH` - # set root - _openpype_root = OPENPYPE_ROOT - # Unset use version if latest should be used - # - when executed from code then code is expected as latest - # - when executed from build then build is already marked as latest - # in '_find_frozen_openpype' - if use_version and use_version.lower() == "latest": - use_version = None - - if getattr(sys, 'frozen', False): - local_version = bootstrap.get_version(Path(_openpype_root)) - switch_str = f" - will switch to {use_version}" if use_version and use_version != local_version else "" # noqa - _print(f" - booting version: {local_version}{switch_str}") - if not local_version: - raise OpenPypeVersionNotFound( - f"Cannot find version at {_openpype_root}") - else: - # get current version of OpenPype - local_version = OpenPypeVersion.get_installed_version_str() - - # All cases when should be used different version than build - if use_version and use_version != local_version: - if use_version: - # Explicit version should be used - version_to_use = bootstrap.find_openpype_version(use_version) - if version_to_use is None: - raise OpenPypeVersionIncompatible( - f"Requested version \"{use_version}\" was not found.") - else: - version_to_use = bootstrap.find_latest_openpype_version() - if version_to_use is None: - raise OpenPypeVersionNotFound("Didn't find any versions.") - - # Start extraction of version if needed - if version_to_use.path.is_file(): - version_to_use.path = bootstrap.extract_openpype(version_to_use) - bootstrap.add_paths_from_directory(version_to_use.path) - os.environ["OPENPYPE_VERSION"] = use_version - version_path = version_to_use.path - os.environ["OPENPYPE_REPOS_ROOT"] = ( - version_path / "openpype" - ).as_posix() - _openpype_root = version_to_use.path.as_posix() - - else: - os.environ["OPENPYPE_VERSION"] = local_version - version_path = Path(_openpype_root) - os.environ["OPENPYPE_REPOS_ROOT"] = _openpype_root - - # add self to sys.path of current process - # NOTE: this seems to be duplicate of 'add_paths_from_directory' - sys.path.insert(0, _openpype_root) - # add venv 'site-packages' to PYTHONPATH - python_path = os.getenv("PYTHONPATH", "") - split_paths = python_path.split(os.pathsep) - # add self to python paths - split_paths.insert(0, _openpype_root) - - # last one should be venv site-packages - # this is slightly convoluted as we can get here from frozen code too - # in case when we are running without any version installed. - if not getattr(sys, 'frozen', False): - split_paths.append(site.getsitepackages()[-1]) - # TODO move additional paths to `boot` part when OPENPYPE_ROOT will - # point to same hierarchy from code and from frozen OpenPype - additional_paths = [ - # add OpenPype tools - os.path.join(_openpype_root, "openpype", "tools"), - # add common OpenPype vendor - # (common for multiple Python interpreter versions) - os.path.join( - _openpype_root, - "openpype", - "vendor", - "python", - "common" - ) - ] - for path in additional_paths: - split_paths.insert(0, path) - sys.path.insert(0, path) - - os.environ["PYTHONPATH"] = os.pathsep.join(split_paths) - - return version_path - - -def _boot_validate_versions(use_version, local_version): - _print(f">>> Validating version [ {use_version} ]") - openpype_versions = bootstrap.find_openpype(include_zips=True) - v: OpenPypeVersion - found = [v for v in openpype_versions if str(v) == use_version] - if not found: - _print(f"!!! Version [ {use_version} ] not found.", True) - list_versions(openpype_versions, local_version) - sys.exit(1) - - # print result - version_path = bootstrap.get_version_path_from_list( - use_version, openpype_versions - ) - valid, message = bootstrap.validate_openpype_version(version_path) - _print(f'{">>> " if valid else "!!! "}{message}', not valid) - return valid - - -def _boot_print_versions(openpype_root): - if getattr(sys, 'frozen', False): - local_version = bootstrap.get_version(Path(openpype_root)) - else: - local_version = OpenPypeVersion.get_installed_version_str() - - compatible_with = OpenPypeVersion(version=local_version) - if "--all" in sys.argv: - _print("--- Showing all version (even those not compatible).") - else: - _print(("--- Showing only compatible versions " - f"with [ {compatible_with.major}.{compatible_with.minor} ]")) - - openpype_versions = bootstrap.find_openpype(include_zips=True) - openpype_versions = [ - version for version in openpype_versions - if version.is_compatible( - OpenPypeVersion.get_installed_version()) - ] - - list_versions(openpype_versions, local_version) - - -def _boot_handle_missing_version(local_version, message): - _print(message, True) - if os.environ.get("OPENPYPE_HEADLESS_MODE") == "1": - openpype_versions = bootstrap.find_openpype( - include_zips=True) - list_versions(openpype_versions, local_version) - else: - igniter.show_message_dialog("Version not found", message) - - -def boot(): - """Bootstrap OpenPype.""" - global silent_mode - if any(arg in silent_commands for arg in sys.argv): - silent_mode = True - - # ------------------------------------------------------------------------ - # Set environment to OpenPype root path - # ------------------------------------------------------------------------ - os.environ["OPENPYPE_ROOT"] = OPENPYPE_ROOT - - # ------------------------------------------------------------------------ - # Do necessary startup validations - # ------------------------------------------------------------------------ - _startup_validations() - - # ------------------------------------------------------------------------ - # Process arguments - # ------------------------------------------------------------------------ - - use_version, commands = _process_arguments() - use_staging = os.environ.get("OPENPYPE_USE_STAGING") == "1" - - if os.getenv("OPENPYPE_VERSION"): - if use_version: - _print(("*** environment variable OPENPYPE_VERSION" - "is overridden by command line argument.")) - else: - _print(">>> version set by environment variable") - use_version = os.getenv("OPENPYPE_VERSION") - - # ------------------------------------------------------------------------ - # Determine mongodb connection - # ------------------------------------------------------------------------ - - try: - openpype_mongo = _determine_mongodb() - except RuntimeError as e: - # without mongodb url we are done for. - _print(f"!!! {e}", True) - sys.exit(1) - - os.environ["OPENPYPE_MONGO"] = openpype_mongo - # name of Pype database - os.environ["OPENPYPE_DATABASE_NAME"] = \ - os.environ.get("OPENPYPE_DATABASE_NAME") or "openpype" - - if os.environ.get("IS_TEST") == "1": - # change source DBs to predefined ones set for automatic testing - if "_tests" not in os.environ["OPENPYPE_DATABASE_NAME"]: - os.environ["OPENPYPE_DATABASE_NAME"] += "_tests" - avalon_db = os.environ.get("AVALON_DB") or "avalon" - if "_tests" not in avalon_db: - os.environ["AVALON_DB"] = avalon_db + "_tests" - - global_settings = get_openpype_global_settings(openpype_mongo) - - _print(">>> run disk mapping command ...") - run_disk_mapping_commands(global_settings) - - # Logging to server enabled/disabled - log_to_server = global_settings.get("log_to_server", True) - if log_to_server: - os.environ["OPENPYPE_LOG_TO_SERVER"] = "1" - log_to_server_msg = "ON" - else: - os.environ.pop("OPENPYPE_LOG_TO_SERVER", None) - log_to_server_msg = "OFF" - _print(f">>> Logging to server is turned {log_to_server_msg}") - - # Get openpype path from database and set it to environment so openpype can - # find its versions there and bootstrap them. - openpype_path = get_openpype_path_from_settings(global_settings) - - # Check if local versions should be installed in custom folder and not in - # user app data - data_dir = get_local_openpype_path_from_settings(global_settings) - bootstrap.set_data_dir(data_dir) - if getattr(sys, 'frozen', False): - local_version = bootstrap.get_version(Path(OPENPYPE_ROOT)) - else: - local_version = OpenPypeVersion.get_installed_version_str() - - if "validate" in commands: - valid = _boot_validate_versions(use_version, local_version) - sys.exit(0 if valid else 1) - - if not openpype_path: - _print("*** Cannot get OpenPype path from database.") - - if not os.getenv("OPENPYPE_PATH") and openpype_path: - os.environ["OPENPYPE_PATH"] = openpype_path - - if "print_versions" in commands: - _boot_print_versions(OPENPYPE_ROOT) - sys.exit(0) - - # ------------------------------------------------------------------------ - # Find OpenPype versions - # ------------------------------------------------------------------------ - # WARNING: Environment OPENPYPE_REPOS_ROOT may change if frozen OpenPype - # is executed - if getattr(sys, 'frozen', False): - # find versions of OpenPype to be used with frozen code - try: - version_path = _find_frozen_openpype(use_version, use_staging) - except OpenPypeVersionNotFound as exc: - _boot_handle_missing_version(local_version, str(exc)) - sys.exit(1) - - except RuntimeError as e: - # no version to run - _print(f"!!! {e}", True) - sys.exit(1) - # validate version - _print(f">>> Validating version in frozen [ {str(version_path)} ]") - result = bootstrap.validate_openpype_version(version_path) - if not result[0]: - _print(f"!!! Invalid version: {result[1]}", True) - sys.exit(1) - _print("--- version is valid") - else: - try: - version_path = _bootstrap_from_code(use_version) - - except OpenPypeVersionNotFound as exc: - _boot_handle_missing_version(local_version, str(exc)) - sys.exit(1) - - # set this to point either to `python` from venv in case of live code - # or to `openpype` or `openpype_console` in case of frozen code - os.environ["OPENPYPE_EXECUTABLE"] = sys.executable - - # delete OpenPype module and it's submodules from cache so it is used from - # specific version - modules_to_del = [ - sys.modules.pop(module_name) - for module_name in tuple(sys.modules) - if module_name == "openpype" or module_name.startswith("openpype.") - ] - - try: - for module_name in modules_to_del: - del sys.modules[module_name] - except AttributeError: - pass - except KeyError: - pass - - _print(">>> loading environments ...") - # Avalon environments must be set before avalon module is imported - _print(" - for Avalon ...") - set_avalon_environments() - _print(" - global OpenPype ...") - set_openpype_global_environments() - _print(" - for modules ...") - set_modules_environments() - - assert version_path, "Version path not defined." - - # print info when not running scripts defined in 'silent commands' - if all(arg not in silent_commands for arg in sys.argv): - from openpype.lib import terminal as t - from openpype.version import __version__ - - info = get_info(use_staging) - info.insert(0, f">>> Using OpenPype from [ {version_path} ]") - - t_width = 20 - try: - t_width = os.get_terminal_size().columns - 2 - except (ValueError, OSError): - # running without terminal - pass - - _header = f"*** OpenPype [{__version__}] " - info.insert(0, _header + "-" * (t_width - len(_header))) - - for i in info: - t.echo(i) - - from openpype import cli - try: - cli.main(obj={}, prog_name="openpype") - except Exception: # noqa - exc_info = sys.exc_info() - _print("!!! OpenPype crashed:", True) - traceback.print_exception(*exc_info) - sys.exit(1) - - -def get_info(use_staging=None) -> list: - """Print additional information to console.""" - from openpype.client.mongo import get_default_components - try: - from openpype.lib.log import Logger - except ImportError: - # Backwards compatibility for 'PypeLogger' - from openpype.lib.log import PypeLogger as Logger - - components = get_default_components() - - inf = [] - if use_staging: - inf.append(("OpenPype variant", "staging")) - else: - inf.append(("OpenPype variant", "production")) - inf.extend([ - ("Running OpenPype from", os.environ.get('OPENPYPE_REPOS_ROOT')), - ("Using mongodb", components["host"])] - ) - - if os.environ.get("FTRACK_SERVER"): - inf.append(("Using FTrack at", - os.environ.get("FTRACK_SERVER"))) - - if os.environ.get('DEADLINE_REST_URL'): - inf.append(("Using Deadline webservice at", - os.environ.get("DEADLINE_REST_URL"))) - - # Reinitialize - Logger.initialize() - - mongo_components = get_default_components() - if mongo_components["host"]: - inf.extend([ - ("Logging to MongoDB", mongo_components["host"]), - (" - port", mongo_components["port"] or ""), - (" - database", Logger.log_database_name), - (" - collection", Logger.log_collection_name), - (" - user", mongo_components["username"] or "") - ]) - if mongo_components["auth_db"]: - inf.append((" - auth source", mongo_components["auth_db"])) - - maximum = max(len(i[0]) for i in inf) - formatted = [] - for info in inf: - padding = (maximum - len(info[0])) + 1 - formatted.append(f'... {info[0]}:{" " * padding}[ {info[1]} ]') - return formatted - - -if __name__ == "__main__": - boot() diff --git a/test_localsystem.txt b/test_localsystem.txt deleted file mode 100644 index dde7986af8..0000000000 --- a/test_localsystem.txt +++ /dev/null @@ -1 +0,0 @@ -I have run diff --git a/tools/build.ps1 b/tools/build.ps1 deleted file mode 100644 index 195b2dc75e..0000000000 --- a/tools/build.ps1 +++ /dev/null @@ -1,196 +0,0 @@ -<# -.SYNOPSIS - Helper script to build OpenPype. - -.DESCRIPTION - This script will detect Python installation, and build OpenPype to `build` - directory using existing virtual environment created by Poetry (or - by running `/tools/create_venv.ps1`). It will then shuffle dependencies in - build folder to optimize for different Python versions (2/3) in Python host. - -.EXAMPLE - -PS> .\build.ps1 - -.EXAMPLE - -To build without automatical submodule update: -PS> .\build.ps1 --no-submodule-update - -.LINK -https://openpype.io/docs - -#> - -$arguments=$ARGS -$disable_submodule_update="" -if($arguments -eq "--no-submodule-update") { - $disable_submodule_update=$true -} - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -function Start-Progress { - param([ScriptBlock]$code) - $scroll = "/-\|/-\|" - $idx = 0 - $job = Invoke-Command -ComputerName $env:ComputerName -ScriptBlock { $code } -AsJob - - $origpos = $host.UI.RawUI.CursorPosition - - # $origpos.Y -= 1 - - while (($job.State -eq "Running") -and ($job.State -ne "NotStarted")) - { - $host.UI.RawUI.CursorPosition = $origpos - Write-Host $scroll[$idx] -NoNewline - $idx++ - if ($idx -ge $scroll.Length) - { - $idx = 0 - } - Start-Sleep -Milliseconds 100 - } - # It's over - clear the activity indicator. - $host.UI.RawUI.CursorPosition = $origpos - Write-Host ' ' - <# - .SYNOPSIS - Display spinner for running job - .PARAMETER code - Job to display spinner for - #> -} - - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - -function Show-PSWarning() { - if ($PSVersionTable.PSVersion.Major -lt 7) { - Write-Color -Text "!!! ", "You are using old version of PowerShell - ", "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)" -Color Red, Yellow, White - Write-Color -Text " Please update to at least 7.0 - ", "https://github.com/PowerShell/PowerShell/releases" -Color Yellow, White - Exit-WithCode 1 - } -} - -function Install-Poetry() { - Write-Color -Text ">>> ", "Installing Poetry ... " -Color Green, Gray - $env:POETRY_HOME="$openpype_root\.poetry" - (Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py -UseBasicParsing).Content | python - -} - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -# Enable if PS 7.x is needed. -# Show-PSWarning - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} - -Set-Location -Path $openpype_root - -$version_file = Get-Content -Path "$($openpype_root)\openpype\version.py" -$result = [regex]::Matches($version_file, '__version__ = "(?\d+\.\d+.\d+.*)"') -$openpype_version = $result[0].Groups['version'].Value -if (-not $openpype_version) { - Write-Color -Text "!!! ", "Cannot determine OpenPype version." -Color Yellow, Gray - Exit-WithCode 1 -} - -# Create build directory if not exist -if (-not (Test-Path -PathType Container -Path "$($openpype_root)\build")) { - New-Item -ItemType Directory -Force -Path "$($openpype_root)\build" -} - -Write-Color -Text "--- ", "Cleaning build directory ..." -Color Yellow, Gray -try { - Remove-Item -Recurse -Force "$($openpype_root)\build\*" -} -catch { - Write-Color -Text "!!! ", "Cannot clean build directory, possibly because process is using it." -Color Red, Gray - Write-Color -Text $_.Exception.Message -Color Red - Exit-WithCode 1 -} -if (-not $disable_submodule_update) { - Write-Color -Text ">>> ", "Making sure submodules are up-to-date ..." -Color Green, Gray - & git submodule update --init --recursive -} else { - Write-Color -Text "*** ", "Not updating submodules ..." -Color Green, Gray -} - -Write-Color -Text ">>> ", "OpenPype [ ", $openpype_version, " ]" -Color Green, White, Cyan, White - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Write-Color -Text "*** ", "We need to install Poetry create virtual env first ..." -Color Yellow, Gray - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Color -Text "OK" -Color Green -} - -Write-Color -Text ">>> ", "Cleaning cache files ... " -Color Green, Gray -NoNewline -Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "__pycache__" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Recurse -Write-Color -Text "OK" -Color green - -Write-Color -Text ">>> ", "Building OpenPype ..." -Color Green, White -$startTime = [int][double]::Parse((Get-Date -UFormat %s)) - -$out = & "$($env:POETRY_HOME)\bin\poetry" run python setup.py build 2>&1 -Set-Content -Path "$($openpype_root)\build\build.log" -Value $out -if ($LASTEXITCODE -ne 0) -{ - Write-Color -Text "------------------------------------------" -Color Red - Get-Content "$($openpype_root)\build\build.log" - Write-Color -Text "------------------------------------------" -Color Yellow - Write-Color -Text "!!! ", "Build failed. Check the log: ", ".\build\build.log" -Color Red, Yellow, White - Exit-WithCode $LASTEXITCODE -} - -Set-Content -Path "$($openpype_root)\build\build.log" -Value $out -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\tools\build_dependencies.py" - -Write-Color -Text ">>> ", "Restoring current directory" -Color Green, Gray -Set-Location -Path $current_dir - -$endTime = [int][double]::Parse((Get-Date -UFormat %s)) -try -{ - New-BurntToastNotification -AppLogo "$openpype_root/openpype/resources/icons/openpype_icon.png" -Text "OpenPype build complete!", "All done in $( $endTime - $startTime ) secs. You will find OpenPype and build log in build directory." -} catch {} -Write-Color -Text "*** ", "All done in ", $($endTime - $startTime), " secs. You will find OpenPype and build log in ", "'.\build'", " directory." -Color Green, Gray, White, Gray, White, Gray diff --git a/tools/build.sh b/tools/build.sh deleted file mode 100755 index e828cc149e..0000000000 --- a/tools/build.sh +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env bash - -# Build Pype using existing virtual environment. - - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - -args=$@ -disable_submodule_update=0 -while :; do - case $1 in - --no-submodule-update) - disable_submodule_update=1 - ;; - --) - shift - break - ;; - *) - break - esac - - shift -done - - - - -############################################################################## -# Detect required version of python -# Globals: -# colors -# PYTHON -# Arguments: -# None -# Returns: -# None -############################################################################### -detect_python () { - echo -e "${BIGreen}>>>${RST} Using python \c" - command -v python >/dev/null 2>&1 || { echo -e "${BIRed}- NOT FOUND${RST} ${BIYellow}You need Python 3.9 installed to continue.${RST}"; return 1; } - local version_command - version_command="import sys;print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" - local python_version - python_version="$(python <<< ${version_command})" - oIFS="$IFS" - IFS=. - set -- $python_version - IFS="$oIFS" - if [ "$1" -ge "3" ] && [ "$2" -ge "9" ] ; then - if [ "$2" -gt "9" ] ; then - echo -e "${BIWhite}[${RST} ${BIRed}$1.$2 ${BIWhite}]${RST} - ${BIRed}FAILED${RST} ${BIYellow}Version is new and unsupported, use${RST} ${BIPurple}3.9.x${RST}"; return 1; - else - echo -e "${BIWhite}[${RST} ${BIGreen}$1.$2${RST} ${BIWhite}]${RST}" - fi - else - command -v python >/dev/null 2>&1 || { echo -e "${BIRed}$1.$2$ - ${BIRed}FAILED${RST} ${BIYellow}Version is old and unsupported${RST}"; return 1; } - fi -} - -############################################################################## -# Clean pyc files in specified directory -# Globals: -# None -# Arguments: -# Optional path to clean -# Returns: -# None -############################################################################### -clean_pyc () { - local path - path=$openpype_root - echo -e "${BIGreen}>>>${RST} Cleaning pyc at [ ${BIWhite}$path${RST} ] ... \c" - find "$path" -path ./build -o -regex '^.*\(__pycache__\|\.py[co]\)$' -delete - - echo -e "${BIGreen}DONE${RST}" -} - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1") || return; pwd)/$(basename "$1") -} - -# Main -main () { - echo -e "${BGreen}" - art - echo -e "${RST}" - detect_python || return 1 - - # Directories - openpype_root=$(dirname $(dirname "$(realpath ${BASH_SOURCE[0]})")) - pushd "$openpype_root" > /dev/null || return > /dev/null - - version_command="import os;import re;version={};exec(open(os.path.join('$openpype_root', 'openpype', 'version.py')).read(), version);print(re.search(r'(\d+\.\d+.\d+).*', version['__version__'])[1]);" - openpype_version="$(python <<< ${version_command})" - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - echo -e "${BIYellow}---${RST} Cleaning build directory ..." - rm -rf "$openpype_root/build" && mkdir "$openpype_root/build" > /dev/null - - echo -e "${BIGreen}>>>${RST} Building OpenPype ${BIWhite}[${RST} ${BIGreen}$openpype_version${RST} ${BIWhite}]${RST}" - echo -e "${BIGreen}>>>${RST} Cleaning cache files ..." - clean_pyc - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return 1; } - fi - -if [ "$disable_submodule_update" == 1 ]; then - echo -e "${BIYellow}***${RST} Not updating submodules ..." - else - echo -e "${BIGreen}>>>${RST} Making sure submodules are up-to-date ..." - git submodule update --init --recursive || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return 1; } - fi - echo -e "${BIGreen}>>>${RST} Building ..." - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - "$POETRY_HOME/bin/poetry" run python "$openpype_root/setup.py" build &> "$openpype_root/build/build.log" || { echo -e "${BIRed}------------------------------------------${RST}"; cat "$openpype_root/build/build.log"; echo -e "${BIRed}------------------------------------------${RST}"; echo -e "${BIRed}!!!${RST} Build failed, see the build log."; return 1; } - elif [[ "$OSTYPE" == "darwin"* ]]; then - "$POETRY_HOME/bin/poetry" run python "$openpype_root/setup.py" bdist_mac &> "$openpype_root/build/build.log" || { echo -e "${BIRed}------------------------------------------${RST}"; cat "$openpype_root/build/build.log"; echo -e "${BIRed}------------------------------------------${RST}"; echo -e "${BIRed}!!!${RST} Build failed, see the build log."; return 1; } - fi - "$POETRY_HOME/bin/poetry" run python "$openpype_root/tools/build_dependencies.py" || { echo -e "${BIRed}!!!>${RST} ${BIYellow}Failed to process dependencies${RST}"; return 1; } - - if [[ "$OSTYPE" == "darwin"* ]]; then - # fix cx_Freeze libs issue - echo -e "${BIGreen}>>>${RST} Fixing libs ..." - mv "$openpype_root/build/OpenPype $openpype_version.app/Contents/MacOS/dependencies/cx_Freeze" "$openpype_root/build/OpenPype $openpype_version.app/Contents/MacOS/lib/" || { echo -e "${BIRed}!!!>${RST} ${BIYellow}Can't move cx_Freeze libs${RST}"; return 1; } - - # force hide icon from Dock - defaults write "$openpype_root/build/OpenPype $openpype_version.app/Contents/Info" LSUIElement 1 - - # fix code signing issue - echo -e "${BIGreen}>>>${RST} Fixing code signatures ...\c" - codesign --remove-signature "$openpype_root/build/OpenPype $openpype_version.app/Contents/MacOS/openpype_console" || { echo -e "${BIRed}FAILED${RST}"; return 1; } - codesign --remove-signature "$openpype_root/build/OpenPype $openpype_version.app/Contents/MacOS/openpype_gui" || { echo -e "${BIRed}FAILED${RST}"; return 1; } - echo -e "${BIGreen}DONE${RST}" - if command -v create-dmg > /dev/null 2>&1; then - echo -e "${BIGreen}>>>${RST} Creating dmg image ...\c" - create-dmg \ - --volname "OpenPype $openpype_version Installer" \ - --window-pos 200 120 \ - --window-size 600 300 \ - --app-drop-link 100 50 \ - "$openpype_root/build/OpenPype-Installer-$openpype_version.dmg" \ - "$openpype_root/build/OpenPype $openpype_version.app" - - test $? -eq 0 || { echo -e "${BIRed}FAILED${RST}"; return 1; } - echo -e "${BIGreen}DONE${RST}" - else - echo -e "${BIYellow}!!!${RST} ${BIWhite}create-dmg${RST} command is not available." - fi - fi - - echo -e "${BICyan}>>>${RST} All done. You will find OpenPype and build log in \c" - echo -e "${BIWhite}$openpype_root/build${RST} directory." -} - -return_code=0 -main || return_code=$? -exit $return_code diff --git a/tools/build_dependencies.py b/tools/build_dependencies.py deleted file mode 100644 index d186ead881..0000000000 --- a/tools/build_dependencies.py +++ /dev/null @@ -1,226 +0,0 @@ -# -*- coding: utf-8 -*- -"""Script to fix frozen dependencies. - -Because Pype code needs to run under different versions of Python interpreter -(yes, even Python 2) we need to include all dependencies as source code -without Python's system stuff. Cx-freeze puts everything into lib and compile -it as .pyc/.pyo files and that doesn't work for hosts like Maya 2020 with -their own Python interpreter and libraries. - -This script will take ``site-packages`` and copy them to built Pype under -``dependencies`` directory. It will then compare stuff inside with ``lib`` -folder in frozen Pype, removing duplicities from there. - -This must be executed after build finished and it is done by build PowerShell -script. - -Note: Speedcopy can be used for copying if server-side copy is important for -speed. - -""" -import os -import sys -import site -from sysconfig import get_platform -import platform -import subprocess -from pathlib import Path -import shutil -import blessed -import enlighten -import time -import re - - -term = blessed.Terminal() -manager = enlighten.get_manager() - - -def _print(msg: str, type: int = 0) -> None: - """Print message to console. - - Args: - msg (str): message to print - type (int): type of message (0 info, 1 error, 2 note) - - """ - if type == 0: - header = term.aquamarine3(">>> ") - elif type == 1: - header = term.orangered2("!!! ") - elif type == 2: - header = term.tan1("... ") - else: - header = term.darkolivegreen3("--- ") - - print(f"{header}{msg}") - - -def count_folders(path: Path) -> int: - """Recursively count items inside given Path. - - Args: - path (Path): Path to count. - - Returns: - int: number of items. - - """ - cnt = 0 - for child in path.iterdir(): - if child.is_dir(): - cnt += 1 - cnt += count_folders(child) - return cnt - - -_print("Starting dependency cleanup ...") -start_time = time.time_ns() - -# path to venv site packages -sites = site.getsitepackages() - -# WARNING: this assumes that all we've got is path to venv itself and -# another path ending with 'site-packages' as is default. But because -# this must run under different platform, we cannot easily check if this path -# is the one, because under Linux and macOS site-packages are in different -# location. -site_pkg = None -for s in sites: - site_pkg = Path(s) - if site_pkg.name == "site-packages": - break - -_print("Getting venv site-packages ...") -assert site_pkg, "No venv site-packages are found." -_print(f"Working with: {site_pkg}", 2) - -openpype_root = Path(os.path.dirname(__file__)).parent -version = {} -with open(openpype_root / "openpype" / "version.py") as fp: - exec(fp.read(), version) - -version_match = re.search(r"(\d+\.\d+.\d+).*", version["__version__"]) -openpype_version = version_match[1] - -# create full path -if platform.system().lower() == "darwin": - build_dir = openpype_root.joinpath( - "build", - f"OpenPype {openpype_version}.app", - "Contents", - "MacOS") -else: - build_subdir = f"exe.{get_platform()}-{sys.version[:3]}" - build_dir = openpype_root / "build" / build_subdir - -_print(f"Using build at {build_dir}", 2) -if not build_dir.exists(): - _print("Build directory doesn't exist", 1) - _print("Probably freezing of code failed. Check ./build/build.log", 3) - sys.exit(1) - - -def _progress(_base, _names): - progress_bar.update() - return [] - - -deps_dir = build_dir / "dependencies" -vendor_dir = build_dir / "vendor" -vendor_src = openpype_root / "vendor" - -# copy vendor files -_print("Copying vendor files ...") - -total_files = count_folders(vendor_src) -progress_bar = enlighten.Counter( - total=total_files, desc="Copying vendor files ...", - units="%", color=(64, 128, 222)) - -shutil.copytree(vendor_src.as_posix(), - vendor_dir.as_posix(), - ignore=_progress) -progress_bar.close() - -# copy all files -_print("Copying dependencies ...") - -total_files = count_folders(site_pkg) -progress_bar = enlighten.Counter( - total=total_files, desc="Processing Dependencies", - units="%", color=(53, 178, 202)) - -shutil.copytree(site_pkg.as_posix(), - deps_dir.as_posix(), - ignore=_progress) -progress_bar.close() -# iterate over frozen libs and create list to delete -libs_dir = build_dir / "lib" - - -# On Linux use rpath from source libraries in destination libraries -if platform.system().lower() == "linux": - src_pyside_dir = openpype_root / "vendor" / "python" / "PySide2" - dst_pyside_dir = build_dir / "vendor" / "python" / "PySide2" - src_rpath_per_so_file = {} - for filepath in src_pyside_dir.glob("*.so"): - filename = filepath.name - rpath = ( - subprocess.check_output(["patchelf", "--print-rpath", filepath]) - .decode("utf-8") - .strip() - ) - src_rpath_per_so_file[filename] = rpath - - for filepath in dst_pyside_dir.glob("*.so"): - filename = filepath.name - if filename not in src_rpath_per_so_file: - continue - src_rpath = src_rpath_per_so_file[filename] - subprocess.check_call( - ["patchelf", "--set-rpath", src_rpath, filepath] - ) - -to_delete = [] -# _print("Finding duplicates ...") -deps_items = list(deps_dir.iterdir()) -item_count = len(list(libs_dir.iterdir())) -find_progress_bar = enlighten.Counter( - total=item_count, desc="Finding duplicates", units="%", - color=(56, 211, 159)) - -for d in libs_dir.iterdir(): - if (deps_dir / d.name) in deps_items: - to_delete.append(d) - # _print(f"found {d}", 3) - find_progress_bar.update() - -find_progress_bar.close() -# add openpype and igniter in libs too -to_delete.append(libs_dir / "openpype") -to_delete.append(libs_dir / "igniter") -to_delete.append(libs_dir / "openpype.pth") -to_delete.append(deps_dir / "openpype.pth") - -# delete duplicates -# _print(f"Deleting {len(to_delete)} duplicates ...") -delete_progress_bar = enlighten.Counter( - total=len(to_delete), desc="Deleting duplicates", units="%", - color=(251, 192, 32)) -for d in to_delete: - if d.is_dir(): - shutil.rmtree(d) - else: - try: - d.unlink() - except FileNotFoundError: - # skip non-existent silently - pass - delete_progress_bar.update() - -delete_progress_bar.close() - -end_time = time.time_ns() -total_time = (end_time - start_time) / 1000000000 -_print(f"Dependency cleanup done in {total_time} secs.") diff --git a/tools/build_win_installer.ps1 b/tools/build_win_installer.ps1 deleted file mode 100644 index 6549e57117..0000000000 --- a/tools/build_win_installer.ps1 +++ /dev/null @@ -1,177 +0,0 @@ -<# -.SYNOPSIS - Helper script to build OpenPype Installer. - -.DESCRIPTION - This script will use already built OpenPype (in `build` directory) and - create Windows installer from it using Inno Setup (https://jrsoftware.org/) - -.EXAMPLE - -PS> .\build_win_installer.ps1 - -#> -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -function Start-Progress { - param([ScriptBlock]$code) - $scroll = "/-\|/-\|" - $idx = 0 - $job = Invoke-Command -ComputerName $env:ComputerName -ScriptBlock { $code } -AsJob - - $origpos = $host.UI.RawUI.CursorPosition - - # $origpos.Y -= 1 - - while (($job.State -eq "Running") -and ($job.State -ne "NotStarted")) - { - $host.UI.RawUI.CursorPosition = $origpos - Write-Host $scroll[$idx] -NoNewline - $idx++ - if ($idx -ge $scroll.Length) - { - $idx = 0 - } - Start-Sleep -Milliseconds 100 - } - # It's over - clear the activity indicator. - $host.UI.RawUI.CursorPosition = $origpos - Write-Host ' ' - <# - .SYNOPSIS - Display spinner for running job - .PARAMETER code - Job to display spinner for - #> -} - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - -function Show-PSWarning() { - if ($PSVersionTable.PSVersion.Major -lt 7) { - Write-Color -Text "!!! ", "You are using old version of PowerShell - ", "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)" -Color Red, Yellow, White - Write-Color -Text " Please update to at least 7.0 - ", "https://github.com/PowerShell/PowerShell/releases" -Color Yellow, White - Exit-WithCode 1 - } -} - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -# Enable if PS 7.x is needed. -# Show-PSWarning - - -Set-Location -Path $openpype_root - -$version_file = Get-Content -Path "$($openpype_root)\openpype\version.py" -$result = [regex]::Matches($version_file, '__version__ = "(?\d+\.\d+.\d+.*)"') -$openpype_version = $result[0].Groups['version'].Value -if (-not $openpype_version) { - Write-Color -Text "!!! ", "Cannot determine OpenPype version." -Color Yellow, Gray - Exit-WithCode 1 -} - -$env:BUILD_VERSION = $openpype_version - -iscc - -Write-Color ">>> ", "Detecting host Python ... " -Color Green, White -NoNewline -$python = "python" -if (Get-Command "pyenv" -ErrorAction SilentlyContinue) { - $pyenv_python = & pyenv which python - if (Test-Path -PathType Leaf -Path "$($pyenv_python)") { - $python = $pyenv_python - } -} -if (-not (Get-Command $python -ErrorAction SilentlyContinue)) { - Write-Color "!!! ", "Python not detected" -Color Red, Yellow - Set-Location -Path $current_dir - Exit-WithCode 1 -} -$version_command = @' -import sys -print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1])) -'@ - -$p = & $python -c $version_command -$env:PYTHON_VERSION = $p -$m = $p -match '(\d+)\.(\d+)' -if(-not $m) { - Write-Color "!!! ", "Cannot determine version" -Color Red, Yellow - Set-Location -Path $current_dir - Exit-WithCode 1 -} -# We are supporting python 3.9 -if (($matches[1] -lt 3) -or ($matches[2] -lt 9)) { - Write-Host "FAILED Version [ $p ] is old and unsupported" -ForegroundColor red - Set-Location -Path $current_dir - Exit-WithCode 1 -} elseif (($matches[1] -eq 3) -and ($matches[2] -gt 9)) { - Write-Host "WARNING Version [ $p ] is unsupported, use at your own risk." -ForegroundColor yellow - Write-Host "*** " -NoNewline -ForegroundColor yellow - Write-Host "OpenPype supports only Python 3.9" -ForegroundColor white -} else { - Write-Host "OK [ $p ]" -ForegroundColor green -} - -Write-Color -Text ">>> ", "Creating OpenPype installer ... " -Color Green, White - -$build_dir_command = @" -import sys -from distutils.util import get_platform -print('exe.{}-{}'.format(get_platform(), sys.version[0:3])) -"@ - -$build_dir = & $python -c $build_dir_command -Write-Color -Text "--- ", "Build directory ", "${build_dir}" -Color Green, Gray, White -$env:BUILD_DIR = $build_dir - -if (-not (Get-Command iscc -errorAction SilentlyContinue -ErrorVariable ProcessError)) { - Write-Color -Text "!!! ", "Cannot find Inno Setup command" -Color Red, Yellow - Write-Color "!!! You can download it at https://jrsoftware.org/" -ForegroundColor red - Exit-WithCode 1 -} - -& iscc "$openpype_root\inno_setup.iss" - -if ($LASTEXITCODE -ne 0) { - Write-Color -Text "!!! ", "Creating installer failed." -Color Red, Yellow - Exit-WithCode 1 -} - -Write-Color -Text ">>> ", "Restoring current directory" -Color Green, Gray -Set-Location -Path $current_dir -try { - New-BurntToastNotification -AppLogo "$openpype_root/openpype/resources/icons/openpype_icon.png" -Text "OpenPype build complete!", "All done. You will find You will find OpenPype installer in '.\build' directory." -} catch {} -Write-Color -Text "*** ", "All done. You will find OpenPype installer in ", "'.\build'", " directory." -Color Green, Gray, White, Gray diff --git a/tools/ci_tools.py b/tools/ci_tools.py deleted file mode 100644 index 750bf8645d..0000000000 --- a/tools/ci_tools.py +++ /dev/null @@ -1,231 +0,0 @@ -import re -import sys -from semver import VersionInfo -from git import Repo -from optparse import OptionParser -from github import Github -import os - -def get_release_type_github(Log, github_token): - minor_labels = ["Bump Minor"] - - g = Github(github_token) - repo = g.get_repo("ynput/OpenPype") - - labels = set() - for line in Log.splitlines(): - match = re.search("pull request #(\d+)", line) - if match: - pr_number = match.group(1) - try: - pr = repo.get_pull(int(pr_number)) - except: - continue - for label in pr.labels: - labels.add(label.name) - - if any(label in labels for label in minor_labels): - return "minor" - else: - return "patch" - - # TODO: if all is working fine, this part can be cleaned up eventually - # if any(label in labels for label in patch_labels): - # return "patch" - - return None - - -def remove_prefix(text, prefix): - return text[text.startswith(prefix) and len(prefix):] - - -def get_last_version(match): - repo = Repo() - assert not repo.bare - version_types = { - "CI": "CI/[0-9]*", - "release": "[0-9]*" - } - tag = repo.git.describe( - '--tags', - f'--match={version_types[match]}', - '--abbrev=0' - ) - - if match == "CI": - return remove_prefix(tag, "CI/"), tag - else: - return tag, tag - - -def get_log_since_tag(version): - repo = Repo() - assert not repo.bare - return repo.git.log(f'{version}..HEAD', '--merges', '--oneline') - - -def release_type(log): - regex_minor = ["feature/", "(feat)"] - regex_patch = ["bugfix/", "fix/", "(fix)", "enhancement/", "update"] - for reg in regex_minor: - if re.search(reg, log): - return "minor" - for reg in regex_patch: - if re.search(reg, log): - return "patch" - return None - - -def file_regex_replace(filename, regex, version): - with open(filename, 'r+') as f: - text = f.read() - text = re.sub(regex, version, text) - # pp.pprint(f"NEW VERSION {version} INSERTED into {filename}") - f.seek(0) - f.write(text) - f.truncate() - - -def bump_file_versions(version, nightly=False): - - filename = "./openpype/version.py" - regex = "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-((0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?" - file_regex_replace(filename, regex, version) - - if nightly: - # skip nightly reversion in pyproject.toml - return - - # bump pyproject.toml - filename = "pyproject.toml" - regex = "version = \"(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(\+((0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\+([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*))?\" # OpenPype" - pyproject_version = f"version = \"{version}\" # OpenPype" - file_regex_replace(filename, regex, pyproject_version) - - -def calculate_next_nightly(type="nightly", github_token=None): - last_prerelease, last_pre_tag = get_last_version("CI") - last_pre_v = VersionInfo.parse(last_prerelease) - last_pre_v_finalized = last_pre_v.finalize_version() - # print(last_pre_v_finalized) - - last_release, last_release_tag = get_last_version("release") - - last_release_v = VersionInfo.parse(last_release) - bump_type = get_release_type_github( - get_log_since_tag(last_release_tag), - github_token - ) - if not bump_type: - return None - - next_release_v = last_release_v.next_version(part=bump_type) - # print(next_release_v) - - if next_release_v > last_pre_v_finalized: - next_tag = next_release_v.bump_prerelease(token=type).__str__() - return next_tag - elif next_release_v == last_pre_v_finalized: - next_tag = last_pre_v.bump_prerelease(token=type).__str__() - return next_tag - -def finalize_latest_nightly(): - last_prerelease, last_pre_tag = get_last_version("CI") - last_pre_v = VersionInfo.parse(last_prerelease) - last_pre_v_finalized = last_pre_v.finalize_version() - # print(last_pre_v_finalized) - - return last_pre_v_finalized.__str__() - -def finalize_prerelease(prerelease): - - if "/" in prerelease: - prerelease = prerelease.split("/")[-1] - - prerelease_v = VersionInfo.parse(prerelease) - prerelease_v_finalized = prerelease_v.finalize_version() - - return prerelease_v_finalized.__str__() - - -def main(): - usage = "usage: %prog [options] arg" - parser = OptionParser(usage) - parser.add_option("-n", "--nightly", - dest="nightly", action="store_true", - help="Bump nightly version and return it") - parser.add_option("-b", "--bump", - dest="bump", action="store_true", - help="Return if there is something to bump") - parser.add_option("-r", "--release-latest", - dest="releaselatest", action="store_true", - help="finalize latest prerelease to a release") - parser.add_option("-p", "--prerelease", - dest="prerelease", action="store", - help="define prerelease type") - parser.add_option("-f", "--finalize", - dest="finalize", action="store", - help="define prerelease type") - parser.add_option("-v", "--version", - dest="version", action="store", - help="work with explicit version") - parser.add_option("-l", "--lastversion", - dest="lastversion", action="store", - help="work with explicit version") - parser.add_option("-g", "--github_token", - dest="github_token", action="store", - help="github token") - - - (options, args) = parser.parse_args() - - if options.bump: - last_release, last_release_tag = get_last_version("release") - bump_type_release = get_release_type_github( - get_log_since_tag(last_release_tag), - options.github_token - ) - if bump_type_release is None: - print("skip") - else: - print(bump_type_release) - - if options.nightly: - next_tag_v = calculate_next_nightly(github_token=options.github_token) - print(next_tag_v) - bump_file_versions(next_tag_v, True) - - if options.finalize: - new_release = finalize_prerelease(options.finalize) - print(new_release) - bump_file_versions(new_release) - - if options.lastversion: - last_release, last_release_tag = get_last_version(options.lastversion) - print(last_release_tag) - - if options.releaselatest: - new_release = finalize_latest_nightly() - last_release, last_release_tag = get_last_version("release") - - if VersionInfo.parse(new_release) > VersionInfo.parse(last_release): - print(new_release) - bump_file_versions(new_release) - else: - print("skip") - - if options.prerelease: - current_prerelease = VersionInfo.parse(options.prerelease) - new_prerelease = current_prerelease.bump_prerelease().__str__() - print(new_prerelease) - bump_file_versions(new_prerelease) - - if options.version: - bump_file_versions(options.version) - print(f"Injected version {options.version} into the release") - - - -if __name__ == "__main__": - main() diff --git a/tools/create_env.ps1 b/tools/create_env.ps1 deleted file mode 100644 index 7d1f6635d0..0000000000 --- a/tools/create_env.ps1 +++ /dev/null @@ -1,196 +0,0 @@ -<# -.SYNOPSIS - Helper script create virtual environment using Poetry. - -.DESCRIPTION - This script will detect Python installation, create venv with Poetry - and install all necessary packages from `poetry.lock` or `pyproject.toml` - needed by OpenPype to be included during application freeze on Windows. - -.EXAMPLE - -PS> .\create_env.ps1 - -.EXAMPLE - -Print verbose information from Poetry: -PS> .\create_env.ps1 --verbose - -#> - -$arguments=$ARGS -$poetry_verbosity=$null -if($arguments -eq "--verbose") { - $poetry_verbosity="-vvv" -} - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -& git submodule update --init --recursive -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - - -function Show-PSWarning() { - if ($PSVersionTable.PSVersion.Major -lt 7) { - Write-Color -Text "!!! ", "You are using old version of PowerShell - ", "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)" -Color Red, Yellow, White - Write-Color -Text " Please update to at least 7.0 - ", "https://github.com/PowerShell/PowerShell/releases" -Color Yellow, White - Exit-WithCode 1 - } -} - - -function Install-Poetry() { - Write-Color -Text ">>> ", "Installing Poetry ... " -Color Green, Gray - $python = "python" - if (Get-Command "pyenv" -ErrorAction SilentlyContinue) { - if (-not (Test-Path -PathType Leaf -Path "$($openpype_root)\.python-version")) { - $result = & pyenv global - if ($result -eq "no global version configured") { - Write-Color -Text "!!! ", "Using pyenv but having no local or global version of Python set." -Color Red, Yellow - Exit-WithCode 1 - } - } - $python = & pyenv which python - - } - - $env:POETRY_HOME="$openpype_root\.poetry" - $env:POETRY_VERSION="1.3.2" - (Invoke-WebRequest -Uri https://install.python-poetry.org/ -UseBasicParsing).Content | & $($python) - -} - - -function Test-Python() { - Write-Color -Text ">>> ", "Detecting host Python ... " -Color Green, Gray -NoNewline - $python = "python" - if (Get-Command "pyenv" -ErrorAction SilentlyContinue) { - $pyenv_python = & pyenv which python - if (Test-Path -PathType Leaf -Path "$($pyenv_python)") { - $python = $pyenv_python - } - } - if (-not (Get-Command $python -ErrorAction SilentlyContinue)) { - Write-Host "!!! Python not detected" -ForegroundColor red - Set-Location -Path $current_dir - Exit-WithCode 1 - } - $version_command = @' -import sys -print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1])) -'@ - - $p = & $python -c $version_command - $env:PYTHON_VERSION = $p - $m = $p -match '(\d+)\.(\d+)' - if(-not $m) { - Write-Host "!!! Cannot determine version" -ForegroundColor red - Set-Location -Path $current_dir - Exit-WithCode 1 - } - # We are supporting python 3.9 only - if (([int]$matches[1] -lt 3) -or ([int]$matches[2] -lt 9)) { - Write-Color -Text "FAILED ", "Version ", "[", $p ,"]", "is old and unsupported" -Color Red, Yellow, Cyan, White, Cyan, Yellow - Set-Location -Path $current_dir - Exit-WithCode 1 - } elseif (([int]$matches[1] -eq 3) -and ([int]$matches[2] -gt 9)) { - Write-Color -Text "WARNING Version ", "[", $p, "]", " is unsupported, use at your own risk." -Color Yellow, Cyan, White, Cyan, Yellow - Write-Color -Text "*** ", "OpenPype supports only Python 3.9" -Color Yellow, White - } else { - Write-Color "OK ", "[", $p, "]" -Color Green, Cyan, White, Cyan - } -} - -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} - - -Set-Location -Path $openpype_root - -$art = @" - - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - - -"@ -if (-not (Test-Path 'env:_INSIDE_OPENPYPE_TOOL')) { - Write-Host $art -ForegroundColor DarkGreen -} - -# Enable if PS 7.x is needed. -# Show-PSWarning - -$version_file = Get-Content -Path "$($openpype_root)\openpype\version.py" -$result = [regex]::Matches($version_file, '__version__ = "(?\d+\.\d+.\d+.*)"') -$openpype_version = $result[0].Groups['version'].Value -if (-not $openpype_version) { - Write-Color -Text "!!! ", "Cannot determine OpenPype version." -Color Red, Yellow - Set-Location -Path $current_dir - Exit-WithCode 1 -} -Write-Color -Text ">>> ", "Found OpenPype version ", "[ ", $($openpype_version), " ]" -Color Green, Gray, Cyan, White, Cyan - -Test-Python - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Install-Poetry - Write-Color -Text "INSTALLED" -Color Cyan -} else { - Write-Color -Text "OK" -Color Green -} - -if (-not (Test-Path -PathType Leaf -Path "$($openpype_root)\poetry.lock")) { - Write-Color -Text ">>> ", "Installing virtual environment and creating lock." -Color Green, Gray -} else { - Write-Color -Text ">>> ", "Installing virtual environment from lock." -Color Green, Gray -} -$startTime = [int][double]::Parse((Get-Date -UFormat %s)) -& "$env:POETRY_HOME\bin\poetry" install --no-root $poetry_verbosity --ansi -if ($LASTEXITCODE -ne 0) { - Write-Color -Text "!!! ", "Poetry command failed." -Color Red, Yellow - Set-Location -Path $current_dir - Exit-WithCode 1 -} -Write-Color -Text ">>> ", "Installing pre-commit hooks ..." -Color Green, White -& "$env:POETRY_HOME\bin\poetry" run pre-commit install -if ($LASTEXITCODE -ne 0) { - Write-Color -Text "!!! ", "Installation of pre-commit hooks failed." -Color Red, Yellow - Set-Location -Path $current_dir - Exit-WithCode 1 -} - -$endTime = [int][double]::Parse((Get-Date -UFormat %s)) -Set-Location -Path $current_dir -try -{ - New-BurntToastNotification -AppLogo "$openpype_root/openpype/resources/icons/openpype_icon.png" -Text "OpenPype", "Virtual environment created.", "All done in $( $endTime - $startTime ) secs." -} catch {} -Write-Color -Text ">>> ", "Virtual environment created." -Color Green, White diff --git a/tools/create_env.sh b/tools/create_env.sh deleted file mode 100755 index 6915d3f000..0000000000 --- a/tools/create_env.sh +++ /dev/null @@ -1,202 +0,0 @@ -#!/usr/bin/env bash - -# This script will detect Python installation, create venv with Poetry -# and install all necessary packages from `poetry.lock` or `pyproject.toml` -# needed by OpenPype to be included during application freeze on unix. - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -poetry_verbosity="" -while :; do - case $1 in - --verbose) - poetry_verbosity="-vvv" - ;; - --) - shift - break - ;; - *) - break - esac - shift -done - - -############################################################################## -# Detect required version of python -# Globals: -# colors -# PYTHON -# Arguments: -# None -# Returns: -# None -############################################################################### -detect_python () { - echo -e "${BIGreen}>>>${RST} Using python \c" - command -v python >/dev/null 2>&1 || { echo -e "${BIRed}- NOT FOUND${RST} ${BIYellow}You need Python 3.9 installed to continue.${RST}"; return 1; } - local version_command="import sys;print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" - local python_version="$(python <<< ${version_command})" - oIFS="$IFS" - IFS=. - set -- $python_version - IFS="$oIFS" - if [ "$1" -ge "3" ] && [ "$2" -ge "9" ] ; then - if [ "$2" -gt "9" ] ; then - echo -e "${BIWhite}[${RST} ${BIRed}$1.$2 ${BIWhite}]${RST} - ${BIRed}FAILED${RST} ${BIYellow}Version is new and unsupported, use${RST} ${BIPurple}3.9.x${RST}"; return 1; - else - echo -e "${BIWhite}[${RST} ${BIGreen}$1.$2${RST} ${BIWhite}]${RST}" - fi - else - command -v python >/dev/null 2>&1 || { echo -e "${BIRed}$1.$2$ - ${BIRed}FAILED${RST} ${BIYellow}Version is old and unsupported${RST}"; return 1; } - fi -} - -install_poetry () { - echo -e "${BIGreen}>>>${RST} Installing Poetry ..." - export POETRY_HOME="$openpype_root/.poetry" - export POETRY_VERSION="1.3.2" - command -v curl >/dev/null 2>&1 || { echo -e "${BIRed}!!!${RST}${BIYellow} Missing ${RST}${BIBlue}curl${BIYellow} command.${RST}"; return 1; } - curl -sSL https://install.python-poetry.org/ | python - -} - -############################################################################## -# Clean pyc files in specified directory -# Globals: -# None -# Arguments: -# Optional path to clean -# Returns: -# None -############################################################################### -clean_pyc () { - local path - path=$openpype_root - echo -e "${BIGreen}>>>${RST} Cleaning pyc at [ ${BIWhite}$path${RST} ] ... \c" - find "$path" -path ./build -o -regex '^.*\(__pycache__\|\.py[co]\)$' -delete - echo -e "${BIGreen}DONE${RST}" -} - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -main () { - # Main - if [[ -z $_inside_openpype_tool ]]; then - echo -e "${BGreen}" - art - echo -e "${RST}" - fi - detect_python || return 1 - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - install_poetry || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return 1; } - fi - - if [ -f "$openpype_root/poetry.lock" ]; then - echo -e "${BIGreen}>>>${RST} Updating dependencies ..." - else - echo -e "${BIGreen}>>>${RST} Installing dependencies ..." - fi - - "$POETRY_HOME/bin/poetry" install --no-root $poetry_verbosity || { echo -e "${BIRed}!!!${RST} Poetry environment installation failed"; return 1; } - if [ $? -ne 0 ] ; then - echo -e "${BIRed}!!!${RST} Virtual environment creation failed." - return 1 - fi - - echo -e "${BIGreen}>>>${RST} Cleaning cache files ..." - clean_pyc - - # reinstall these because of bug in poetry? or cx_freeze? - # cx_freeze will crash on missing __pychache__ on these but - # reinstalling them solves the problem. - echo -e "${BIGreen}>>>${RST} Post-venv creation fixes ..." - local openpype_index=$("$POETRY_HOME/bin/poetry" run python "$openpype_root/tools/parse_pyproject.py" tool.poetry.source.0.url) - echo -e "${BIGreen}- ${RST} Using index: ${BIWhite}$openpype_index${RST}" - "$POETRY_HOME/bin/poetry" run python -m pip install --disable-pip-version-check --force-reinstall pip - echo -e "${BIGreen}>>>${RST} Installing pre-commit hooks ..." - "$POETRY_HOME/bin/poetry" run pre-commit install -} - -return_code=0 -main || return_code=$? -exit $return_code diff --git a/tools/create_zip.ps1 b/tools/create_zip.ps1 deleted file mode 100644 index e5ebc7678b..0000000000 --- a/tools/create_zip.ps1 +++ /dev/null @@ -1,105 +0,0 @@ -<# -.SYNOPSIS - Helper script create distributable OpenPype zip. - -.DESCRIPTION - This script will detect Python installation and run OpenPype to create - zip. It will create zip from current source code - version and copy it top `%LOCALAPPDATA%/pypeclub/openpype` if `--path` or `-p` - argument is not used. - -.EXAMPLE - -PS> .\create_zip.ps1 - -.EXAMPLE - -To put generated zip to C:\OpenPype directory: -PS> .\create_zip.ps1 --path C:\OpenPype - -#> - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - - -function Show-PSWarning() { - if ($PSVersionTable.PSVersion.Major -lt 7) { - Write-Color -Text "!!! ", "You are using old version of PowerShell - ", "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)" -Color Red, Yellow, White - Write-Color -Text " Please update to at least 7.0 - ", "https://github.com/PowerShell/PowerShell/releases" -Color Yellow, White - Exit-WithCode 1 - } -} - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} - -Set-Location -Path $openpype_root - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -# Enable if PS 7.x is needed. -# Show-PSWarning - -$version_file = Get-Content -Path "$($openpype_root)\openpype\version.py" -$result = [regex]::Matches($version_file, '__version__ = "(?\d+\.\d+.\d+.*)"') -$openpype_version = $result[0].Groups['version'].Value -if (-not $openpype_version) { - Write-Color -Text "!!! ", "Cannot determine OpenPype version." -Color Yellow, Gray - Exit-WithCode 1 -} - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Write-Color -Text "*** ", "We need to install Poetry create virtual env first ..." -Color Yellow, Gray - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Color -Text "OK" -Color Green -} - -Write-Color -Text ">>> ", "Cleaning cache files ... " -Color Green, Gray -NoNewline -Get-ChildItem $openpype_root -Filter "__pycache__" -Force -Recurse| Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force -Recurse -Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object {( $_.FullName -inotmatch '\\build\\' ) -and ( $_.FullName -inotmatch '\\.venv' )} | Remove-Item -Force -Write-Color -Text "OK" -Color Green - -Write-Color -Text ">>> ", "Generating zip from current sources ..." -Color Green, Gray -$env:PYTHONPATH="$($openpype_root);$($env:PYTHONPATH)" -$env:OPENPYPE_ROOT="$($openpype_root)" -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\tools\create_zip.py" $ARGS -Set-Location -Path $current_dir diff --git a/tools/create_zip.py b/tools/create_zip.py deleted file mode 100644 index 6392428f58..0000000000 --- a/tools/create_zip.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -"""Create OpenPype version from live sources.""" -from igniter import bootstrap_repos -import click -import enlighten -import blessed -from pathlib2 import Path - - -term = blessed.Terminal() -manager = enlighten.get_manager() -last_increment = 0 - - -@click.group(invoke_without_command=True) -@click.option("--path", required=False, - help="path where to put version", - type=click.Path(exists=True)) -def main(path): - # create zip file - - progress_bar = enlighten.Counter( - total=100, desc="OpenPype ZIP", units="%", color="green") - - def progress(inc: int): - """Progress handler.""" - global last_increment - progress_bar.update(incr=inc - last_increment) - last_increment = inc - - bs = bootstrap_repos.BootstrapRepos(progress_callback=progress) - if path: - out_path = Path(path) - bs.data_dir = out_path - if out_path.is_file(): - bs.data_dir = out_path.parent - - _print(f"Creating zip in {bs.data_dir} ...") - repo_file = bs.create_version_from_live_code() - if not repo_file: - _print("Error while creating zip file.", 1) - exit(1) - - _print(f"Created {repo_file}") - - -def _print(msg: str, message_type: int = 0) -> None: - """Print message to console. - - Args: - msg (str): message to print - message_type (int): type of message (0 info, 1 error, 2 note) - - """ - if message_type == 0: - header = term.aquamarine3(">>> ") - elif message_type == 1: - header = term.orangered2("!!! ") - elif message_type == 2: - header = term.tan1("... ") - else: - header = term.darkolivegreen3("--- ") - - print(f"{header}{msg}") - - -if __name__ == "__main__": - main() diff --git a/tools/create_zip.sh b/tools/create_zip.sh deleted file mode 100755 index 316d456338..0000000000 --- a/tools/create_zip.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env bash - -# This script will detect Python installation and run OpenPype to create -# zip. It needs mongodb running. I will create zip from current source code -# version and copy it top `~/.local/share/pype` if `--path` or `-p` -# argument is not used. - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Detect required version of python -# Globals: -# colors -# PYTHON -# Arguments: -# None -# Returns: -# None -############################################################################### -detect_python () { - echo -e "${BIGreen}>>>${RST} Using python \c" - local version_command="import sys;print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" - local python_version="$(python3 <<< ${version_command})" - oIFS="$IFS" - IFS=. - set -- $python_version - IFS="$oIFS" - if [ "$1" -ge "3" ] && [ "$2" -ge "9" ] ; then - if [ "$2" -gt "9" ] ; then - echo -e "${BIWhite}[${RST} ${BIRed}$1.$2 ${BIWhite}]${RST} - ${BIRed}FAILED${RST} ${BIYellow}Version is new and unsupported, use${RST} ${BIPurple}3.9.x${RST}"; return 1; - else - echo -e "${BIWhite}[${RST} ${BIGreen}$1.$2${RST} ${BIWhite}]${RST}" - fi - else - command -v python3 >/dev/null 2>&1 || { echo -e "${BIRed}$1.$2$ - ${BIRed}FAILED${RST} ${BIYellow}Version is old and unsupported${RST}"; return 1; } - fi -} - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - echo -e "${BGreen}" - art - echo -e "${RST}" - detect_python || return 1 - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - echo -e "${BIGreen}>>>${RST} Generating zip from current sources ..." - export PYTHONPATH="$openpype_root:$PYTHONPATH" - export OPENPYPE_ROOT="$openpype_root" - "$POETRY_HOME/bin/poetry" run python3 "$openpype_root/tools/create_zip.py" "$@" -} - -main "$@" diff --git a/tools/docker_build.ps1 b/tools/docker_build.ps1 deleted file mode 100644 index 392165288c..0000000000 --- a/tools/docker_build.ps1 +++ /dev/null @@ -1,98 +0,0 @@ -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$repo_root = (Get-Item $script_dir).parent.FullName - -$env:PSModulePath = $env:PSModulePath + ";$($repo_root)\tools\modules\powershell" - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - -function Restore-Cwd() { - $tmp_current_dir = Get-Location - if ("$tmp_current_dir" -ne "$current_dir") { - Write-Color -Text ">>> ", "Restoring current directory" -Color Green, Gray - Set-Location -Path $current_dir - } -} - -function Get-Container { - if (-not (Test-Path -PathType Leaf -Path "$($repo_root)\build\docker-image.id")) { - Write-Color -Text "!!! ", "Docker command failed, cannot find image id." -Color Red, Yellow - Restore-Cwd - Exit-WithCode 1 - } - $id = Get-Content "$($repo_root)\build\docker-image.id" - Write-Color -Text ">>> ", "Creating container from image id ", "[", $id, "]" -Color Green, Gray, White, Cyan, White - $cid = docker create $id bash - if ($LASTEXITCODE -ne 0) { - Write-Color -Text "!!! ", "Cannot create container." -Color Red, Yellow - Restore-Cwd - Exit-WithCode 1 - } - return $cid -} - -function Change-Cwd() { - Set-Location -Path $repo_root -} - -function New-DockerBuild { - $version_file = Get-Content -Path "$($repo_root)\openpype\version.py" - $result = [regex]::Matches($version_file, '__version__ = "(?\d+\.\d+.\d+.*)"') - $openpype_version = $result[0].Groups['version'].Value - $startTime = [int][double]::Parse((Get-Date -UFormat %s)) - Write-Color -Text ">>> ", "Building OpenPype using Docker ..." -Color Green, Gray, White - $variant = $args[0] - if ($variant.Length -eq 0) { - $dockerfile = "$($repo_root)\Dockerfile" - } else { - $dockerfile = "$( $repo_root )\Dockerfile.$variant" - } - if (-not (Test-Path -PathType Leaf -Path $dockerfile)) { - Write-Color -Text "!!! ", "Dockerfile for specifed platform ", "[", $variant, "]", "doesn't exist." -Color Red, Yellow, Cyan, White, Cyan, Yellow - Restore-Cwd - Exit-WithCode 1 - } - Write-Color -Text ">>> ", "Using Dockerfile for ", "[ ", $variant, " ]" -Color Green, Gray, White, Cyan, White - - $build_dir = "$($repo_root)\build" - if (-not(Test-Path $build_dir)) { - New-Item -ItemType Directory -Path $build_dir - } - Write-Color -Text "--- ", "Cleaning build directory ..." -Color Yellow, Gray - try { - Remove-Item -Recurse -Force "$($build_dir)\*" - } catch { - Write-Color -Text "!!! ", "Cannot clean build directory, possibly because process is using it." -Color Red, Gray - Write-Color -Text $_.Exception.Message -Color Red - Exit-WithCode 1 - } - - Write-Color -Text ">>> ", "Running Docker build ..." -Color Green, Gray, White - docker build --pull --iidfile $repo_root/build/docker-image.id --build-arg BUILD_DATE=$(Get-Date -UFormat %Y-%m-%dT%H:%M:%SZ) --build-arg VERSION=$openpype_version -t pypeclub/openpype:$openpype_version -f $dockerfile . - if ($LASTEXITCODE -ne 0) { - Write-Color -Text "!!! ", "Docker command failed.", $LASTEXITCODE -Color Red, Yellow, Red - Restore-Cwd - Exit-WithCode 1 - } - Write-Color -Text ">>> ", "Copying build from container ..." -Color Green, Gray, White - $cid = Get-Container - - docker cp "$($cid):/opt/openpype/build/exe.linux-x86_64-3.9" "$($repo_root)/build" - docker cp "$($cid):/opt/openpype/build/build.log" "$($repo_root)/build" - - $endTime = [int][double]::Parse((Get-Date -UFormat %s)) - try { - New-BurntToastNotification -AppLogo "$openpype_root/openpype/resources/icons/openpype_icon.png" -Text "OpenPype build complete!", "All done in $( $endTime - $startTime ) secs. You will find OpenPype and build log in build directory." - } catch {} - Write-Color -Text "*** ", "All done in ", $($endTime - $startTime), " secs. You will find OpenPype and build log in ", "'.\build'", " directory." -Color Green, Gray, White, Gray, White, Gray -} - -Change-Cwd -New-DockerBuild $ARGS diff --git a/tools/docker_build.sh b/tools/docker_build.sh deleted file mode 100755 index 732f6a598b..0000000000 --- a/tools/docker_build.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env bash - -# Colors for terminal - -RST='\033[0m' # Text Reset -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIRed='\033[1;91m' # Red - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -create_container () { - if [ ! -f "$openpype_root/build/docker-image.id" ]; then - echo -e "${BIRed}!!!${RST} Docker command failed, cannot find image id." - exit 1 - fi - local id=$(<"$openpype_root/build/docker-image.id") - echo -e "${BIYellow}---${RST} Creating container from $id ..." - cid="$(docker create $id bash)" - if [ $? -ne 0 ] ; then - echo -e "${BIRed}!!!${RST} Cannot create container." - exit 1 - fi -} - -retrieve_build_log () { - create_container - echo -e "${BIYellow}***${RST} Copying build log to ${BIWhite}$openpype_root/build/build.log${RST}" - docker cp "$cid:/opt/openpype/build/build.log" "$openpype_root/build" -} - -openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - -if [ -z $1 ]; then - dockerfile="Dockerfile" -else - dockerfile="Dockerfile.$1" - if [ ! -f "$openpype_root/$dockerfile" ]; then - echo -e "${BIRed}!!!${RST} Dockerfile for specifed platform ${BIWhite}$1${RST} doesn't exist." - exit 1 - else - echo -e "${BIGreen}>>>${RST} Using Dockerfile for ${BIWhite}$1${RST} ..." - fi -fi - -# Main -main () { - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIYellow}---${RST} Cleaning build directory ..." - rm -rf "$openpype_root/build" && mkdir "$openpype_root/build" > /dev/null - - local version_command="import os;exec(open(os.path.join('$openpype_root', 'openpype', 'version.py')).read());print(__version__);" - local openpype_version="$(python3 <<< ${version_command})" - - echo -e "${BIGreen}>>>${RST} Running docker build ..." - # docker build --pull --no-cache -t pypeclub/openpype:$openpype_version . - docker build --pull --iidfile $openpype_root/build/docker-image.id --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') --build-arg VERSION=$openpype_version -t pypeclub/openpype:$openpype_version -f $dockerfile . - if [ $? -ne 0 ] ; then - echo $? - echo -e "${BIRed}!!!${RST} Docker build failed." - retrieve_build_log - return 1 - fi - - echo -e "${BIGreen}>>>${RST} Copying build from container ..." - create_container - echo -e "${BIYellow}---${RST} Copying ..." - docker cp "$cid:/opt/openpype/build/exe.linux-x86_64-3.9" "$openpype_root/build" - docker cp "$cid:/opt/openpype/build/build.log" "$openpype_root/build" - if [ $? -ne 0 ] ; then - echo -e "${BIRed}!!!${RST} Copying failed." - return 1 - fi - - echo -e "${BIGreen}>>>${RST} Fixing user ownership ..." - local username="$(logname)" - chown -R $username ./build - - echo -e "${BIGreen}>>>${RST} All done, you can delete container:" - echo -e "${BIYellow}$cid${RST}" -} - -return_code=0 -main || return_code=$? -exit $return_code diff --git a/tools/fetch_thirdparty_libs.ps1 b/tools/fetch_thirdparty_libs.ps1 deleted file mode 100644 index 4df007ad67..0000000000 --- a/tools/fetch_thirdparty_libs.ps1 +++ /dev/null @@ -1,44 +0,0 @@ -<# -.SYNOPSIS - Download and extract third-party dependencies for OpenPype. - -.DESCRIPTION - This will download third-party dependencies specified in pyproject.toml - and extract them to vendor/bin folder. - -.EXAMPLE - -PS> .\fetch_thirdparty_libs.ps1 - -#> -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} - -Set-Location -Path $openpype_root - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Write-Color -Text "*** ", "We need to install Poetry create virtual env first ..." -Color Yellow, Gray - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Color -Text "OK" -Color Green -} -$startTime = [int][double]::Parse((Get-Date -UFormat %s)) -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\tools\fetch_thirdparty_libs.py" -$endTime = [int][double]::Parse((Get-Date -UFormat %s)) -Set-Location -Path $current_dir -try -{ - New-BurntToastNotification -AppLogo "$openpype_root/openpype/resources/icons/openpype_icon.png" -Text "OpenPype", "Dependencies downloaded", "All done in $( $endTime - $startTime ) secs." -} catch {} \ No newline at end of file diff --git a/tools/fetch_thirdparty_libs.py b/tools/fetch_thirdparty_libs.py deleted file mode 100644 index c2dc4636d0..0000000000 --- a/tools/fetch_thirdparty_libs.py +++ /dev/null @@ -1,244 +0,0 @@ -# -*- coding: utf-8 -*- -"""Fetch, verify and process third-party dependencies of OpenPype. - -Those should be defined in `pyproject.toml` in OpenPype sources root. - -""" -import os -import sys -import toml -import shutil -from pathlib import Path -from urllib.parse import urlparse -import requests -import enlighten -import platform -import blessed -import tempfile -import math -import hashlib -import tarfile -import zipfile -import time -import subprocess - - -term = blessed.Terminal() -manager = enlighten.get_manager() -hash_buffer_size = 65536 - - -def sha256_sum(filename: Path): - """Calculate sha256 hash for given file. - - Args: - filename (Path): path to file. - - Returns: - str: hex hash. - - """ - _hash = hashlib.sha256() - with open(filename, 'rb', buffering=0) as f: - buffer = bytearray(128 * 1024) - mv = memoryview(buffer) - for n in iter(lambda: f.readinto(mv), 0): - _hash.update(mv[:n]) - return _hash.hexdigest() - - -def _print(msg: str, message_type: int = 0) -> None: - """Print message to console. - - Args: - msg (str): message to print - message_type (int): type of message (0 info, 1 error, 2 note) - - """ - if message_type == 0: - header = term.aquamarine3(">>> ") - elif message_type == 1: - header = term.orangered2("!!! ") - elif message_type == 2: - header = term.tan1("... ") - else: - header = term.darkolivegreen3("--- ") - - print(f"{header}{msg}") - - -def _pip_install(openpype_root, package, version=None): - arg = None - if package and version: - arg = f"{package}=={version}" - elif package: - arg = package - - if not arg: - _print("Couldn't find package to install") - sys.exit(1) - - _print(f"We'll install {arg}") - - python_vendor_dir = openpype_root / "vendor" / "python" - try: - subprocess.run( - [ - sys.executable, - "-m", "pip", "install", "--upgrade", arg, - "-t", str(python_vendor_dir) - ], - check=True, - stdout=subprocess.DEVNULL - ) - except subprocess.CalledProcessError as e: - _print(f"Error during {package} installation.", 1) - _print(str(e), 1) - sys.exit(1) - - -def install_qtbinding(pyproject, openpype_root, platform_name): - _print("Handling Qt binding framework ...") - qtbinding_def = pyproject["openpype"]["qtbinding"][platform_name] - package = qtbinding_def["package"] - version = qtbinding_def.get("version") - _pip_install(openpype_root, package, version) - - python_vendor_dir = openpype_root / "vendor" / "python" - - # Remove libraries for QtSql which don't have available libraries - # by default and Postgre library would require to modify rpath of - # dependency - if platform_name == "darwin": - sqldrivers_dir = ( - python_vendor_dir / package / "Qt" / "plugins" / "sqldrivers" - ) - for filepath in sqldrivers_dir.iterdir(): - os.remove(str(filepath)) - - -def install_runtime_dependencies(pyproject, openpype_root): - _print("Installing Runtime Dependencies ...") - runtime_deps = pyproject["openpype"]["runtime-deps"] - for package, version in runtime_deps.items(): - _pip_install(openpype_root, package, version) - - -def install_thirdparty(pyproject, openpype_root, platform_name): - _print("Processing third-party dependencies ...") - try: - thirdparty = pyproject["openpype"]["thirdparty"] - except AttributeError: - _print("No third-party libraries specified in pyproject.toml", 1) - sys.exit(1) - - for k, v in thirdparty.items(): - _print(f"processing {k}") - destination_path = openpype_root / "vendor" / "bin" / k - - if not v.get(platform_name): - _print(("missing definition for current " - f"platform [ {platform_name} ]"), 2) - _print("trying to get universal url for all platforms") - url = v.get("url") - if not url: - _print("cannot get url for all platforms", 1) - _print((f"Warning: {k} is not installed for current platform " - "and it might be missing in the build"), 1) - continue - else: - url = v.get(platform_name).get("url") - destination_path = destination_path / platform_name - - parsed_url = urlparse(url) - - # check if file is already extracted in /vendor/bin - if destination_path.exists(): - _print("destination path already exists, deleting ...", 2) - if destination_path.is_dir(): - try: - shutil.rmtree(destination_path) - except OSError as e: - _print("cannot delete folder.", 1) - raise SystemExit(e) - - # download file - _print(f"Downloading {url} ...") - with tempfile.TemporaryDirectory() as temp_dir: - temp_file = Path(temp_dir) / Path(parsed_url.path).name - - r = requests.get(url, stream=True) - content_len = int(r.headers.get('Content-Length', '0')) or None - with manager.counter( - color='green', - total=content_len and math.ceil(content_len / 2 ** 20), - unit='MiB', - leave=False - ) as counter: - with open(temp_file, 'wb', buffering=2 ** 24) as file_handle: - for chunk in r.iter_content(chunk_size=2 ** 20): - file_handle.write(chunk) - counter.update() - - # get file with checksum - _print("Calculating sha256 ...", 2) - calc_checksum = sha256_sum(temp_file) - - if v.get(platform_name): - item_hash = v.get(platform_name).get("hash") - else: - item_hash = v.get("hash") - - if item_hash != calc_checksum: - _print("Downloaded files checksum invalid.") - sys.exit(1) - - _print("File OK", 3) - if not destination_path.exists(): - destination_path.mkdir(parents=True) - - # extract to destination - archive_type = temp_file.suffix.lstrip(".") - _print(f"Extracting {archive_type} file to {destination_path}") - if archive_type in ['zip']: - zip_file = zipfile.ZipFile(temp_file) - zip_file.extractall(destination_path) - zip_file.close() - - elif archive_type in [ - 'tar', 'tgz', 'tar.gz', 'tar.xz', 'tar.bz2' - ]: - if archive_type == 'tar': - tar_type = 'r:' - elif archive_type.endswith('xz'): - tar_type = 'r:xz' - elif archive_type.endswith('gz'): - tar_type = 'r:gz' - elif archive_type.endswith('bz2'): - tar_type = 'r:bz2' - else: - tar_type = 'r:*' - try: - tar_file = tarfile.open(temp_file, tar_type) - except tarfile.ReadError: - raise SystemExit("corrupted archive") - tar_file.extractall(destination_path) - tar_file.close() - _print("Extraction OK", 3) - - -def main(): - start_time = time.time_ns() - openpype_root = Path(os.path.dirname(__file__)).parent - pyproject = toml.load(openpype_root / "pyproject.toml") - platform_name = platform.system().lower() - install_qtbinding(pyproject, openpype_root, platform_name) - install_runtime_dependencies(pyproject, openpype_root) - install_thirdparty(pyproject, openpype_root, platform_name) - end_time = time.time_ns() - total_time = (end_time - start_time) / 1000000000 - _print(f"Downloading and extracting took {total_time} secs.") - - -if __name__ == "__main__": - main() diff --git a/tools/fetch_thirdparty_libs.sh b/tools/fetch_thirdparty_libs.sh deleted file mode 100755 index 940af76ed6..0000000000 --- a/tools/fetch_thirdparty_libs.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - echo -e "${BGreen}" - art - echo -e "${RST}" - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Running Pype tool ..." - "$POETRY_HOME/bin/poetry" run python "$openpype_root/tools/fetch_thirdparty_libs.py" -} - -main diff --git a/tools/get_python_packages_info.py b/tools/get_python_packages_info.py deleted file mode 100644 index b4952840e6..0000000000 --- a/tools/get_python_packages_info.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -"""Get version and license information on used Python packages. - -This is getting over all packages installed with Poetry and printing out -their name, version and available license information from PyPi in Markdown -table format. - -Usage: - ./.poetry/bin/poetry run python ./tools/get_python_packages_info.py - -""" - -import toml -import requests - - -packages = [] - -# define column headers -package_header = "Package" -version_header = "Version" -license_header = "License" - -name_col_width = len(package_header) -version_col_width = len(version_header) -license_col_width = len(license_header) - -# read lock file to get packages -with open("poetry.lock", "r") as fb: - lock_content = toml.load(fb) - - for package in lock_content["package"]: - # query pypi for license information - url = f"https://pypi.org/pypi/{package['name']}/json" - response = requests.get( - f"https://pypi.org/pypi/{package['name']}/json") - package_data = response.json() - version = package.get("version") or "N/A" - try: - package_license = package_data["info"].get("license") or "N/A" - except KeyError: - package_license = "N/A" - - if len(package_license) > 64: - package_license = f"{package_license[:32]}..." - packages.append( - ( - package["name"], - version, - package_license - ) - ) - - # update column width based on max string length - if len(package["name"]) > name_col_width: - name_col_width = len(package["name"]) - if len(version) > version_col_width: - version_col_width = len(version) - if len(package_license) > license_col_width: - license_col_width = len(package_license) - -# pad columns -name_col_width += 2 -version_col_width += 2 -license_col_width += 2 - -# print table header -print((f"|{package_header.center(name_col_width)}" - f"|{version_header.center(version_col_width)}" - f"|{license_header.center(license_col_width)}|")) - -print( - "|" + ("-" * len(package_header.center(name_col_width))) + - "|" + ("-" * len(version_header.center(version_col_width))) + - "|" + ("-" * len(license_header.center(license_col_width))) + "|") - -# print rest of the table -for package in packages: - print(( - f"|{package[0].center(name_col_width)}" - f"|{package[1].center(version_col_width)}" - f"|{package[2].center(license_col_width)}|" - )) diff --git a/tools/make_docs.ps1 b/tools/make_docs.ps1 deleted file mode 100644 index 43ecd0c09c..0000000000 --- a/tools/make_docs.ps1 +++ /dev/null @@ -1,73 +0,0 @@ -<# -.SYNOPSIS - Helper script to update OpenPype Sphinx sources. - -.DESCRIPTION - This script will run apidoc over OpenPype sources and generate new source rst - files for documentation. Then it will run build_sphinx to create test html - documentation build. - -.EXAMPLE - -PS> .\make_docs.ps1 - -#> - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} - -Set-Location -Path $openpype_root - - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -Write-Host $art -ForegroundColor DarkGreen - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Install-Poetry - Write-Color -Text "INSTALLED" -Color Cyan -} else { - Write-Color -Text "OK" -Color Green -} - -Write-Color -Text "... ", "This will not overwrite existing source rst files, only scan and add new." -Color Yellow, Gray -Set-Location -Path $openpype_root -Write-Color -Text ">>> ", "Running apidoc ..." -Color Green, Gray -& "$env:POETRY_HOME\bin\poetry" run sphinx-apidoc -M -e -d 10 --ext-intersphinx --ext-todo --ext-coverage --ext-viewcode -o "$($openpype_root)\docs\source" igniter -& "$env:POETRY_HOME\bin\poetry" run sphinx-apidoc.exe -M -e -d 10 --ext-intersphinx --ext-todo --ext-coverage --ext-viewcode -o "$($openpype_root)\docs\source" openpype vendor, openpype\vendor - -Write-Color -Text ">>> ", "Building html ..." -Color Green, Gray -& "$env:POETRY_HOME\bin\poetry" run python "$($openpype_root)\setup.py" build_sphinx -Set-Location -Path $current_dir diff --git a/tools/make_docs.sh b/tools/make_docs.sh deleted file mode 100755 index 52ee57dcf0..0000000000 --- a/tools/make_docs.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env bash - -# This script will run apidoc over OpenPype sources and generate new source rst -# files for documentation. Then it will run build_sphinx to create test html -# documentation build. - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - echo -e "${BGreen}" - art - echo -e "${RST}" - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Running apidoc ..." - "$POETRY_HOME/bin/poetry" run sphinx-apidoc -M -e -d 10 --ext-intersphinx --ext-todo --ext-coverage --ext-viewcode -o "$openpype_root/docs/source" igniter - "$POETRY_HOME/bin/poetry" run sphinx-apidoc -M -e -d 10 --ext-intersphinx --ext-todo --ext-coverage --ext-viewcode -o "$openpype_root/docs/source" openpype vendor, openpype\vendor - - echo -e "${BIGreen}>>>${RST} Building html ..." - "$POETRY_HOME/bin/poetry" run python3 "$openpype_root/setup.py" build_sphinx -} - -main diff --git a/tools/modules/powershell/BurntToast b/tools/modules/powershell/BurntToast deleted file mode 160000 index f58c9a26d6..0000000000 --- a/tools/modules/powershell/BurntToast +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f58c9a26d6ede30ecc7998e92b26974887e945fe diff --git a/tools/modules/powershell/PSWriteColor b/tools/modules/powershell/PSWriteColor deleted file mode 160000 index 12eda384eb..0000000000 --- a/tools/modules/powershell/PSWriteColor +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 12eda384ebd7a7954e15855e312215c009c97114 diff --git a/tools/openpype_console.bat b/tools/openpype_console.bat deleted file mode 100644 index 04b28c389f..0000000000 --- a/tools/openpype_console.bat +++ /dev/null @@ -1,15 +0,0 @@ -goto comment -SYNOPSIS - Helper script running scripts through the OpenPype environment. - -DESCRIPTION - This script is usually used as a replacement for building when tested farm integration like Deadline. - -EXAMPLE - -cmd> .\openpype_console.bat path/to/python_script.py -:comment - -cd "%~dp0\.." -echo %OPENPYPE_MONGO% -.poetry\bin\poetry.exe run python start.py %* diff --git a/tools/pack_project.ps1 b/tools/pack_project.ps1 deleted file mode 100644 index 856247f7ca..0000000000 --- a/tools/pack_project.ps1 +++ /dev/null @@ -1,39 +0,0 @@ -<# -.SYNOPSIS - Helper script OpenPype Packing project. - -.DESCRIPTION - Once you are happy with the project and want to preserve it for future work, just change the project name on line 38 and copy the file into .\OpenPype\tools. Then use the cmd form .EXAMPLE - -.EXAMPLE - -PS> .\tools\run_pack_project.ps1 - -#> -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -# make sure Poetry is in PATH -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} -$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin" - -Set-Location -Path $openpype_root - -Write-Host ">>> " -NoNewline -ForegroundColor Green -Write-Host "Reading Poetry ... " -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Host "NOT FOUND" -ForegroundColor Yellow - Write-Host "*** " -NoNewline -ForegroundColor Yellow - Write-Host "We need to install Poetry create virtual env first ..." - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Host "OK" -ForegroundColor Green -} - -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\start.py" pack-project --project $ARGS -Set-Location -Path $current_dir \ No newline at end of file diff --git a/tools/parse_pyproject.py b/tools/parse_pyproject.py deleted file mode 100644 index dacecd88d0..0000000000 --- a/tools/parse_pyproject.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -"""Parse pyproject.toml and return its values. - -Useful for shell scripts to know more about OpenPype build. -""" -import sys -import os -import toml -from pathlib import Path -import click - - -@click.command() -@click.argument("keys", nargs=-1, type=click.STRING) -def main(keys): - """Get values from `pyproject.toml`. - - You can specify dot separated keys from `pyproject.toml` - as arguments and this script will return them on separate - lines. If key doesn't exists, None is returned. - - """ - openpype_root = Path(os.path.dirname(__file__)).parent - py_project = toml.load(openpype_root / "pyproject.toml") - for q in keys: - query = q.split(".") - data = py_project - - for k in query: - if isinstance(data, list): - try: - data = data[int(k)] - except IndexError: - print("None") - sys.exit() - continue - - if isinstance(data, dict): - data = data.get(k) - print(data) - - -if __name__ == "__main__": - main() diff --git a/tools/run_documentation.ps1 b/tools/run_documentation.ps1 deleted file mode 100644 index d5459f0d2c..0000000000 --- a/tools/run_documentation.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -<# -.SYNOPSIS - Helper script to run Docusaurus for easy editing of OpenPype documentation. - -.DESCRIPTION - This script is using `yarn` package manager to run Docusaurus. If you don't - have `yarn`, install Node.js (https://nodejs.org/) and then run: - - npm install -g yarn - - It take some time to run this script. If all is successful you should see - new browser window with OpenPype documentation. All changes is markdown files - under .\website should be immediately seen in browser. - -.EXAMPLE - -PS> .\run_documentation.ps1 - -#> - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -Set-Location $openpype_root/website - -& yarn install -& yarn start diff --git a/tools/run_mongo.ps1 b/tools/run_mongo.ps1 deleted file mode 100644 index 85b94b0971..0000000000 --- a/tools/run_mongo.ps1 +++ /dev/null @@ -1,117 +0,0 @@ -<# -.SYNOPSIS - Helper script to run mongodb. - -.DESCRIPTION - This script will detect mongodb, add it to the PATH and launch it on specified port and db location. - -.EXAMPLE - -PS> .\run_mongo.ps1 - -#> - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - - -function Find-Mongo ($preferred_version) { - $defaultPath = "C:\Program Files\MongoDB\Server" - Write-Color -Text ">>> ", "Detecting MongoDB ... " -Color Green, Gray -NoNewline - if (-not (Get-Command "mongod" -ErrorAction SilentlyContinue)) { - if(Test-Path "$($defaultPath)\*\bin\mongod.exe" -PathType Leaf) { - # we have mongo server installed on standard Windows location - # so we can inject it to the PATH. We'll use latest version available, or the one defined by - # $preferred_version. - $mongoVersions = Get-ChildItem -Directory 'C:\Program Files\MongoDB\Server' | Sort-Object -Property {$_.Name -as [int]} - if(Test-Path "$($mongoVersions[-1])\bin\mongod.exe" -PathType Leaf) { - Write-Color -Text "OK" -Color Green - $use_version = $mongoVersions[-1] - foreach ($v in $mongoVersions) { - Write-Color -Text " - found [ ", $v, " ]" -Color Cyan, White, Cyan -NoNewLine - $version = Split-Path $v -Leaf - - if ($preferred_version -eq $version) { - Write-Color -Text " *" -Color Green - $use_version = $v - } else { - Write-Host "" - } - } - - $env:PATH = "$($env:PATH);$($use_version)\bin\" - - Write-Color -Text " - auto-added from [ ", "$($use_version)\bin\mongod.exe", " ]" -Color Cyan, White, Cyan - return "$($use_version)\bin\mongod.exe" - } else { - Write-Color -Text "FAILED " -Color Red -NoNewLine - Write-Color -Text "MongoDB not detected" -Color Yellow - Write-Color -Text "Tried to find it on standard location ", "[ ", "$($mongoVersions[-1])\bin\mongod.exe", " ]", " but failed." -Color Gray, Cyan, White, Cyan, Gray -NoNewline - Exit-WithCode 1 - } - } else { - Write-Color -Text "FAILED ", "MongoDB not detected in PATH" -Color Red, Yellow - Exit-WithCode 1 - } - } else { - Write-Color -Text "OK" -Color Green - return Get-Command "mongod" -ErrorAction SilentlyContinue - } - <# - .SYNOPSIS - Function to detect mongod in path. - .DESCRIPTION - This will test presence of mongod in PATH. If it's not there, it will try - to find it in default install location. It support different mongo versions - (using latest if found). When mongod is found, path to it is added to PATH - #> -} - -# mongodb port -$port = 2707 - -# path to database -$dbpath = (Get-Item $openpype_root).parent.FullName + "\mongo_db_data" - -$preferred_version = "5.0" - -$mongoPath = Find-Mongo $preferred_version -Write-Color -Text ">>> ", "Using DB path: ", "[ ", "$($dbpath)", " ]" -Color Green, Gray, Cyan, White, Cyan -Write-Color -Text ">>> ", "Port: ", "[ ", "$($port)", " ]" -Color Green, Gray, Cyan, White, Cyan - -New-Item -ItemType Directory -Force -Path $($dbpath) - -Start-Process -FilePath $mongopath "--dbpath $($dbpath) --port $($port)" -PassThru | Out-Null diff --git a/tools/run_mongo.sh b/tools/run_mongo.sh deleted file mode 100755 index 7b512e67ab..0000000000 --- a/tools/run_mongo.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env bash - -# Helper script to run mongod in the backround. -# NOTE: we are expecting mongod is in PATH - - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - echo -e "${BGreen}" - art - echo -e "${RST}" - - # Directories - openpype_root=$(dirname $(realpath $(dirname $(dirname "${BASH_SOURCE[0]}")))) - pushd "$openpype_root" > /dev/null || return > /dev/null - - mongo_port=2707 - dbpath="$(dirname $openpype_root)/mongo_db_data" - - echo -e "${BIGreen}>>>${RST} Running mongodb ..." - mongod --dbpath "$dbpath" --port $mongo_port - echo -e "${BIGreen}>>>${RST} Detached to background." -} - -main diff --git a/tools/run_project_manager.ps1 b/tools/run_project_manager.ps1 deleted file mode 100644 index c1813e4ed9..0000000000 --- a/tools/run_project_manager.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -<# -.SYNOPSIS - Helper script to run Project Manager. - -.DESCRIPTION - - -.EXAMPLE - -PS> .\run_project_manager.ps1 - -#> - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -# make sure Poetry is in PATH -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} -$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin" - -Set-Location -Path $openpype_root - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Install-Poetry - Write-Color -Text "INSTALLED" -Color Cyan -} else { - Write-Color -Text "OK" -Color Green -} - -& "$env:POETRY_HOME\bin\poetry" run python "$($openpype_root)\start.py" projectmanager -Set-Location -Path $current_dir diff --git a/tools/run_projectmanager.sh b/tools/run_projectmanager.sh deleted file mode 100755 index b5c858c34a..0000000000 --- a/tools/run_projectmanager.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash - -# Run OpenPype Settings GUI - - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - echo -e "${BIGreen}>>>${RST} Generating zip from current sources ..." - "$POETRY_HOME/bin/poetry" run python "$openpype_root/start.py" projectmanager -} - -main diff --git a/tools/run_publish_report_viewer.ps1 b/tools/run_publish_report_viewer.ps1 deleted file mode 100644 index 3ff40e64e3..0000000000 --- a/tools/run_publish_report_viewer.ps1 +++ /dev/null @@ -1,40 +0,0 @@ -<# -.SYNOPSIS - Helper script OpenPype Tray. - -.DESCRIPTION - - -.EXAMPLE - -PS> .\run_tray.ps1 - -#> -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -# make sure Poetry is in PATH -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} -$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin" - -Set-Location -Path $openpype_root - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Write-Color -Text "*** ", "We need to install Poetry create virtual env first ..." -Color Yellow, Gray - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Color -Text "OK" -Color Green -} - -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\start.py" publish-report-viewer --debug -Set-Location -Path $current_dir diff --git a/tools/run_settings.ps1 b/tools/run_settings.ps1 deleted file mode 100644 index c74ae1ea3a..0000000000 --- a/tools/run_settings.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -<# -.SYNOPSIS - Helper script to OpenPype Settings UI - -.DESCRIPTION - This script will run OpenPype and open Settings UI. - -.EXAMPLE - -PS> .\run_settings.ps1 - -#> - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -# make sure Poetry is in PATH -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} -$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin" - -Set-Location -Path $openpype_root - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Install-Poetry - Write-Color -Text "INSTALLED" -Color Cyan -} else { - Write-Color -Text "OK" -Color Green -} - -& "$env:POETRY_HOME\bin\poetry" run python "$($openpype_root)\start.py" settings --dev -Set-Location -Path $current_dir \ No newline at end of file diff --git a/tools/run_settings.sh b/tools/run_settings.sh deleted file mode 100755 index 5a465dce2c..0000000000 --- a/tools/run_settings.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash - -# Run OpenPype Settings GUI - - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - echo -e "${BIGreen}>>>${RST} Generating zip from current sources ..." - "$POETRY_HOME/bin/poetry" run python3 "$openpype_root/start.py" settings --dev -} - -main diff --git a/tools/run_tests.ps1 b/tools/run_tests.ps1 deleted file mode 100644 index 4fa598c413..0000000000 --- a/tools/run_tests.ps1 +++ /dev/null @@ -1,101 +0,0 @@ -<# -.SYNOPSIS - Helper script to run tests for OpenPype. - -.DESCRIPTION - This will use virtual environment and pytest to run test for OpenPype. - -.EXAMPLE - -PS> .\run_test.ps1 - -#> - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - -function Show-PSWarning() { - if ($PSVersionTable.PSVersion.Major -lt 7) { - Write-Color -Text "!!! ", "You are using old version of PowerShell - ", "$($PSVersionTable.PSVersion.Major).$($PSVersionTable.PSVersion.Minor)" -Color Red, Yellow, White - Write-Color -Text " Please update to at least 7.0 - ", "https://github.com/PowerShell/PowerShell/releases" -Color Yellow, White - Exit-WithCode 1 - } -} - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~. .. ~2p. .. .... . . - .Ppo . .pPO3Op.. . O:. . . . - .3Pp . oP3'. 'P33. . 4 .. . . . .. . . . - .~OP 3PO. .Op3 : . .. _____ _____ _____ - .P3O . oP3oP3O3P' . . . . / /./ /./ / - O3:. O3p~ . .:. . ./____/./____/ /____/ - 'P . 3p3. oP3~. ..P:. . . .. . . .. . . . - . ': . Po' .Opo'. .3O. . o[ by Pype Club ]]]==- - - . . - . '_ .. . . _OP3.. . .https://openpype.io.. . - ~P3.OPPPO3OP~ . .. . - . ' '. . .. . . . .. . - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -# Enable if PS 7.x is needed. -# Show-PSWarning - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} - -Set-Location -Path $openpype_root - -$version_file = Get-Content -Path "$($openpype_root)\openpype\version.py" -$result = [regex]::Matches($version_file, '__version__ = "(?\d+\.\d+.\d+.*)"') -$openpype_version = $result[0].Groups['version'].Value -if (-not $openpype_version) { - Write-Color -Text "!!! ", "Cannot determine OpenPype version." -Color Yellow, Gray - Exit-WithCode 1 -} - -Write-Color -Text ">>> ", "OpenPype [ ", $openpype_version, " ]" -Color Green, White, Cyan, White - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Write-Color -Text "*** ", "We need to install Poetry create virtual env first ..." -Color Yellow, Gray - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Color -Text "OK" -Color Green -} - -Write-Color -Text ">>> ", "Cleaning cache files ... " -Color Green, Gray -NoNewline -Get-ChildItem $openpype_root -Filter "*.pyc" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "*.pyo" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Get-ChildItem $openpype_root -Filter "__pycache__" -Force -Recurse | Where-Object { $_.FullName -inotmatch 'build' } | Remove-Item -Force -Recurse -Write-Color -Text "OK" -Color green - -Write-Color -Text ">>> ", "Testing OpenPype ..." -Color Green, White -$original_pythonpath = $env:PYTHONPATH -$env:PYTHONPATH="$($openpype_root);$($env:PYTHONPATH)" -& "$env:POETRY_HOME\bin\poetry" run pytest -x --capture=sys --print -W ignore::DeprecationWarning "$($openpype_root)/tests" -$env:PYTHONPATH = $original_pythonpath - -Write-Color -Text ">>> ", "Restoring current directory" -Color Green, Gray -Set-Location -Path $current_dir diff --git a/tools/run_tests.sh b/tools/run_tests.sh deleted file mode 100755 index 8f8f82fd9c..0000000000 --- a/tools/run_tests.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env bash - -# Run tests for OpenPype -# This will use virtual environment and pytest to run test for OpenPype. - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - -############################################################################## -# Clean pyc files in specified directory -# Globals: -# None -# Arguments: -# Optional path to clean -# Returns: -# None -############################################################################### -clean_pyc () { - local path - path=$openpype_root - echo -e "${BIGreen}>>>${RST} Cleaning pyc at [ ${BIWhite}$path${RST} ] ... \c" - find "$path" -path ./build -prune -o -regex '^.*\(__pycache__\|\.py[co]\)$' -delete - echo -e "${BIGreen}DONE${RST}" -} - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - echo -e "${BGreen}" - art - echo -e "${RST}" - - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - pushd "$openpype_root" || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Testing OpenPype ..." - original_pythonpath=$PYTHONPATH - export PYTHONPATH="$openpype_root:$PYTHONPATH" - "$POETRY_HOME/bin/poetry" run pytest -x --capture=sys --print -W ignore::DeprecationWarning "$openpype_root/tests" - PYTHONPATH=$original_pythonpath -} - -main diff --git a/tools/run_tray.ps1 b/tools/run_tray.ps1 deleted file mode 100644 index 40157c4e81..0000000000 --- a/tools/run_tray.ps1 +++ /dev/null @@ -1,40 +0,0 @@ -<# -.SYNOPSIS - Helper script OpenPype Tray. - -.DESCRIPTION - - -.EXAMPLE - -PS> .\run_tray.ps1 - -#> -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -# Install PSWriteColor to support colorized output to terminal -$env:PSModulePath = $env:PSModulePath + ";$($openpype_root)\tools\modules\powershell" - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -# make sure Poetry is in PATH -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} -$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin" - -Set-Location -Path $openpype_root - -Write-Color -Text ">>> ", "Reading Poetry ... " -Color Green, Gray -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Color -Text "NOT FOUND" -Color Yellow - Write-Color -Text "*** ", "We need to install Poetry create virtual env first ..." -Color Yellow, Gray - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Color -Text "OK" -Color Green -} - -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\start.py" tray --debug -Set-Location -Path $current_dir \ No newline at end of file diff --git a/tools/run_tray.sh b/tools/run_tray.sh deleted file mode 100755 index 2eb9886063..0000000000 --- a/tools/run_tray.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env bash -# Run OpenPype Tray - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -############################################################################## -# Return absolute path -# Globals: -# None -# Arguments: -# Path to resolve -# Returns: -# None -############################################################################### -realpath () { - echo $(cd $(dirname "$1"); pwd)/$(basename "$1") -} - -# Main -main () { - # Directories - openpype_root=$(realpath $(dirname $(dirname "${BASH_SOURCE[0]}"))) - - _inside_openpype_tool="1" - - if [[ -z $POETRY_HOME ]]; then - export POETRY_HOME="$openpype_root/.poetry" - fi - - echo -e "${BIGreen}>>>${RST} Reading Poetry ... \c" - if [ -f "$POETRY_HOME/bin/poetry" ]; then - echo -e "${BIGreen}OK${RST}" - else - echo -e "${BIYellow}NOT FOUND${RST}" - echo -e "${BIYellow}***${RST} We need to install Poetry and virtual env ..." - . "$openpype_root/tools/create_env.sh" || { echo -e "${BIRed}!!!${RST} Poetry installation failed"; return; } - fi - - pushd "$openpype_root" > /dev/null || return > /dev/null - - echo -e "${BIGreen}>>>${RST} Running OpenPype Tray with debug option ..." - "$POETRY_HOME/bin/poetry" run python3 "$openpype_root/start.py" tray --debug -} - -main \ No newline at end of file diff --git a/tools/unpack_project.ps1 b/tools/unpack_project.ps1 deleted file mode 100644 index e7b9e87a7f..0000000000 --- a/tools/unpack_project.ps1 +++ /dev/null @@ -1,39 +0,0 @@ -<# -.SYNOPSIS - Helper script OpenPype Unpacking project. - -.DESCRIPTION - Make sure you had dropped the project from your db and removed the poject data in case you were having them previously. Then on line 38 change the to any path where the zip with project is - usually we are having it here https://drive.google.com/drive/u/0/folders/0AKE4mxImOsAGUk9PVA . Copy the file into .\OpenPype\tools. Then use the cmd form .EXAMPLE - -.EXAMPLE - -PS> .\tools\run_unpack_project.ps1 - -#> -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -$env:_INSIDE_OPENPYPE_TOOL = "1" - -# make sure Poetry is in PATH -if (-not (Test-Path 'env:POETRY_HOME')) { - $env:POETRY_HOME = "$openpype_root\.poetry" -} -$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin" - -Set-Location -Path $openpype_root - -Write-Host ">>> " -NoNewline -ForegroundColor Green -Write-Host "Reading Poetry ... " -NoNewline -if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) { - Write-Host "NOT FOUND" -ForegroundColor Yellow - Write-Host "*** " -NoNewline -ForegroundColor Yellow - Write-Host "We need to install Poetry create virtual env first ..." - & "$openpype_root\tools\create_env.ps1" -} else { - Write-Host "OK" -ForegroundColor Green -} - -& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\start.py" unpack-project --zipfile $ARGS -Set-Location -Path $current_dir \ No newline at end of file diff --git a/tools/update_submodules.ps1 b/tools/update_submodules.ps1 deleted file mode 100644 index 8ecc278510..0000000000 --- a/tools/update_submodules.ps1 +++ /dev/null @@ -1,48 +0,0 @@ -<# -.SYNOPSIS - Helper script to update submodules. - -.EXAMPLE - -PS> .\update_submodules.ps1 - -#> - -$art = @" - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -"@ - -Write-Host $art -ForegroundColor DarkGreen - -function Exit-WithCode($exitcode) { - # Only exit this host process if it's a child of another PowerShell parent process... - $parentPID = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$PID" | Select-Object -Property ParentProcessId).ParentProcessId - $parentProcName = (Get-CimInstance -ClassName Win32_Process -Filter "ProcessId=$parentPID" | Select-Object -Property Name).Name - if ('powershell.exe' -eq $parentProcName) { $host.SetShouldExit($exitcode) } - - exit $exitcode -} - -$current_dir = Get-Location -$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent -$openpype_root = (Get-Item $script_dir).parent.FullName - -Set-Location -Path $openpype_root - -git submodule update --recursive --remote - -Set-Location -Path $current_dir \ No newline at end of file diff --git a/tools/update_submodules.sh b/tools/update_submodules.sh deleted file mode 100644 index 49a3d08afb..0000000000 --- a/tools/update_submodules.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bash - -# Run OpenPype Tray - - -art () { - cat <<-EOF - - . . .. . .. - _oOOP3OPP3Op_. . - .PPpo~ยท ยทยท ~2p. ยทยท ยทยทยทยท ยท ยท - ยทPpo ยท .pPO3Op.ยท ยท O:ยท ยท ยท ยท - .3Pp ยท oP3'ยท 'P33ยท ยท 4 ยทยท ยท ยท ยท ยทยท ยท ยท ยท - ยท~OP 3POยท .Op3 : ยท ยทยท _____ _____ _____ - ยทP3O ยท oP3oP3O3P' ยท ยท ยท ยท / /ยท/ /ยท/ / - O3:ยท O3p~ ยท ยท:ยท ยท ยท/____/ยท/____/ /____/ - 'P ยท 3p3ยท oP3~ยท ยท.P:ยท ยท ยท ยทยท ยท ยท ยทยท ยท ยท ยท - ยท ': ยท Po' ยทOpo'ยท .3Oยท . o[ by Pype Club ]]]==- - - ยท ยท - ยท '_ .. ยท . _OP3ยทยท ยท ยทhttps://openpype.ioยทยท ยท - ~P3ยทOPPPO3OP~ ยท ยทยท ยท - ยท ' 'ยท ยท ยทยท ยท ยท ยท ยทยท ยท - -EOF -} - -# Colors for terminal - -RST='\033[0m' # Text Reset - -# Regular Colors -Black='\033[0;30m' # Black -Red='\033[0;31m' # Red -Green='\033[0;32m' # Green -Yellow='\033[0;33m' # Yellow -Blue='\033[0;34m' # Blue -Purple='\033[0;35m' # Purple -Cyan='\033[0;36m' # Cyan -White='\033[0;37m' # White - -# Bold -BBlack='\033[1;30m' # Black -BRed='\033[1;31m' # Red -BGreen='\033[1;32m' # Green -BYellow='\033[1;33m' # Yellow -BBlue='\033[1;34m' # Blue -BPurple='\033[1;35m' # Purple -BCyan='\033[1;36m' # Cyan -BWhite='\033[1;37m' # White - -# Bold High Intensity -BIBlack='\033[1;90m' # Black -BIRed='\033[1;91m' # Red -BIGreen='\033[1;92m' # Green -BIYellow='\033[1;93m' # Yellow -BIBlue='\033[1;94m' # Blue -BIPurple='\033[1;95m' # Purple -BICyan='\033[1;96m' # Cyan -BIWhite='\033[1;97m' # White - - -# Main -echo -e "${BGreen}" -art -echo -e "${RST}" - -git submodule update --recursive --remote \ No newline at end of file diff --git a/vendor/README.md b/vendor/README.md deleted file mode 100644 index a195647ffa..0000000000 --- a/vendor/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Pype vendor folder - -Everything here will be included in frozen code during build but is ignored by git. Useful for binaries like ffmpeg/oiio/etc. diff --git a/website/README.md b/website/README.md deleted file mode 100644 index c6f13273e8..0000000000 --- a/website/README.md +++ /dev/null @@ -1,28 +0,0 @@ -When developing on Windows make sure `start.sh` has the correct line endings (`LF`). - -Start via yarn: ---------------- -Clone repository - -Install yarn if not already installed (https://classic.yarnpkg.com/en/docs/install) -For example via npm (but could be installed differently too) - - ```npm install --global yarn``` - -Then go to `website` folder - - ```yarn install``` (takes a while) - -To start local test server: - - ```yarn start``` - -Server is accessible by default on http://localhost:3000 - -Start via docker: ------------------ -Setting for docker container: -```bash -docker build . -t pype-docs -docker run --rm -p 3000:3000 -v /c/Users/admin/openpype.io:/app pype-docs -``` diff --git a/website/docs/admin_builds.md b/website/docs/admin_builds.md deleted file mode 100644 index a4e0e77242..0000000000 --- a/website/docs/admin_builds.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: admin_builds -title: Builds and Releases -sidebar_label: Builds ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Admins might find prepared builds on https://github.com/pypeclub/OpenPype/releases for all major platforms. - -### Currently built on OS versions -- Windows 10 -- Ubuntu 20.04 -- Centos 7.6 -- MacOS Mohave (10.14.6) - -In case your studio requires build for different OS version, or any specific build, please take a look at -[Requirements](dev_requirements.md) and [Build](dev_build.md) for more details how to create binaries to distribute. - \ No newline at end of file diff --git a/website/docs/admin_distribute.md b/website/docs/admin_distribute.md deleted file mode 100644 index aebb30092f..0000000000 --- a/website/docs/admin_distribute.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -id: admin_distribute -title: Distribute -sidebar_label: Distribute ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -To let your artists to use OpenPype, you'll need to distribute the frozen executables to them. - -Distribution consists of two parts - - ### 1. OpenPype Igniter - - This is the base application that will be installed locally on each workstation. - It is self contained (frozen) software that also includes all of the OpenPype codebase with the version - from the time of the build. - - Igniter package is around 1Gb and preparing an updated version requires you to re-build pype. That would be - inconvenient for regular and quick distribution of production updates and fixes. So you can distribute those - independently, without requiring you artists to re-install every time. - - You can have multiple versions installed at the same time. - - ### 2. OpenPype Codebase - -When you upgrade your studio pype deployment to a new version or make any local code changes, you can distribute -these changes to your artists, without the need of re-building OpenPype, by using `create_zip` tool provided. -The resulting zip needs to be made available to the artists and it will override their local OpenPype install -with the updated version. - -You have two ways of making this happen - -#### Automatic Updates - -Every time and Artist launches OpenPype on their workstation, it will look to a pre-defined -[openPype update location](admin_settings_system.md#openpype-deployment-control) for any versions that are newer than the -latest, locally installed version. If such version is found, it will be downloaded, -automatically extracted to the correct place and launched. This will become the default -version to run for the artist, until a higher version is detected in the update location again. - -#### Manual Updates - -If for some reason you don't want to use the automatic updates, you can distribute your -zips manually. Your artist will then have to put them to the correct place on their disk. -Zips will be automatically unzipped there. - -The default locations are: - -- Windows: `%LOCALAPPDATA%\pypeclub\openpype` -- Linux: `~/.local/share/pypeclub/openpype` -- Mac: `~/Library/Application Support/pypeclub/openpype` - - -### Staging vs. Production -You can have version of OpenPype with experimental features you want to try somewhere, but you -don't want to disrupt your production. You can set such version in th Settings. - -You can run OpenPype with `--use-staging` argument to use staging version specified in the Settings. - -:::note -Running staging version is identified by orange **P** icon in system tray. -::: - -### OpenPype versioning - -OpenPype version control is based on semantic versioning. - -:::note -The version of OpenPype is indicated by the variable `__version__` in the file `.\openpype\version.py`. -::: - -For example OpenPype will consider the versions in this order: `3.8.0-nightly` < `3.8.0-nightly.1` < `3.8.0-rc.1` < `3.8.0` < `3.8.1-nightly.1` <`3.8.1` < `3.9.0` < `3.10.0` < `4.0.0`. - -See https://semver.org/ for more details. - -For studios customizing the source code of OpenPype, a practical approach could be to build by adding a name and a number after the PATCH and not to deploy 3.8.0 from original OpenPype repository. For example, your builds will be: `3.8.0-yourstudio.1` < `3.8.0-yourstudio.2` < `3.8.1-yourstudio.1`. - -Versions of Igniter and those coming in zips are compatible if they match major and minor version - `3.13.4` is compatible with `3.13.1` but not with `3.12.2` or `3.14.0`. diff --git a/website/docs/admin_docsexamples.md b/website/docs/admin_docsexamples.md deleted file mode 100644 index 6b4ae101d3..0000000000 --- a/website/docs/admin_docsexamples.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -id: admin_docsexamples -title: Examples of using notes -sidebar_label: docsexamples ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - - -This is your mac stuff - - - - -This is your linux stuff - - - - - -This is your mac stuff - - - - - - - - - -:::note Name of the category - - - - - -This is your mac stuff - - - - -This is your linux stuff - - - - - -This is your mac stuff - - - - -::: - - -========================= - -:::important - -- This is my note -- another list -- super list - -```python -import os -print(os.environ) -``` - -::: - -:::tip -This is my note -::: - -:::note -This is my note -::: - -:::warning -This is my note -::: - -:::caution -This is my note -::: - -export const Highlight = ({children, color}) => ( - - {children} - -); - -Docusaurus green and Facebook blue are my favorite colors. - -I can write **Markdown** alongside my _JSX_! diff --git a/website/docs/admin_environment.md b/website/docs/admin_environment.md deleted file mode 100644 index 29b70a6c47..0000000000 --- a/website/docs/admin_environment.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: admin_environment -title: Environment -sidebar_label: Environment ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## OPENPYPE_TMPDIR: - - Custom staging dir directory - - Supports anatomy keys formatting. ex `{root[work]}/{project[name]}/temp` - - supported formatting keys: - - root[work] - - project[name | code] - -## OPENPYPE_DEBUG - - setting logger to debug mode - - example value: "1" (to activate) - -## OPENPYPE_LOG_LEVEL - - stringified numeric value of log level. [Here for more info](https://docs.python.org/3/library/logging.html#logging-levels) - - example value: "10" - -## OPENPYPE_MONGO -- If set it takes precedence over the one set in keyring -- for more details on how to use it go [here](admin_use#check-for-mongodb-database-connection) - -## OPENPYPE_USERNAME -- if set it overrides system created username diff --git a/website/docs/admin_hosts_aftereffects.md b/website/docs/admin_hosts_aftereffects.md deleted file mode 100644 index 72fdb32faf..0000000000 --- a/website/docs/admin_hosts_aftereffects.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: admin_hosts_aftereffects -title: AfterEffects Settings -sidebar_label: AfterEffects ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## AfterEffects settings - -There is a couple of settings that could configure publishing process for **AfterEffects**. -All of them are Project based, eg. each project could have different configuration. - -Location: Settings > Project > AfterEffects - -![AfterEffects Project Settings](assets/admin_hosts_aftereffects_settings.png) - -## Publish plugins - -### Collect Review - -Enable/disable creation of auto instance of review. - -### Validate Scene Settings - -#### Skip Resolution Check for Tasks - -Set regex pattern(s) to look for in a Task name to skip resolution check against values from DB. - -#### Skip Timeline Check for Tasks - -Set regex pattern(s) to look for in a Task name to skip `frameStart`, `frameEnd` check against values from DB. - -### ValidateContainers - -By default this validator will look loaded items with lower version than latest. This validator is context wide so it must be disabled in Context button. - -### AfterEffects Submit to Deadline - -* `Use Published scene` - Set to True (green) when Deadline should take published scene as a source instead of uploaded local one. -* `Priority` - priority of job on farm -* `Primary Pool` - here is list of pool fetched from server you can select from. -* `Secondary Pool` -* `Frames Per Task` - number of sequence division between individual tasks (chunks) -making one job on farm. - -## Worfkile Builder - -Obsolete way how to present artist with a template when they are working on new task. - -## Templated Workfile Build Settings - -This more advanced way allows creating more elaborate workfile templates with placeholders for loaded items or to create publishable item via Creator. - -Workfile template must be prepared separately via Tray and in the host, then its location could be set for combination of: -- `Task types` (specific template for `animation`, different for `layout` etc.) -- `Task names` (regex supported ) - -Additional options: -- `Keep placeholders` - when template gets populated should placeholders be deleted? (In most cases yes.) -- `Create first version` - if template should be used and populated for version `v001` of a workfile automatically diff --git a/website/docs/admin_hosts_blender.md b/website/docs/admin_hosts_blender.md deleted file mode 100644 index 0655e5341a..0000000000 --- a/website/docs/admin_hosts_blender.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -id: admin_hosts_blender -title: Blender -sidebar_label: Blender ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## Blender requirements -Blender integration requires to use **PySide2** module inside blender. Module is different for Blender versions and platforms so can't be bundled with OpenPype. - -### How to install - -:::info Permissions -This step requires Admin persmission. -::: - - - - - -Find python executable inside your Blender installation folder. It is usually located in **C:\\Program Files\\Blender Foundation\\Blender {version}\\{version}\\python\\bin\\python.exe** (This may differ in future blender version). - -Open Powershell or Command Prompt as Administrator and run commands below. - -*Replace `C:\Program Files\Blender Foundation\Blender 2.83\2.83\python\bin` with your path.* - -```bash -# Change directory to python executable directory. -> cd C:\Program Files\Blender Foundation\Blender 2.83\2.83\python\bin - -# Run pip install command. -> python -m pip install PySide2 -``` - - - - - -Procedure may differ based on Linux distribution and blender distribution. Some Blender distributions are using system Python in that case it is required to install PySide2 using pip to system python (Not tested). - -**These instructions are for Blender using bundled python.** - -Find python executable inside your blender application. - -:::note Find python executable in Blender -You can launch Blender and in "Scripting" section enter commands to console. -```bash ->>> import bpy ->>> print(bpy.app.binary_path_python) -'/path/to/python/executable' -``` -::: - -Open terminal and run pip install command below. - -*Replace `/usr/bin/blender/2.83/python/bin/python3.7m` with your path.* -```bash -> /usr/bin/blender/2.83/python/bin/python3.7m -m pip install PySide2 -``` - -:::warning No module named pip -If you get error `No module named pip` you'll have to do few steps first. Open new terminal and run the python executable from Blender (entering full path). -```bash -# Run Python executable -> /usr/bin/blender/2.83/python/bin/python3.7m -# Python process should start ->>> import ensurepip ->>> ensurepip.bootstrap() -``` -You can close new terminal. Run pip install command above again. Now should work as expected. -::: - - - - diff --git a/website/docs/admin_hosts_harmony.md b/website/docs/admin_hosts_harmony.md deleted file mode 100644 index 2c49d8ba73..0000000000 --- a/website/docs/admin_hosts_harmony.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -id: admin_hosts_harmony -title: ToonBoom Harmony Settings -sidebar_label: ToonBoom Harmony ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## ToonBoom Harmony settings - -There is a couple of settings that could configure publishing process for **ToonBoom Harmony**. -All of them are Project based, eg. each project could have different configuration. - -Location: Settings > Project > Harmony - -![Harmony Project Settings](assets/admin_hosts_harmony_settings.png) - -## Publish plugins - -### Collect Palettes - -#### Allowed tasks - -Set regex pattern(s) only for task names when publishing of Palettes should occur. - -Use ".*" to publish Palettes for ALL tasks. - -### Validate Scene Settings - -#### Skip Frame check for Assets with - -Set regex pattern(s) for filtering Asset name that should skip validation of `frameEnd` value from DB. - -#### Skip Resolution Check for Tasks - -Set regex pattern(s) for filtering Asset name that should skip validation or `Resolution` value from DB. - -#### Skip Timeline Check for Tasks - -Set regex pattern(s) for filtering Task name that should skip validation `frameStart`, `frameEnd` check against values from DB. - -### Harmony Submit to Deadline - -* `Use Published scene` - Set to True (green) when Deadline should take published scene as a source instead of uploaded local one. -* `Priority` - priority of job on farm -* `Primary Pool` - here is list of pool fetched from server you can select from. -* `Secondary Pool` -* `Frames Per Task` - number of sequence division between individual tasks (chunks) -making one job on farm. - diff --git a/website/docs/admin_hosts_hiero.md b/website/docs/admin_hosts_hiero.md deleted file mode 100644 index b75d8dee7d..0000000000 --- a/website/docs/admin_hosts_hiero.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: admin_hosts_hiero -title: Hiero -sidebar_label: Hiero ---- - -## Custom Menu -You can add your custom tools menu into Hiero by extending definitions in **Hiero -> Scripts Menu Definition**. -![Custom menu definition](assets/hiero-admin_scriptsmenu.png) diff --git a/website/docs/admin_hosts_houdini.md b/website/docs/admin_hosts_houdini.md deleted file mode 100644 index 18c390e07f..0000000000 --- a/website/docs/admin_hosts_houdini.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: admin_hosts_houdini -title: Houdini -sidebar_label: Houdini ---- -## General Settings -### Houdini Vars - -Allows admins to have a list of vars (e.g. JOB) with (dynamic) values that will be updated on context changes, e.g. when switching to another asset or task. - -Using template keys is supported but formatting keys capitalization variants is not, e.g. `{Asset}` and `{ASSET}` won't work - - -:::note -If `Treat as directory` toggle is activated, Openpype will consider the given value is a path of a folder. - -If the folder does not exist on the context change it will be created by this feature so that the path will always try to point to an existing folder. -::: - -Disabling `Update Houdini vars on context change` feature will leave all Houdini vars unmanaged and thus no context update changes will occur. - -> If `$JOB` is present in the Houdini var list and has an empty value, OpenPype will set its value to `$HIP` - - -:::note -For consistency reasons we always force all vars to be uppercase. -e.g. `myvar` will be `MYVAR` -::: - -![update-houdini-vars-context-change](assets/houdini/update-houdini-vars-context-change.png) - - - -## Shelves Manager -You can add your custom shelf set into Houdini by setting your shelf sets, shelves and tools in **Houdini -> Shelves Manager**. -![Custom menu definition](assets/houdini-admin_shelvesmanager.png) - -The Shelf Set Path is used to load a .shelf file to generate your shelf set. If the path is specified, you don't have to set the shelves and tools. diff --git a/website/docs/admin_hosts_maya.md b/website/docs/admin_hosts_maya.md deleted file mode 100644 index 93acf316c2..0000000000 --- a/website/docs/admin_hosts_maya.md +++ /dev/null @@ -1,297 +0,0 @@ ---- -id: admin_hosts_maya -title: Maya -sidebar_label: Maya ---- - -## Publish Plugins - -### Render Settings Validator - -`ValidateRenderSettings` - -Render Settings Validator is here to make sure artists will submit renders -with the correct settings. Some of these settings are needed by OpenPype but some -can be defined by the admin using [OpenPype Settings UI](admin_settings.md). - -OpenPype enforced settings include: - -- animation must be enabled in output -- render prefix must start with `maya/` to make sure renders are in -correct directory -- there must be `` or its equivalent in different renderers in -file prefix -- if multiple cameras are to be rendered, `` token must be in file prefix - -For **Vray**: -- AOV separator must be set to `_` (underscore) - -For **Redshift**: -- all AOVs must follow `/_` image file prefix -- AOV image format must be same as the one set in Output settings - -For **Renderman**: -- both image and directory prefixes must comply to `_..` and `/renders/maya//` respectively - -For **Arnold**: -- there shouldn't be `` token when merge AOVs option is turned on - -Additional check can be added via Settings - **Project Settings > Maya > Publish plugin > ValidateRenderSettings**. -You can add as many options as you want for every supported renderer. In first field put node type and attribute -and in the second required value. You can create multiple values for an attribute, but when repairing it'll be the first value in the list that get selected. - -![Settings example](assets/maya-admin_render_settings_validator.png) - -In this example we've put `aiOptions.AA_samples` in first one and `6` to second to enforce -Arnolds Camera (AA) samples to 6. - -Note that `aiOptions` is not the name of node but rather its type. For renderers there is usually -just one instance of this node type but if that is not so, validator will go through all its -instances and check the value there. Node type for **VRay** settings is `VRaySettingsNode`, for **Renderman** -it is `rmanGlobals`, for **Redshift** it is `RedshiftOptions`. - -### Model Name Validator - -`ValidateRenderSettings` - -This validator can enforce specific names for model members. It will check them against **Validation Regex**. -There is special group in that regex - **shader**. If present, it will take that part of the name as shader name -and it will compare it with list of shaders defined either in file name specified in **Material File** or from -database file that is per project and can be directly edited from Maya's *OpenPype Tools > Edit Shader name definitions* when -**Use database shader name definitions** is on. This list defines simply as one shader name per line. - -![Settings example](assets/maya-admin_model_name_validator.png) - -For example - you are using default regex `(.*)_(\d)*_(?P.*)_(GEO)` and you have two shaders defined -in either file or database `foo` and `bar`. - -Object named `SomeCube_0001_foo_GEO` will pass but `SomeCube_GEO` will not and `SomeCube_001_xxx_GEO` will not too. - -#### Top level group name -There is a validation for top level group name too. You can specify whatever regex you'd like to use. Default will -pass everything with `_GRP` suffix. You can use *named capturing groups* to validate against specific data. If you -put `(?P.*)` it will try to match everything captured in that group against current asset name. Likewise you can -use it for **subset** and **project** - `(?P.*)` and `(?P.*)`. - -**Example** - -You are working on asset (shot) `0030_OGC_0190`. You have this regex in **Top level group name**: -```regexp -.*?_(?P.*)_GRP -``` - -When you publish your model with top group named like `foo_GRP` it will fail. But with `foo_0030_OGC_0190_GRP` it will pass. - -:::info About regex -All regexes used here are in Python variant. -::: - -### Maya > Deadline submitter -This plugin provides connection between Maya and Deadline. It is using [Deadline Webservice](https://docs.thinkboxsoftware.com/products/deadline/10.0/1_User%20Manual/manual/web-service.html) to submit jobs to farm. -![Maya > Deadline Settings](assets/maya-admin_submit_maya_job_to_deadline.png) - -You can set various aspects of scene submission to farm with per-project settings in **Setting UI**. - - - **Optional** will mark sumission plugin optional - - **Active** will enable/disable plugin - - **Tile Assembler Plugin** will set what should be used to assemble tiles on Deadline. Either **Open Image IO** will be used -or Deadlines **Draft Tile Assembler**. - - **Use Published scene** enable to render from published scene instead of scene in work area. Rendering from published files is much safer. - - **Use Asset dependencies** will mark job pending on farm until asset dependencies are fulfilled - for example Deadline will wait for scene file to be synced to cloud, etc. - - **Group name** use specific Deadline group for the job. - - **Limit Groups** use these Deadline Limit groups for the job. - - **Additional `JobInfo` data** JSON of additional Deadline options that will be embedded in `JobInfo` part of the submission data. - - **Additional `PluginInfo` data** JSON of additional Deadline options that will be embedded in `PluginInfo` part of the submission data. - - **Scene patches** - configure mechanism to add additional lines to published Maya Ascii scene files before they are used for rendering. -This is useful to fix some specific renderer glitches and advanced hacking of Maya Scene files. `Patch name` is label for patch for easier orientation. -`Patch regex` is regex used to find line in file, after `Patch line` string is inserted. Note that you need to add line ending. - -## Load Plugins - -### Reference Loader - -#### Namespace and Group Name -Here you can create your own custom naming for the reference loader. - -The custom naming is split into two parts: namespace and group name. If you don't set the namespace, an error will occur. -Group name could be set empty, that way no wrapping group will be created for loaded item. -Here's the different variables you can use: - -
-
- -| Token | Description | -|---|---| -|`{asset_name}` | Asset name | -|`{asset_type}` | Asset type | -|`{subset}` | Subset name | -|`{family}` | Subset family | - -
-
- -The namespace field can contain a single group of '#' number tokens to indicate where the namespace's unique index should go. The amount of tokens defines the zero padding of the number, e.g ### turns into 001. - -Warning: Note that a namespace will always be prefixed with a _ if it starts with a digit. - -Example: - -![Namespace and Group Name](assets/maya-admin_custom_namespace.png) - -### Extract GPU Cache - -![Maya GPU Cache](assets/maya-admin_gpu_cache.png) - -- **Step** Specifies how often samples are taken during file creation. By default, one sample of your object's transformations is taken every frame and saved to the Alembic file. - - For example, a value of 2 caches the transformations of the current object at every other frame of the Cache Time Range. - -- **Step Save** Specifies which samples are saved during cache creation. For example, a value of 2 specifies that only every other sample specified by the Step # frame(s) option is saved to your Alembic file. - -- **Optimize Hierarchy** When on, nodes and objects in a selected hierarchy are consolidated to maximize the performance of the cache file during playback. -- **Optimization Threshold** (Available only when Optimize Hierarchy is on.) Specifies the maximum number of vertices contained in a single draw primitive. The default value of 40000 may be ideal for most Maya supported graphics cards. When set to the default value, after optimization, each object in the GPU cache file(s) will have no more than 40000 vertices. This value can be set higher depending on the memory available on your system graphics card. - -- **Optimize Animations for Motion Blur** When on, objects with animated transform nodes display with motion blur when the cache is played back in Viewport 2.0 render mode. See Viewport 2.0 options. - - Maya first determines if the GPU cache includes animation data. If the GPU cache is static and does not contain animation data, Maya does not optimize the GPU cache for motion blur. - -:::note Motion Blur does not support Cached Playback. -::: - -- **Write Materials** When on, Maya exports the Lambert and Phong materials from source geometry to the GPU Cache file. These materials display when the GPU-cached file is played back in Viewport 2.0. - - GPU-cached objects support all the high-quality lighting and shading effects provide by the Viewport 2.0 rendering mode. See Viewport 2.0 options. - -:::note Lambert and Phong materials do not display on GPU-cached files when they are played back in scene view's High Quality Rendering or Default Quality Rendering modes. -::: - -- **Use Base Tessellation** Exports geometry with base tessellation and no smoothing applied. If this setting is turned off, the extractor will export geometry with the current Smooth Mesh Preview setting applied. - -### Extract Playblast Settings (review) -These settings provide granular control over how the playblasts or reviews are produced in Maya. - -Some of these settings are also available on the instance itself, in which case these settings will become the default value when creating the review instance. - -![Extract Playblast Settings](assets/maya-admin_extract_playblast_settings.png) - -- **Compression type** which file encoding to use. -- **Data format** what format is the file encoding. -- **Quality** lets you control the compression value for the output. Results can vary depending on the compression you selected. Quality values can range from 0 to 100, with a default value of 95. -- **Background Color** the viewports background color. -- **Background Bottom** the viewports background bottom color. -- **Background Top** the viewports background top color. -- **Override display options** override the viewports display options to use what is set in the settings. -- **Isolate view** isolates the view to what is in the review instance. If only a camera is present in the review instance, all nodes are displayed in view. -- **Off Screen** records the playblast hidden from the user. -- **2D Pan/Zoom** enables the 2D Pan/Zoom functionality of the camera. -- **Renderer name** which renderer to use for playblasting. -- **Width** width of the output resolution. If this value is `0`, the asset's width is used. -- **Height** height of the output resolution. If this value is `0`, the asset's height is used. - -#### Viewport Options - -Most settings to override in the viewport are self explanatory and can be found in Maya. - -![Extract Playblast Settings](assets/maya-admin_extract_playblast_settings_viewport_options.png) - -- **Override Viewport Options** enable to use the settings below for the viewport when publishing the review. - -#### Camera Options - -These options are set on the camera shape when publishing the review. They correspond to attributes on the Maya camera shape node. - -![Extract Playblast Settings](assets/maya-admin_extract_playblast_settings_camera_options.png) -## Include/exclude handles by task type -You can include or exclude handles, globally or by task type. - -The "Include handles by default" defines whether by default handles are included. Additionally you can add a per task type override whether you want to include or exclude handles. - -For example, in this image you can see that handles are included by default in all task types, except for the 'Lighting' task, where the toggle is disabled. -![Include/exclude handles](assets/maya-admin_exclude_handles.png) - -And here you can see that the handles are disabled by default, except in 'Animation' task where it's enabled. -![Custom menu definition](assets/maya-admin_include_handles.png) - - -## Custom Menu -You can add your custom tools menu into Maya by extending definitions in **Maya -> Scripts Menu Definition**. -![Custom menu definition](assets/maya-admin_scriptsmenu.png) - -:::note Work in progress -This is still work in progress. Menu definition will be handled more friendly with widgets and not -raw json. -::: - -## Multiplatform path mapping -You can configure path mapping using Maya `dirmap` command. This will add bi-directional mapping between -list of paths specified in **Settings**. You can find it in **Settings -> Project Settings -> Maya -> Maya Directory Mapping** -![Dirmap settings](assets/maya-admin_dirmap_settings.png) - -## Templated Build Workfile - -Building a workfile using a template designed by users. Helping to assert homogeneous subsets hierarchy and imports. Template stored as file easy to define, change and customize for production needs. - - **1. Make a template** - -Make your template. Add families and everything needed for your tasks. Here is an example template for the modeling task using a placeholder to import a gauge. - -![maya outliner](assets/maya-workfile-outliner.png) - -If needed, you can add placeholders when the template needs to load some assets. **OpenPype > Template Builder > Create Placeholder** - -![create placeholder](assets/maya-create_placeholder.png) - -- **Configure placeholders** - -Fill in the necessary fields (the optional fields are regex filters) - -![new place holder](assets/maya-placeholder_new.png) - - - - ***Builder type***: Whether the the placeholder should load current asset representations or linked assets representations - - - ***Representation***: Representation that will be loaded (ex: ma, abc, png, etc...) - - - ***Family***: Family of the representation to load (main, look, image, etc ...) - - - ***Loader***: Placeholder loader name that will be used to load corresponding representations - - - ***Order***: Priority for current placeholder loader (priority is lowest first, highest last) - - - ***Loader arguments***: Loader arguments dictionary can be used to pass optional data to loaders. - One use case is to define a custom Subset name for the animation instances created while loading Rig references.This follows the custom namespace system used by loaders. - - **Example** - ``` - {"animationSubsetName": "{asset_name}_animation_{subset}_##_"} - ``` - - -- **Save your template** - - - **2. Configure Template** - -- **Go to Studio settings > Project > Your DCC > Templated Build Settings** -- Add a profile for your task and enter path to your template - -![setting build template](assets/settings/template_build_workfile.png) - -**3. Build your workfile** - -- Open maya - -- Build your workfile - -![maya build template](assets/maya-build_workfile_from_template.png) - -## Explicit Plugins Loading -You can define which plugins to load on launch of Maya here; `project_settings/maya/explicit_plugins_loading`. This can help improve Maya's launch speed, if you know which plugins are needed. - -By default only the required plugins are enabled. You can also add any plugin to the list to enable on launch. - -:::note technical -When enabling this feature, the workfile will be launched post initialization no matter the setting on `project_settings/maya/open_workfile_post_initialization`. This is to avoid any issues with references needing plugins. - -Renderfarm integration is not supported for this feature. -::: diff --git a/website/docs/admin_hosts_nuke.md b/website/docs/admin_hosts_nuke.md deleted file mode 100644 index bab63223ce..0000000000 --- a/website/docs/admin_hosts_nuke.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: admin_hosts_nuke -title: Nuke -sidebar_label: Nuke ---- - -## Custom Menu -You can add your custom tools menu into Nuke by extending definitions in **Nuke -> Scripts Menu Definition**. -![Custom menu definition](assets/nuke-admin_scriptsmenu.png) - -:::note Work in progress -This is still work in progress. Menu definition will be handled more friendly with widgets and not -raw json. -::: - -## Gizmo Menu -You can add your custom toolbar menu into Nuke by setting your gizmo path and extending definitions in **Nuke -> Gizmo Menu**. -![Custom menu definition](assets/nuke-admin_gizmomenu.png) diff --git a/website/docs/admin_hosts_photoshop.md b/website/docs/admin_hosts_photoshop.md deleted file mode 100644 index d79789760e..0000000000 --- a/website/docs/admin_hosts_photoshop.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -id: admin_hosts_photoshop -title: Photoshop Settings -sidebar_label: Photoshop ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## Photoshop settings - -There is a couple of settings that could configure publishing process for **Photoshop**. -All of them are Project based, eg. each project could have different configuration. - -Location: Settings > Project > Photoshop - -![AfterEffects Project Settings](assets/admin_hosts_photoshop_settings.png) - -## Color Management (ImageIO) - -Placeholder for Color Management. Currently not implemented yet. - -## Creator plugins - -Contains configurable items for creators used during publishing from Photoshop. - -### Create Image - -Provides list of [variants](artist_concepts.md#variant) that will be shown to an artist in Publisher. Default value `Main`. - -### Create Flatten Image - -Provides simplified publishing process. It will create single `image` instance for artist automatically. This instance will -produce flatten image from all visible layers in a workfile. - -- Review - should be separate review created for this instance - -### Create Review - -Creates single `review` instance automatically. This allows artists to disable it if needed. - -### Create Workfile - -Creates single `workfile` instance automatically. This allows artists to disable it if needed. - -## Publish plugins - -Contains configurable items for publish plugins used during publishing from Photoshop. - -### Collect Color Coded Instances - -Used only in remote publishing! - -Allows to create automatically `image` instances for configurable highlight color set on layer or group in the workfile. - -#### Create flatten image - - Flatten with images - produce additional `image` with all published `image` instances merged - - Flatten only - produce only merged `image` instance - - No - produce only separate `image` instances - -#### Subset template for flatten image - -Template used to create subset name automatically (example `image{layer}Main` - uses layer name in subset name) - -### Collect Review - -Disable if no review should be created - -### Collect Version - -If enabled it will push version from workfile name to all published items. Eg. if artist is publishing `test_asset_workfile_v005.psd` -produced `image` and `review` files will contain `v005` (even if some previous version were skipped for particular family). - -### Validate Containers - -Checks if all imported assets to the workfile through `Loader` are in latest version. Limits cases that older version of asset would be used. - -If enabled, artist might still decide to disable validation for each publish (for special use cases). -Limit this optionality by toggling `Optional`. -`Active` toggle denotes that by default artists sees that optional validation as enabled. - -### Validate naming of subsets and layers - -Subset cannot contain invalid characters or extract to file would fail - -#### Regex pattern of invalid characters - -Contains weird characters like `/`, `/`, these might cause an issue when file (which contains subset name) is created on OS disk. - -#### Replacement character - -Replace all offending characters with this one. `_` is default. - -### Extract Image - -Controls extension formats of published instances of `image` family. `png` and `jpg` are by default. - -### Extract Review - -Controls output definitions of extracted reviews to upload on Asset Management (AM). - -#### Makes an image sequence instead of flatten image - -If multiple `image` instances are produced, glue created images into image sequence (`mov`) to review all of them separetely. -Without it only flatten image would be produced. - -#### Maximum size of sources for review - -Set Byte limit for review file. Applicable if gigantic `image` instances are produced, full image size is unnecessary to upload to AM. - -#### Extract jpg Options - -Handles tags for produced `.jpg` representation. `Create review` and `Add review to Ftrack` are defaults. - -#### Extract mov Options - -Handles tags for produced `.mov` representation. `Create review` and `Add review to Ftrack` are defaults. - - -### Workfile Builder - -Allows to open prepared workfile for an artist when no workfile exists. Useful to share standards, additional helpful content in the workfile. - -Could be configured per `Task type`, eg. `composition` task type could use different `.psd` template file than `art` task. -Workfile template must be accessible for all artists. -(Currently not handled by [SiteSync](module_site_sync.md)) diff --git a/website/docs/admin_hosts_resolve.md b/website/docs/admin_hosts_resolve.md deleted file mode 100644 index 8bb8440f78..0000000000 --- a/website/docs/admin_hosts_resolve.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: admin_hosts_resolve -title: DaVinci Resolve Setup -sidebar_label: DaVinci Resolve ---- - -:::warning -Only Resolve Studio is supported due to Python API limitation in Resolve (free). -::: - -## Resolve requirements -Due to the way resolve handles python and python scripts there are a few steps required steps needed to be done on any machine that will be using OpenPype with resolve. - -## Basic setup - -- Supported version is up to v18 -- Install Python 3.6.2 (latest tested v17) or up to 3.9.13 (latest tested on v18) -- pip install PySide2: - - Python 3.9.*: open terminal and go to python.exe directory, then `python -m pip install PySide2` -- pip install OpenTimelineIO: - - Python 3.9.*: open terminal and go to python.exe directory, then `python -m pip install OpenTimelineIO` - - Python 3.6: open terminal and go to python.exe directory, then `python -m pip install git+https://github.com/PixarAnimationStudios/OpenTimelineIO.git@5aa24fbe89d615448876948fe4b4900455c9a3e8` and move built files from `./Lib/site-packages/opentimelineio/cxx-libs/bin and lib` to `./Lib/site-packages/opentimelineio/`. I was building it on Win10 machine with Visual Studio Community 2019 and - ![image](https://user-images.githubusercontent.com/40640033/102792588-ffcb1c80-43a8-11eb-9c6b-bf2114ed578e.png) with installed CMake in PATH. -- make sure Resolve Fusion (Fusion Tab/menu/Fusion/Fusion Settings) is set to Python 3.6 - ![image](https://user-images.githubusercontent.com/40640033/102631545-280b0f00-414e-11eb-89fc-98ac268d209d.png) -- Open OpenPype **Tray/Admin/Studio settings** > `applications/resolve/environment` and add Python3 path to `RESOLVE_PYTHON3_HOME` platform related. - -## Editorial setup - -This is how it looks on my testing project timeline -![image](https://user-images.githubusercontent.com/40640033/102637638-96ec6600-4156-11eb-9656-6e8e3ce4baf8.png) -Notice I had renamed tracks to `main` (holding metadata markers) and `review` used for generating review data with ffmpeg confersion to jpg sequence. - -1. you need to start OpenPype menu from Resolve/EditTab/Menu/Workspace/Scripts/Comp/**__OpenPype_Menu__** -2. then select any clips in `main` track and change their color to `Chocolate` -3. in OpenPype Menu select `Create` -4. in Creator select `Create Publishable Clip [New]` (temporary name) -5. set `Rename clips` to True, Master Track to `main` and Use review track to `review` as in picture - ![image](https://user-images.githubusercontent.com/40640033/102643773-0d419600-4160-11eb-919e-9c2be0aecab8.png) -6. after you hit `ok` all clips are colored to `ping` and marked with openpype metadata tag -7. git `Publish` on openpype menu and see that all had been collected correctly. That is the last step for now as rest is Work in progress. Next steps will follow. diff --git a/website/docs/admin_hosts_tvpaint.md b/website/docs/admin_hosts_tvpaint.md deleted file mode 100644 index 6c86a06686..0000000000 --- a/website/docs/admin_hosts_tvpaint.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: admin_hosts_tvpaint -title: TVPaint -sidebar_label: TVPaint ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## Subset name templates -Definition of possible subset name templates in TVPaint integration. - -### Render Layer -Render layer has additional keys for subset name template. It is possible to use **render_layer** and **render_pass**. - -- Key **render_layer** is alias for variant (user's input). -- For key **render_pass** is used predefined value `"Beauty"` (ATM value can't be changed). - -### Render pass -Render pass has additional keys for subset name template. It is possible to use **render_layer** and **render_pass**. -- Key **render_layer** is filled with value of **render_pass** from `renderLayer` group. -- Key **render_pass** is alias for variant (user's input). - -:::important Render Layer/Pass templates -It is recommended to use same subset name template for both **renderLayer** and **renderPass** families. -- Example template: `"{family}{Task}_{Render_layer}_{Render_pass}"` -::: - -### Review and Workfile -Families **review** and **workfile** are not manually created but are automatically generated during publishing. That's why it is recommended to not use **variant** key in their subset name template. diff --git a/website/docs/admin_openpype_commands.md b/website/docs/admin_openpype_commands.md deleted file mode 100644 index a149d78aa2..0000000000 --- a/website/docs/admin_openpype_commands.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -id: admin_openpype_commands -title: OpenPype Commands Reference -sidebar_label: OpenPype Commands ---- - -:::info -You can substitute `openpype_console` with `poetry run python start.py` if you want to run it -directly from sources. -::: - -:::note -Running OpenPype without any commands will default to `tray`. -::: - -## Common arguments -`--use-version` to specify explicit version to use: -```shell -openpype_console --use-version=3.0.0-foo+bar -``` -`--headless` - to run OpenPype in headless mode (without using graphical UI) - -`--use-staging` - to use staging versions of OpenPype. - -`--list-versions` - to list available versions. - -`--validate-version` - to validate integrity of given version - -`--verbose` `` - change log verbose level of OpenPype loggers - -`--debug` - set debug flag affects logging - -For more information [see here](admin_use.md#run-openpype). - -## Commands - -| Command | Description | Arguments | -| --- | --- |: --- :| -| contextselection | Open Context selection dialog. | | -| module | Run command line arguments for modules. | | -| repack-version | Tool to re-create version zip. | [๐Ÿ“‘](#repack-version-arguments) | -| tray | Launch OpenPype Tray. | [๐Ÿ“‘](#tray-arguments) -| publish | Pype takes JSON from provided path and use it to publish data in it. | [๐Ÿ“‘](#publish-arguments) | -| extractenvironments | Extract environment variables for entered context to a json file. | [๐Ÿ“‘](#extractenvironments-arguments) | -| run | Execute given python script within OpenPype environment. | [๐Ÿ“‘](#run-arguments) | -| interactive | Start python like interactive console session. | | -| projectmanager | Launch Project Manager UI | [๐Ÿ“‘](#projectmanager-arguments) | -| settings | Open Settings UI | [๐Ÿ“‘](#settings-arguments) | - ---- -### `tray` arguments {#tray-arguments} - -```shell -openpype_console tray -``` - ---- -### `publish` arguments {#publish-arguments} - -Run publishing based on metadata passed in json file e.g. on farm. - -| Argument | Description | -| --- | --- | -| `--targets` | define publishing targets (e.g. "farm") | -| `--gui` (`-g`) | Show publishing | -| Positional argument | Path to metadata json file | - -```shell -openpype publish --targes farm -``` - ---- -### `extractenvironments` arguments {#extractenvironments-arguments} - -Entered output filepath will be created if does not exists. -All context options must be passed otherwise only openpype's global environments will be extracted. -Context options are `project`, `asset`, `task`, `app` - -| Argument | Description | -| --- | --- | -| `output_json_path` | Absolute path to the exported json file | -| `--project` | Project name | -| `--asset` | Asset name | -| `--task` | Task name | -| `--app` | Application name | - -```shell -openpype_console /home/openpype/env.json --project Foo --asset Bar --task modeling --app maya-2019 -``` - ---- -### `run` arguments {#run-arguments} - -| Argument | Description | -| `--script` | run specified python script | - -Note that additional arguments are passed to the script. - -```shell -openpype_console run --script /foo/bar/baz.py arg1 arg2 -``` - ---- -### `projectmanager` arguments {#projectmanager-arguments} -`projectmanager` has no command-line arguments. -```shell -openpype_console projectmanager -``` - ---- -### `settings` arguments {#settings-arguments} - -| Argument | Description | -| `-d` / `--dev` | Run settings in developer mode. | - -```shell -openpypeconsole settings -``` - ---- -### `repack-version` arguments {#repack-version-arguments} -Takes path to unzipped and possibly modified OpenPype version. Files will be -zipped, checksums recalculated and version will be determined by folder name -(and written to `version.py`). - -```shell -./openpype_console repack-version /path/to/some/modified/unzipped/version/openpype-v3.8.3-modified -``` diff --git a/website/docs/admin_releases.md b/website/docs/admin_releases.md deleted file mode 100644 index bba5a22110..0000000000 --- a/website/docs/admin_releases.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: admin_releases -title: Releases -sidebar_label: Releases ---- - -Information about releases can be found on GitHub [Releases page](https://github.com/pypeclub/OpenPype/releases). - -You can find features and bugfixes in the codebase or full changelog for advanced users. diff --git a/website/docs/admin_settings.md b/website/docs/admin_settings.md deleted file mode 100644 index 1128cc00c6..0000000000 --- a/website/docs/admin_settings.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -id: admin_settings -title: Working with settings -sidebar_label: Working with settings ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -OpenPype stores all of its settings and configuration in the mongo database. To make the configuration as easy as possible we provide a robust GUI where you can access and change everything that is configurable - -**Settings** GUI can be started from the tray menu *Admin -> Studio Settings*. - -:::important Studio Settings versus Local Settings -Please keep in mind that these settings are set up for the full studio and not per-individual. If you're looking for individual artist settings, you can head to -[Local Settings](admin_settings_local.md) section in the documentation. -::: - - -## Categories - -We use simple colour coding to show you any changes to the settings: -- **Grey**: [OpenPype default](#openpype-defaults) -- **Green**: [Studio default](#openpype-defaults) -- **Orange**: [Project Override](#project-overrides) -- **Blue**: Changed and unsaved value - -![Colour coding](assets/settings/settings_colour_coding.png) - -You'll find that settings are split into categories: - -### System - -System sections contains all settings that can be configured on a studio level, but cannot -be changed on a per-project basis. These include mostly high level options like path to -mongo database, toggling major modules on and off and configuring studio wide application -availability. - -### Project - -Project tab contains most of OpenPype settings and all of them can be configured and overridden on a per-project basis if need be. This includes most of the workflow behaviors -like what formats to export, naming conventions, publishing validations, automatic assets loaders and a lot more. - -We recommend to try to keep as many configurations as possible on a studio level and only override selectively, because micromanaging all of the project settings might become cumbersome down the line. Most of the settings can be safely adjusted and locked on a project -after the production started. - -## Understanding Overrides - -Most of the individual settings can be set and overridden on multiple levels. - -### OpenPype defaults -When you first open settings, all of the values and categories will be marked with either -light **grey labels** or a **grey vertical bar** on the left edge of the expandable category. - -The grey colouring signifies the value has been left at OpenPype Default. If the default changes in future -OpenPype versions, these values will be reflect the change after you deploy the new version. - -### Studio defaults - -Any values that you change and then press save in the bottom right corner, will be saved -as studio defaults. This means they will stay at those values even if you update your pype. -To make it clear which settings are set by you specifically, they are marked with a **green -edge** and **green labels**, once set. - -To set studio default, just change the value in the system tab and press save. If you want -to keep the value but add the option to your studio default to protect it from potential -future updates, you ran `right click` and choose `add to studio default`, then press save. - -In the Project settings tab, you need to select the **( Default )** project on the left, to set your studio defaults for projects. The rest works the same as in the System tab. - -![studio_defaults](assets/settings/studio_defaults.gif) - -You can also reset any settings to OpenPype default by doing `right click` and `remove from studio default` - -![studio_defaults](assets/settings/studio_defaults_remove.gif) - -### Project Overrides - -Many settings are useful to be adjusted on a per-project basis. To identify project -overrides, they are marked with **orange edge** and **orange labels** in the settings GUI. - -The process of setting project overrides is similar to setting the Studio defaults. The key difference is to select a particular project you want to be configure. Those projects can be found on the left hand side of the Project Settings tab. - -In the image below you can see all three overrides at the same time. -1. Deadline has **no changes to the OpenPype defaults** at all โ€” **grey** colour of left bar. -2. Maya has **studio-wide defaults configured**, which are inherited in the particular project - **green** colour of left bar. -3. Nuke contains **project specific overrides** - **orange** colour of left bar. - -![colours_01](assets/settings/colours_02.png) - -Override colours work as breadcrumbs to allow quick identification of what was changed and where. As you can see on this image, Orange colour is propagated up the hierarchy even though only a single value (sync render version with workfile toggle), was changed. - -![override_breadcumbs](assets/settings/override_breadcrumbs.png) diff --git a/website/docs/admin_settings_local.md b/website/docs/admin_settings_local.md deleted file mode 100644 index 8935b29fb5..0000000000 --- a/website/docs/admin_settings_local.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: admin_settings_local -title: Working with local settings -sidebar_label: Working with local settings ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -OpenPype stores some of it's settings and configuration in local file system. These settings are specific to each individual machine and provides the mechanism for local overrides - -**Local Settings** GUI can be started from the tray menu. - -![Local Settings](assets/settings/settings_local.png) - -## Categories - -### OpenPype Mongo URL -The **Mongo URL** is the database URL given by your Studio. More details [here](artist_getting_started.md#mongodb). - -### General -**OpenPype Username** : enter your username (if not provided, it uses computer session username by default). This username is used to sign your actions on **OpenPype**, for example the "author" on a publish. - -**Admin permissions** : When enabled you do not need to enter a password (if defined in Studio Settings) to access to the **Admin** section. -### Experimental tools -Future version of existing tools or new ones. -### Environments -Local replacement of the environment data of each software and additional internal data necessary to be loaded correctly. - -### Applications -Local override of software executable paths for each version. More details [here](admin_settings_system.md#applications). - -### Project Settings -The **Project Settings** allows to determine the root folder. More details [here](module_site_sync.md#local-settings). diff --git a/website/docs/admin_settings_project_anatomy.md b/website/docs/admin_settings_project_anatomy.md deleted file mode 100644 index 2068c5cde2..0000000000 --- a/website/docs/admin_settings_project_anatomy.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -id: admin_settings_project_anatomy -title: Project Anatomy -sidebar_label: Project Anatomy ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -Project Anatomy is the most important configuration piece for each project you work on with openPype. - -It defines: -- Project Root folders -- File naming conventions -- Folder structure templates -- Default project attributes -- Task Types -- Applications and Tool versions -- Colour Management -- File Formats - -Anatomy is the only configuration that is always saved as an project override. This is to make sure that any updates to OpenPype or Studio default values, don't affect currently running productions. - -![anatomy_01](assets/settings/anatomy_01.png) - -## Roots - -Roots define where files are stored with path to a shared folder. It is required to set the root path for each platform you are using in the studio. All paths must point to the same folder! - -![roots01](assets/settings/anatomy_roots01.png) - -It is possible to set multiple roots when necessary. That may be handy when you need to store a specific type of data on another disk. -![roots02](assets/settings/anatomy_roots02.png) - - -Note how multiple roots are used here, to push different types of files to different shared storage. -![roots03](assets/settings/anatomy_roots03.png) - - -## Templates - -Templates define the project's folder structure and filenames. - -We have a few required anatomy templates for OpenPype to work properly, however we keep adding more when needed. - -### Available template keys - -
-
- - -| Context key | Description | -| --- | --- | -| `root[name]` | Path to root folder | -| `project[name]` | Project's full name | -| `project[code]` | Project's code | -| `hierarchy` | All hierarchical parents as subfolders | -| `asset` | Name of asset or shot | -| `task[name]` | Name of task | -| `task[type]` | Type of task | -| `task[short]` | Short name of task type (eg. 'Modeling' > 'mdl') | -| `parent` | Name of hierarchical parent | -| `version` | Version number | -| `subset` | Subset name | -| `family` | Main family name | -| `ext` | File extension | -| `representation` | Representation name | -| `frame` | Frame number for sequence files. | -| `app` | Application Name | -| `user` | User's login name (can be overridden in local settings) | -| `output` | | -| `comment` | | - -
-
- -| Date-Time key | Example result | Description | -| --- | --- | --- | -| `d` | 1, 30 | Short day of month | -| `dd` | 01, 30 | Day of month with 2 digits. | -| `ddd` | Mon | Shortened week day name. | -| `dddd` | Monday | Full week day name. | -| `m` | 1, 12 | Short month number. | -| `mm` | 01, 12 | Month number with 2 digits. | -| `mmm` | Jan | Shortened month name. | -| `mmmm` | January | Full month name. | -| `yy` | 20 | Shortened year. | -| `yyyy` | 2020 | Full year. | -| `H` | 4, 17 | Shortened 24-hour number. | -| `HH` | 04, 17 | 24-hour number with 2 digits. | -| `h` | 5 | Shortened 12-hour number. | -| `hh` | 05 | 12-hour number with 2 digits. | -| `ht` | AM, PM | Midday part. | -| `M` | 0 | Shortened minutes number. | -| `MM` | 00 | Minutes number with 2 digits. | -| `S` | 0 | Shortened seconds number. | -| `SS` | 00 | Seconds number with 2 digits. | - -
-
- -### Anatomy reference keys - -Anatomy templates have the ability to use "referenced keys". Best example is `path` in publish or work templates which just contains references to `folder` and `file` (`{@folder}/{@file}`). Any changes in folder or file template are propagated to the path template. The another example is simplification of version and frame formatting with paddings. You can notice that keys `{@version}` or `{@frame}` are used in default templates. They are referencing `Anatomy` -> `Templates` -> `Version` or `Frame` which handle version and frame formatting with padding. - -So if you set `project_anatomy/templates/defaults/version_padding` to `5` the `{@version}` key will be transformed to `v{version:0>5}` automatically and version number in paths will have 5 numbers -> `v00001`. - -### Optional keys - -In some cases of template formatting not all keys are available and should be just ignored. For example `{frame}` should be available only for sequences but we have single publish template. To handle these cases it is possible to use special characters to mark segment of template which should be ignored, if it can't be filled because of missing keys. To mark these segments use `<` and `>`. -. -Template `{project[code]}_{asset}_{subset}<_{output}><.{@frame}>.{ext}` can handle all 4 possible situations when `output` and `frame` keys are available or not. The optional segments can contain additional text, like in the example dot (`.`) for frame and underscore (`_`) for output, those are also ignored if the keys are not available. Optional segments without formatting keys are kept untouched: `
` -> stays as `
`. It is possible to nest optional segments inside optional segments `<{asset}<.{@frame}>
>` which may result in empty string if `asset` key is not available. - -## Attributes - -Project attributes are used as default values for new assets created under project, except `Applications` and `Active project` which are project specific. Values of attributes that are **not** project specific are always used from assets. So if `tools` are not loading as expected it is because the assets have different values. - -![anatomy_attributes](assets/settings/anatomy_attributes.png) - -**Most of attributes don't need detailed explanation.** - -| Attribute | Description | -| --- | --- | -| `Applications` | List of applications that can be used in the project. At the moment used only as a possible filter of applications. | -| `Tools` | List of application tools. This value can be overridden per asset. | -| `Active project` | Project won't be visible in tools if enabled.
- To revert check `Show Inactive projects` checkbox in project settings. | - - -## Task Types - -Available task types on a project. Each task on an asset is referencing a task type on the project which allows access to additional task type attributes. At this moment only `short_name` is available (can be used in templates as `{task[short_name]}`). - -![tasks](assets/settings/anatomy_tasks.png) - -## Colour Management and Formats \ No newline at end of file diff --git a/website/docs/admin_settings_system.md b/website/docs/admin_settings_system.md deleted file mode 100644 index aefeaf893a..0000000000 --- a/website/docs/admin_settings_system.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -id: admin_settings_system -title: System Settings -sidebar_label: System settings ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## General - -Settings applicable to the full studio. - -![general_settings](assets/settings/settings_system_general.png) - -### Studio Name -Full name of the studio (can be used as variable on some places) - -### Studio Code -Studio acronym or a short code (can be used as variable on some places) - -### Admin Password -After setting admin password, normal user won't have access to OpenPype settings -and Project Manager GUI. Please keep in mind that this is a studio wide password and it is meant purely -as a simple barrier to prevent artists from accidental setting changes. - -### Environment -Globally applied environment variables that will be appended to any OpenPype process in the studio. - -### Disk mapping -- Platform dependent configuration for mapping of virtual disk(s) on an artist's OpenPype machines before OP starts up. -- Uses `subst` command, if configured volume character in `Destination` field already exists, no re-mapping is done for that character(volume). - -### FFmpeg and OpenImageIO tools -We bundle FFmpeg tools for all platforms and OpenImageIO tools for Windows and Linux. By default, bundled tools are used, but it is possible to set environment variables `OPENPYPE_FFMPEG_PATHS` and `OPENPYPE_OIIO_PATHS` in system settings environments to look for them in different directory. -For exampleโ€”when using different Linux distributions in a facility that do not have a consistent install location or to add OIIO support for MacOS. Values of both environment variables should lead to directory where tool executables are located instead of an explicit path to the binary executable. Using multiple paths are supported, separated by colons, is supportedโ€”e.g. */usr/local/bin:$HOME/.local/bin* - -### OpenPype deployment control -**`Versions Repository`** - Location where automatic update mechanism searches for zip files with -OpenPype update packages. To read more about preparing OpenPype for automatic updates go to [Admin Distribute docs](admin_distribute.md#2-openpype-codebase) - -**`Production version`** - Define what is current production version. When value is not set then latest version available in versions repository is resolved as production version. - -**`Staging version`** - Define what is current staging version. When value is not set then latest staging version available in versions repository is resolved as staging version. - -For more information about Production and Staging go to [Distribute](admin_distribute.md#staging-vs-production). - -**Production version** and **Staging version** fields will define which version will be used in studio. Filling explicit version will force new OpenPype processes to use it. That gives more control over studio deployment especially when some workstations don't have access to version repository (e.g. remote users). It can be also used to downgrade studio version when newer version have production breaking bug. - -When fields are not filled, the latest version in the versions repository is used as studio version. That makes updating easier as it is not needed to modify settings, though workstations without access to versions repository can't find out which OpenPype version should be used. - -If **`Version Repository`** is not set or is not accessible for workstation, the latest available version on workstation is used or the version inside build. - -**`Version check interval`** - The OpenPype tray application has the ability to check if its version currently in use is up to date with the Studio's production/staging version. It is possible to modify how often the validation is triggered in minutes. The interval can also be set to `0`, which will turn off version validations, but it is not recommend. - -A dialog asking for restart is shown when OpenPype tray application detect that different version should be used. -![general_settings](assets/settings/settings_system_version_update.png) -![general_settings](assets/settings/settings_system_version_downgrade.png) - -## Modules - -Configuration of OpenPype's various modules. Some can only be toggled on or off, while others have their own attributes that need to be set before they become fully functional. - -### Avalon - -**`Avalon Mongo Timeout`** - This might need to be changed if your mongo connection is a bit slow. Making the timeout longer will give Avalon better chance to connect. - -**`Thumbnail Storage Location`** - simple disk storage path where all thumbnails will be stored. - -### Ftrack - -**`Server`** - URL of your ftrack server. - -Additional Action paths - -**`Action paths`** - Directories containing your custom ftrack actions. - -**`Event paths`** - Directories containing your custom ftrack event plugins. - -**`Intent`** - Special ftrack attribute that mark the intention of individual publishes. This setting will be reflected -in publisher as well as ftrack custom attributes - -**`Custom Attributes`** - Write and Read permissions for all OpenPype required ftrack custom attributes. Each values needs to be name of an ftrack role. - -### Sync Server - -Disable/Enable OpenPype site sync feature - -### Standalone Publisher - -Disable/Enable Standalone Publisher option - -### Deadline - -**`Deadline Rest URL`** - URL to deadline webservice that. This URL must be reachable from every -workstation that should be submitting render jobs to deadline via OpenPype. - -### Royal Render - -**`Royal Render Root Paths`** - multi platform paths to Royal Render installation. - -### Clockify - -**`Workspace Name`** - name of the clockify workspace where you would like to be sending all the timelogs. - -### Timers Manager - -**`Max Idle Time`** - Duration (minutes) of inactivity, after which currently running timer will be stopped. - -**`Dialog popup time`** - Time in minutes, before the end of Max Idle ti, when a notification will alert -the user that their timer is about to be stopped. - -### Idle Manager - -Service monitoring the activity, which triggers the Timers Manager timeouts. - -### Logging - -Module that allows storing all logging into the database for easier retrieval and support. - -## Applications - -In this section you can manage what Applications are available to your studio, locations of their -executables, and their additional environments. In OpenPype context, each application that is integrated is -also called a `Host` and these two terms might be used interchangeably in the documentation. - -Each Host is made of two levels. -1. **Application group** - This is the main name of the application and you can define extra environments -that are applicable to all versions of the given application. For example any extra Maya scripts that are not -version dependent, can be added to `Maya` environment here. -2. **Application versions** - Here you can define executables (per platform) for each supported version of -the DCC and any default arguments (`--nukex` for instance). You can also further extend it's environment. - -![settings_applications](assets/settings/applications_01.png) - -### Environments - -Please keep in mind that the environments are not additive by default, so if you are extending variables like -`PYTHONPATH`, or `PATH` make sure that you add themselves to the end of the list. - -For instance: - -```json -{ - "PYTHONPATH": [ - "my/path/to/python/scripts", - "{PYTHONPATH}" - ] -} -``` - -### Adding versions - -It is possible to add new version for any supported application. There are two ways of doing it. - -1. **Add new executable** to an existing application version. This is a good way if you have multiple fully compatible versions of your DCC across the studio. Nuke is a typical example where multiple artists might have different `v#` releases of the same minor Nuke release. For example `12.2v3` and `12.3v6`. When you add both to `12.2` Nuke executables they will be treated the same in OpenPype and the system will automatically pick the first that it finds on an artist machine when launching. Their order is also the order of their priority when choosing which version to run if multiple are present. -![settings_applications](assets/settings/settings_addapplication.gif) - -2. **Add version** in case you want this version to be selectable individually. This is usually used for bigger releases that might not be fully compatible with previous versions. Keep in mind that if you add the latest version of an Application that is not yet part of the official OpenPype release, you might run into problems with integration. We test all the new software versions for compatibility and most often, smaller or bigger updates to OpenPype code are necessary to keep everything running. -![settings_applications](assets/settings/settings_addappversion.gif) - -## Tools - -A tool in openPype is anything that needs to be selectively added to your DCC applications. Most often these are plugins, modules, extensions or similar depending on what your package happens to call it. - -OpenPype comes with some major CG renderers pre-configured as an example, but these and any others will need to be changed to match your particular environment. - -Their environment settings are split to two levels just like applications to allow more flexibility when setting them up. - -In the image before you can see that we set most of the environment variables in the general MTOA level, and only specify the version variable in the individual versions below. Because all environments within pype setting will resolve any cross references, this is enough to get a fully dynamic plugin loading as far as your folder structure where you store the plugins is nicely organized. - - -In this example MTOA will automatically will the `MAYA_VERSION`(which is set by Maya Application environment) and `MTOA_VERSION` into the `MTOA` variable. We then use the `MTOA` to set all the other variables needed for it to function within Maya. -![tools](assets/settings/tools_01.png) - -All the tools defined in here can then be assigned to projects. You can also change the tools versions on any project level all the way down to individual asset or shot overrides. So if you just need to upgrade you render plugin for a single shot, while not risking the incompatibilities on the rest of the project, it is possible. diff --git a/website/docs/admin_use.md b/website/docs/admin_use.md deleted file mode 100644 index c1d1de0e8c..0000000000 --- a/website/docs/admin_use.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -id: admin_use -title: Install and Run -sidebar_label: Install & Run ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -## Install - -You can install OpenPype on individual workstations the same way as any other software. -When you create you build, you will end up with an installation package for the platform -that was used for the build. - -- Windows: `OpenPype-3.0.0.msi` -- Linux: `OpenPype-3.0.0.zip` -- Mac: `OpenPype-3.0.0.dmg` - -After OpenPype is installed, it will ask the user for further installation if it detects a -newer version in the studio update location. - -## Run OpenPype - -To use OpenPype on a workstation simply run the executable that was installed. -On the first run the user will be prompted to for OpenPype Mongo URL. -This piece of information needs to be provided to the artist by the admin setting -up OpenPype in the studio. - -Once artist enters the Mongo URL address, OpenPype will remember the connection for the -next launch, so it is a one time process.From that moment OpenPype will do it's best to -always keep up to date with the latest studio updates. - -If the launch was successful, the artist should see a green OpenPype logo in their -tray menu. Keep in mind that on Windows this icon might be hidden by default, in which case, -the artist can simply drag the icon down to the tray. - -You can use following command line arguments: - -`--use-version` - to specify version you want to run explicitly, like: -```shell -openpype_console --use-version=3.0.1 -``` - -`--use-staging` - to specify you prefer staging version. In that case it will be used instead of production one. - -:::tip List available versions -To list all available versions, use: - -```shell -openpype_console --list-versions -``` -::: - -If you want to validate integrity of some available version, you can use: - -```shell -openpype_console --validate-version=3.3.0 -``` - -This will go through the version and validate file content against sha 256 hashes -stored in `checksums` file. - -:::tip Headless mode -Add `--headless` to run OpenPype without graphical UI (useful on server or on automated tasks, etc.) -::: - -`--verbose` `` - change log verbose level of OpenPype loggers. - -Level value can be integer in range `0-50` or one of enum strings `"notset" (0)`, `"debug" (10)`, `"info" (20)`, `"warning" (30)`, `"error" (40)`, `"critical" (50)`. Value is stored to `OPENPYPE_LOG_LEVEL` environment variable for next processes. - -```shell -openpype_console --verbose debug -``` - -`--debug` - set debug flag affects logging - -Enable debug flag for OpenPype process. Change value of environment variable `OPENPYPE_DEBUG` to `"1"`. At this moment affects only OpenPype loggers. Argument `--verbose` or environment variable `OPENPYPE_LOG_LEVEL` are used in preference to affect log level. - -```shell -openpype_console --debug -``` - -### Details -When you run OpenPype from executable, few check are made: - -#### Check for mongoDB database connection -MongoDB connection string is in format: -```shell -mongodb[+srv]://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options] -``` -More on that in [MongoDB documentation](https://docs.mongodb.com/manual/reference/connection-string/). - -Example connection strings are `mongodb://local-unprotected-server:2707` or -`mongodb+srv://user:superpassword:some.mongodb-hosted-on.net:27072`. - -When you start OpenPype first time, Igniter UI will show up and ask you for this string. It will then -save it in secure way to your systems keyring - on Windows it is **Credential Manager**, on MacOS it will use its -**Keychain**, on Linux it can be **GNOME Keyring** or other software, depending on your distribution. - -This can be also set beforehand with environment variable `OPENPYPE_MONGO`. If set it takes precedence -over the one set in keyring. - -:::tip Minimal permissions for DB user -- `readWrite` role to `openpype` and `avalon` databases -- `find` permission on `openpype`, `avalon` and `local` - -#### Check for OpenPype version path -When connection to MongoDB is made, OpenPype will get various settings from there - one among them is -directory location where OpenPype versions are stored. If this directory exists OpenPype tries to -find the latest version there and if succeed it will copy it to user system and use it. - -This path can be set is OpenPype settings, but also with environment variable `OPENPYPE_PATH` or with -`openPypePath` in json file located application directory depending on your system. - -- Windows: `%LOCALAPPDATA%\pypeclub\openpype` -- Linux: `~/.local/share/pypeclub/openpype` -- Mac: `~/Library/Application Support/pypeclub/openpype` - -### Runtime provided environment variables -OpenPype is providing following environment variables for its subprocesses that can be used -in various places, like scripting, etc. - -- `OPENPYPE_ROOT` - this will point to currently running code. -- `OPENPYPE_VERSION` - string of current version - like `3.0.0-foo+bar` -- `OPENPYPE_REPOS_ROOT` - this is path where all components can be find (like Avalon Core and OpenPype) -- `OPENPYPE_DATABASE_NAME` - database name in MongoDB used by OpenPype -- `OPENPYPE_EXECUTABLE` - path to executable used to run OpenPype - when run from sources it will point -to **python** stored in virtual environment. If run from frozen code, it will point to either `openpype_gui` or - `openpype_console`. diff --git a/website/docs/admin_webserver_for_webpublisher.md b/website/docs/admin_webserver_for_webpublisher.md deleted file mode 100644 index dbc67233b5..0000000000 --- a/website/docs/admin_webserver_for_webpublisher.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -id: admin_webserver_for_webpublisher -title: Webserver for webpublisher -sidebar_label: Webserver for webpublisher ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Running Openpype webserver is needed as a backend part for Web publishing. -Any OS supported by Openpype could be used as a host server. - -Webpublishing consists of two sides, Front end (FE) and Openpype backend. This documentation is only targeted on OP side. - -It is expected that FE and OP will live on two separate servers, FE publicly available, OP safely in customer network. - -# Requirements for servers -- OP server allows access to its `8079` port for FE. (It is recommended to whitelist only FE IP.) -- have shared folder for published resources (images, workfiles etc) on both servers - -# Prepare Ftrack -Current webpublish process expects authentication via Slack. It is expected that customer has users created on a Ftrack -with same email addresses as on Slack. As some customer might have usernames different from emails, conversion from email to username is needed. - -For this "pype.club" user needs to be present on Ftrack, creation of this user should be standard part of Ftrack preparation for Openpype. -Next create API key on Ftrack, store this information temporarily as you won't have access to this key after creation. - - -# Prepare Openpype - -Deploy OP build distribution (Openpype Igniter) on an OS of your choice. - -##Run webserver as a Linux service: - -(This expects that OP Igniter is deployed to `opt/openpype` and log should be stored in `/tmp/openpype.log`) - -- create file `sudo vi /opt/openpype/webpublisher_webserver.sh` - -- paste content -```sh -#!/usr/bin/env bash -export OPENPYPE_DEBUG=3 -export FTRACK_BOT_API_USER=YOUR_API_USER -export FTRACK_BOT_API_KEY=YOUR_API_KEY -export PYTHONDONTWRITEBYTECODE=1 -export OPENPYPE_MONGO=YOUR_MONGODB_CONNECTION - -pushd /opt/openpype -./openpype_console webpublisherwebserver --upload_dir YOUR_SHARED_FOLDER_ON_HOST --executable /opt/openpype/openpype_console --host YOUR_HOST_IP --port YOUR_HOST_PORT > /tmp/openpype.log 2>&1 -``` - -1. create service file `sudo vi /etc/systemd/system/openpye-webserver.service` - -2. paste content -```sh -[Unit] -Description=Run OpenPype Ftrack Webserver Service -After=network.target - -[Service] -Type=idle -ExecStart=/opt/openpype/webpublisher_webserver.sh -Restart=on-failure -RestartSec=10s -StandardOutput=append:/tmp/openpype.log -StandardError=append:/tmp/openpype.log - -[Install] -WantedBy=multi-user.target -``` - -5. change file permission: - `sudo chmod 0755 /etc/systemd/system/openpype-webserver.service` - -6. enable service: - `sudo systemctl enable openpype-webserver` - -7. start service: - `sudo systemctl start openpype-webserver` - -8. Check `/tmp/openpype.log` if OP got started - -(Note: service could be restarted by `service openpype-webserver restart` - this will result in purge of current log file!) \ No newline at end of file diff --git a/website/docs/artist_concepts.md b/website/docs/artist_concepts.md deleted file mode 100644 index 1e55c8139d..0000000000 --- a/website/docs/artist_concepts.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -id: artist_concepts -title: Key concepts -sidebar_label: Key Concepts ---- - -## Glossary - -### Asset - -In our pipeline all the main entities the project is made from are internally considered *'Assets'*. Episode, sequence, shot, character, prop, etc. All of these behave identically in the pipeline. Asset names need to be absolutely unique within the project because they are their key identifier. - -OpenPype has a limitation regarding duplicated names. Name of assets must be unique across whole project. - -### Subset - -A published output from an asset results in a subset. - -The subset type is referred to as [family](#family), for example a rig, pointcache, look. -A single asset can have many subsets, even of a single family, named [variants](#variant). -By default a subset is named as a combination of family + variant, sometimes prefixed with the task name (like workfile). - -### Variant - -Usually, an asset needs to be created in multiple *'flavours'*. A character might have multiple different looks, model needs to be published in different resolutions, a standard animation rig might not be usable in a crowd system and so on. 'Variants' are here to accommodate all this variety that might be needed within a single asset. A model might have variant: *'main'*, *'proxy'*, *'sculpt'*, while data of *'look'* family could have subsets *'main'*, *'dirty'*, *'damaged'*. Variants have some recommendations for their names, but ultimately it's up to the artist to use them for separation of publishes when needed. - -### Version - -A numbered iteration of a given subset. Each version contains at least one [representation](#representation). - -#### Hero version - -A hero version is a version that is always the latest published version. When a new publish is generated its written over the previous hero version replacing it in-place as opposed to regular versions where each new publish is a higher version number. - -This is an optional feature. The generation of hero versions can be completely disabled in OpenPype by an admin through the Studio Settings. - -### Representation - -Each published subset version can come out of the software in multiple representations. All of them hold exactly the same data, but in different formats. A model, for example, might be saved as `.OBJ`, Alembic, Maya geometry or as all of them, to be ready for pickup in any other applications supporting these formats. - - -#### Naming convention - -At this moment names of assets, tasks, subsets or representations can contain only letters, numbers and underscore. - -### Family - -Each published [subset](#subset) can have exactly one family assigned to it. Family determines the type of data that the subset holds. Family doesn't dictate the file type, but can enforce certain technical specifications. For example OpenPype default configuration expects `model` family to only contain geometry without any shaders or joints when it is published. - -### Task - -A task defines a work area for an asset where an artist can work in. For example asset *characterA* can have tasks named *modeling* and *rigging*. Tasks also have types. Multiple tasks of the same type may exist on an asset. A task with type `fx` could for example appear twice as *fx_fire* and *fx_cloth*. - -Without a task you cannot launch a host application. - -### Workfile - -The source scene file an artist works in within their task. These are versioned scene files and can be loaded and saved (automatically named) through the [workfiles tool](artist_tools_workfiles.md). - -### Host - -General term for Software or Application supported by OpenPype and Avalon. These are usually DCC applications like Maya, Houdini or Nuke, but can also be a web based service like Ftrack or Clockify. - -### Tool - -Small piece of software usually dedicated to a particular purpose. Most of OpenPype and Avalon tools have GUI, but some are command line only. - - -### Publish - -Process of exporting data from your work scene to versioned, immutable file that can be used by other artists in the studio. - -#### (Publish) Instance - -A publish instance is a single entry which defines a publish output. Publish instances persist within the workfile. This way we can expect that a publish from a newer workfile will produce similar consistent versioned outputs. - -### Load - -Process of importing previously published subsets into your current scene, using any of the OpenPype tools. -Loading asset using proper tools will ensure that all your scene content stays version controlled and updatable at a later point. diff --git a/website/docs/artist_ftrack.md b/website/docs/artist_ftrack.md deleted file mode 100644 index 2210615160..0000000000 --- a/website/docs/artist_ftrack.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -id: artist_ftrack -title: Ftrack -sidebar_label: Artist ---- - -# How to use Ftrack in OpenPype - -## Login to Ftrack module in OpenPype (best case scenario) -1. Launch OpenPype and go to systray OpenPype icon. -2. *Ftrack login* window pop up on start or press **login** in **Ftrack menu** to pop up *Ftrack login* window - - ![ftrack-login-2](assets/ftrack/ftrack-login_50.png) - - - Press `Ftrack` button - - ![Login widget](assets/ftrack/ftrack-login_1.png) - - Web browser opens - - - Sign into Ftrack if requested. If you are already signed in to Ftrack via web browser, you can jump to [Application launch](#application-launch-best-case-scenario) - - ![ftrack-login-2](assets/ftrack/ftrack-login_2.png) - -3. Message is shown - -![ftrack-login-3](assets/ftrack/ftrack-login_3.png) - -4. Close message and you're ready to use actions - continue with [Application launch](#application-launch-best-case-scenario) - - ---- - -## Application launch (best case scenario) -1. Make sure OpenPype is running and you passed [Login to Ftrack](#login-to-ftrack-module-in-openpype-best-case-scenario) guide - -2. Open Web browser and go to your studio Ftrack web page *(e.g. https://mystudio.ftrackapp.com/)* - -3. Locate the task to run the application on. - -4. Display actions for the task - ![ftrack-login-3](assets/ftrack/ftrack-login_60.png) - -5. Select application you want to launch - - application versions may be grouped to one action. In that case, press the action to reveal versions to choose from *(like Maya in the picture)*, only applications permitted on the particular project will appear. - ![ftrack-login-3](assets/ftrack/ftrack-login_71-small.png) - -6. Start working ;) - ---- - -## Change Ftrack user -1. Log out the previous user from Ftrack Web app *(skip if new is already logged)* - - ![ftrack-login-3](assets/ftrack/ftrack-login_80-small.png) - -2. Log out the previous user from Ftrack module in OpenPype tray - -
-
- -![ftrack-login-3](assets/ftrack/ftrack_logout.gif) - -
-
- -![ftrack-login-3](assets/ftrack/ftrack-login_81.png) - -
-
- -

- -3. Follow [Login to Ftrack](#login-to-ftrack-module-in-openpype-best-case-scenario) guide - ---- - -## Where to find API key -- Your API key can be found in Ftrack. In the upper right corner of Ftrack click on the avatar, choose System settings. -- You shouldn't need to use your personal API key if previous steps went through correctly - - ![ftrack-api](assets/ftrack/ftrack-api.png) - -- Scroll down in left panel and select `API keys`. Then pick `Create` button. - - ![ftrack-api](assets/ftrack/ftrack-api2.png) - -- New window will pop up. Choose the `API role` and press `Save` - - ![ftrack-api](assets/ftrack/ftrack-api3.png) - -- Then your new API will be created. - - ![ftrack-api](assets/ftrack/ftrack-api4.png) - -- Copy them and put it into the Ftrack login window. - - ![ftrack-api](assets/ftrack/ftrack-login-api.png) - - ---- -## What if... - -### Ftrack login window didn't pop up and Ftrack menu is not in tray -**1. possibility - OpenPype didn't load properly** -- try to restart OpenPype - -**2. possibility - Ftrack is not set in OpenPype** -- inform your administrator or supervisor - - -### Web browser did not open -**1. possibility - button was not pressed** -- Try to press again the `Ftrack` button in *Ftrack login* window - -**2. possibility - Ftrack URL is not set or is not right** -- Check **Ftrack URL** value in *Ftrack login* window -- Inform your administrator if URL is incorrect and launch OpenPype again when administrator fix it - -**3. possibility - Ftrack Web app can't be reached the way OpenPype use it** -- Enter your **Username** and [API key](#where-to-find-api-key) in *Ftrack login* window and press **Login** button - - ![ftrack-api](assets/ftrack/ftrack-api.gif) -### Ftrack action menu is empty -**1. possibility - OpenPype is not running** -- launch OpenPype and check if it is running in systray - -**2. possibility - You didn't go through Login to Ftrack guide** -- please go through [Login to Ftrack](#login-to-ftrack-module-in-openpype-best-case-scenario) guide - -**3. possibility - User logged to Ftrack Web is not the same as user logged to Ftrack module in tray** -- Follow [Change user](#change-ftrack-user) guide - -**4. possibility - Project doesn't have applications set correctly** -- ask your Project Manager to check if he set applications for the project diff --git a/website/docs/artist_getting_started.md b/website/docs/artist_getting_started.md deleted file mode 100644 index 301a58fa56..0000000000 --- a/website/docs/artist_getting_started.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Getting started with OpenPype -sidebar_label: Getting started ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - -## Working in the studio - -In studio environment you should have OpenPype already installed and deployed, so you can start using it without much setup. Your admin has probably put OpenPype icon on your desktop or even had your computer set up so OpenPype will start automatically. - -If this is not the case, please contact your administrator to consult on how to launch OpenPype in your studio - -## Working from home - -If you are working from **home** though, you'll **need to install** it yourself. You should, however, receive the OpenPype installer files from your studio -admin, supervisor or production, because OpenPype versions and executables might not be compatible between studios. - -Installing OpenPype is possible by Installer or by unzipping downloaded ZIP archive to any drive location. - -:::tip Using the OpenPype Installer -See the [Installation section](artist_install.md) for more information on how to use the OpenPype Installer -::: - - -You can run OpenPype by desktop "OP" icon (if it exists after installing) or by directly executing - -**openpype_gui.exe** located in the OpenPype folder. This executable being suitable **for artists**. - -or alternatively by - -**openpype_console.exe** which is more suitable for **TDs/Admin** for debugging and error reporting. This one runs with -opened console window where all the necessary info will appear during user's work session. - -:::tip Is OpenPype running? -OpenPype runs in the operating system's tray. If you see turquoise OpenPype icon in the tray you can easily tell OpenPype is currently running. -Keep in mind that on Windows this icon might be hidden by default, in which case, the artist can simply drag the icon down to the tray. -::: - -![Systray](assets/artist_systray.png) - - -## First Launch - - -When you first start OpenPype, you will be asked to fill in some basic information. - -### MongoDB - -In most cases you will only have to supply the MongoDB Address. -It's the database URL you should have received from your Studio admin and often will look like this - -`mongodb://username:passwword@mongo.mystudiodomain.com:12345` - - or - - `mongodb://192.168.100.15:27071` - -it really depends on your studio setup. When OpenPype Igniter -asks for it, just put it in the corresponding text field and press `install` button. - -### OpenPype Version Repository - -Sometimes your Studio might also ask you to fill in the path to its version -repository. This is a location where OpenPype will search for the latest versions, check -if it's up to date and where updates are installed from automatically. - -This path is usually taken from the database directly, so you shouldn't need it. - - -## Updates - -If you're connected to your Studio, OpenPype will check for, and install updates automatically every time you run it. That's why during the first start it can go through a quick update installation process, even though you might have just installed it. - - -## Advanced Usage - -For more advanced use of OpenPype commands please visit [Admin section](admin_openpype_commands.md). diff --git a/website/docs/artist_hosts_3dsmax.md b/website/docs/artist_hosts_3dsmax.md deleted file mode 100644 index 6f23a19103..0000000000 --- a/website/docs/artist_hosts_3dsmax.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -id: artist_hosts_3dsmax -title: 3dsmax -sidebar_label: 3dsmax ---- - -:::note Work in progress -This part of documentation is still work in progress. -::: - - - - -## First Steps With OpenPype - -Locate **OpenPype Icon** in the OS tray (if hidden dive in the tray toolbar). - -> If you cannot locate the OpenPype icon ...it is not probably running so check [Getting Started](artist_getting_started.md) first. - -By clicking the icon ```OpenPype Menu``` rolls out. - -Choose ```OpenPype Menu > Launcher``` to open the ```Launcher``` window. - -When opened you can **choose** the **project** to work in from the list. Then choose the particular **asset** you want to work on then choose **task** -and finally **run 3dsmax by its icon** in the tools. - -![Menu OpenPype](assets/3dsmax_tray_OP.png) - -:::note Launcher Content -The list of available projects, assets, tasks and tools will differ according to your Studio and need to be set in advance by supervisor/admin. -::: - -## Running in the 3dsmax - -If 3dsmax has been launched via OP Launcher there should be **OpenPype Menu** visible in 3dsmax **top header** after start. -This is the core functional area for you as a user. Most of your actions will take place here. - -![Menu OpenPype](assets/3dsmax_menu_first_OP.png) - -:::note OpenPype Menu -User should use this menu exclusively for **Opening/Saving** when dealing with work files not standard ```File Menu``` even though user still being able perform file operations via this menu but preferably just performing quick saves during work session not saving actual workfile versions. -::: - -## Working With Scene Files - -In OpenPype menu first go to ```Work Files``` menu item so **Work Files Window** shows up. - - Here you can perform Save / Load actions as you would normally do with ```File Save ``` and ```File Open``` in the standard 3dsmax ```File Menu``` and navigate to different project components like assets, tasks, workfiles etc. - - -![Menu OpenPype](assets/3dsmax_menu_OP.png) - -You first choose particular asset and assigned task and corresponding workfile you would like to open. - -If not any workfile present simply hit ```Save As``` and keep ```Subversion``` empty and hit ```Ok```. - -![Save As Dialog](assets/3dsmax_SavingFirstFile_OP.png) - -OpenPype correctly names it and add version to the workfile. This basically happens whenever user trigger ```Save As``` action. Resulting into incremental version numbers like - -```workfileName_v001``` - -```workfileName_v002``` - - etc. - -Basically meaning user is free of guessing what is the correct naming and other necessities to keep everything in order and managed. - -> Note: user still has also other options for naming like ```Subversion```, ```Artist's Note``` but we won't dive into those now. - -Here you can see resulting work file after ```Save As``` action. - -![Save As Dialog](assets/3dsmax_SavingFirstFile2_OP.png) - -## Understanding Context - -As seen on our example OpenPype created pretty first workfile and named it ```220901_couch_modeling_v001.max``` meaning it sits in the Project ```220901``` being it ```couch``` asset and workfile being ```modeling``` task and obviously ```v001``` telling user its first existing version of this workfile. - -It is good to be aware that whenever you as a user choose ```asset``` and ```task``` you happen to be in so called **context** meaning that all user actions are in relation with particular ```asset```. This could be quickly seen in host application header and ```OpenPype Menu``` and its accompanying tools. - -![Workfile Context](assets/3dsmax_context.png) - -> Whenever you choose different ```asset``` and its ```task``` in **Work Files window** you are basically changing context to the current asset/task you have chosen. - - -This concludes the basics of working with workfiles in 3dsmax using OpenPype and its tools. Following chapters will cover other aspects like creating multiple assets types and their publishing for later usage in the production. - ---- - -## Creating and Publishing Instances - -:::warning Important -Before proceeding further please check [Glossary](artist_concepts.md) and [What Is Publishing?](artist_publish.md) So you have clear idea about terminology. -::: - - -### Intro - -Current OpenPype integration (ver 3.15.0) supports only ```PointCache```, ```Camera```, ```Geometry``` and ```Redshift Proxy``` families now. - -**Pointcache** family being basically any geometry outputted as Alembic cache (.abc) format - -**Camera** family being 3dsmax Camera object with/without animation outputted as native .max, FBX, Alembic format - -**Redshift Proxy** family being Redshift Proxy object with/without animation outputted as rs format(Redshift Proxy's very own format) ---- - -:::note Work in progress -This part of documentation is still work in progress. -::: - -## Validators - -Current Openpype integration supports different validators such as Frame Range and Attributes. -Some validators are mandatory while some are optional and user can choose to enable them in the setting. - -**Validate Frame Range**: Optional Validator for checking Frame Range - -**Validate Attributes**: Optional Validator for checking if object properties' attributes are valid - in MaxWrapper Class. -:::note - Users can write the properties' attributes they want to check in dict format in the setting - before validation. The attributes are then to be converted into Maxscript and do a check. - E.g. ```renderers.current.separateAovFiles``` and ```renderers.current.PrimaryGIEngine``` - User can put the attributes in the dict format below - ``` - { - "renderer.current":{ - "separateAovFiles" : True - "PrimaryGIEngine": "#RS_GIENGINE_BRUTE_FORCE" - } - } - ``` - ![Validate Attribute Setting](assets/3dsmax_validate_attributes.png) -::: -## ...to be added diff --git a/website/docs/artist_hosts_aftereffects.md b/website/docs/artist_hosts_aftereffects.md deleted file mode 100644 index d53d8b965e..0000000000 --- a/website/docs/artist_hosts_aftereffects.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -id: artist_hosts_aftereffects -title: AfterEffects -sidebar_label: AfterEffects ---- - -## Available Tools - -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Publish](artist_tools_publisher) -- [Manage](artist_tools_inventory) - -## Setup - -To install the extension, download, install [Anastasyi's Extension Manager](https://install.anastasiy.com/). Open Anastasyi's Extension Manager and select AfterEffects in menu. Then go to `{path to pype}hosts/aftereffects/api/extension.zxp`. - -Drag extension.zxp and drop it to Anastasyi's Extension Manager. The extension will install itself. - -## Implemented functionality - -AfterEffects implementation currently allows you to import and add various media to composition (image plates, renders, audio files, video files etc.) -and send prepared composition for rendering to Deadline or render locally. - -## Usage - -When you launch AfterEffects you will be met with the Workfiles app. If don't -have any previous workfiles, you can just close this window. - -Workfiles tools takes care of saving your .AEP files in the correct location and under -a correct name. You should use it instead of standard file saving dialog. - -In AfterEffects you'll find the tools in the `OpenPype` extension: - -![Extension](assets/photoshop_extension.png) - -You can show the extension panel by going to `Window` > `Extensions` > `OpenPype`. - -### Publish - -When you are ready to share some work, you will need to publish it. This is done by opening the `Publisher` through the `Publish...` button. - -There is always instance for workfile created automatically (see 'workfileCompositing' item in `Subsets to publish` column.) This allows to publish (and therefore backup) -workfile which is used to produce another publishable elements (as `image` and `review` items). - -Main publishable item in AfterEffects will be of `render` family. Result of this item (instance) is picture sequence that could be a final delivery product or loaded and used in another DCCs. - -First select existing composition and then press `Create >>>` in middle column of `Publisher`. - -After this process you should have something like this: - -![Highlights](assets/aftereffects_publish_instance.png) - -Name of publishable instance (eg. subset name) could be configured with a template in `project_settings/global/tools/creator/subset_name_profiles`. -(This must be configured by admin who has access to Openpype Settings.) - -Trash icon under the list of instances allows to delete any selected `render` instance. - -Frame information (frame start, duration, fps) and resolution (width and height) is applied to selected composition from Asset Management System (Ftrack or DB) automatically! -(Eg. number of rendered frames is controlled by settings inserted from supervisor. Artist can override this by disabling validation only in special cases.) - -Workfile instance will be automatically recreated though. If you do not want to publish it, use pill toggle on the instance item. - -If you would like to modify publishable instance, click on `Publish` tab at the top. This would allow you to change name of publishable -instances, disable them from publishing, change their task etc. - -Publisher allows publishing into different context, just click on any instance, update `Variant`, `Asset` or `Task` in the form in the middle and don't forget to click on the 'Confirm' button. - -#### RenderQueue - -AE's Render Queue is required for publishing locally or on a farm. Artist needs to configure expected result format (extension, resolution) in the Render Queue in an Output module. -Currently its expected to have only single render item per composition in the Render Queue. - - -AE might throw some warning windows during publishing locally, so please pay attention to them in a case publishing seems to be stuck in a `Extract Local Render`. - -#### Repair Validation Issues - -If you would like to run validation rules set by your Studio, click on funnel icon at the bottom right. This will run through all -enabled instances, you could see more information after clicking on `Details` tab. - -If there is some issue in validator phase, you will receive something like this: -![Validation error](assets/aftereffects_publish_failed.png) - -All validators will give some description about what the issue is. You can inspect this by clicking on items in the left column. - -If there is an option of automatic repair, there will be `Repair` button on the right. In other case you need to fix the issue manually. -(By deleting and recreating instance, changing workfile setting etc.) - -#### Render instance options - -There are currently 2 options of `render` item: -- Render of farm - allows offload rendering and publishing to Deadline - requires Deadline module being enabled -- Validate Scene Settings - enables validation plugin which controls setting in DB (or asset control system like Ftrack) and scene itself - -![Configuration of render instance](assets/aftereffects_render_instance.png) - -#### Buttons on the bottom right are for: -- `Refresh publishing` - set publishing process to starting position - useful if previous publish failed, or you changed configuration of a publish -- `Stop/pause publishing` - if you would like to pause publishing process at any time -- `Validate` - if you would like to run only collecting and validating phases (nothing will be published yet) -- `Publish` - standard way how to kick off full publishing process - -#### Support help -If you would like to ask for help admin or support, you could use any of the three options on the `Note` button on bottom left: -- `Go to details` - switches into a more detailed list of published instances and plugins. -- `Copy report` - stash full publishing log to a clipboard -- `Export report` - save log into a file for sending it via mail or any communication tool - -If you are able to fix the workfile yourself, use the first button on the right to set the UI to initial state before publish. (Click the `Publish` button to start again.) - -#### Legacy instances - -All screenshots from Publish are from updated dialog, before publishing was being done by regular `Pyblish` tool. -New publishing process should be backward compatible, eg. if you have a workfile with instances created in the previous publishing approach, they will be translated automatically and -could be used right away. - -If you hit on unexpected behaviour with old instances, contact support first, then you could try to delete and recreate instances from scratch. -Nuclear option is to purge workfile metadata in `Window > Metadata > Basic > Label`. This is only for most determined daredevils though! - -### Load - -When you want to load existing published work, you can use the `Loader` tool. You can reach it in the extension's panel. - -![Loader](assets/photoshop_loader.png) - -The supported families for loading into AfterEffects are: - -- `image` -- `plate` -- `render` -- `prerender` -- `review` -- `audio` -- `background` `(set of images sorted in predefined order)` - -To load an item, right-click on the subset you want and choose a representation you want to load: - -![Loader](assets/photoshop_loader_load.gif) - -### Manage - -Now that we have some content loaded, you can manage which version is loaded. This is done through the `Scene Manager`. You can reach it through the extension's `Manage` button. - -:::note -Loaded images have to stay as smart layers in order to be updated. If you rasterize the layer, you can no longer update it to a different version using OpenPype tools. -::: - -![Loader](assets/photoshop_manage.png) - -You can switch to a previous version of the image or update to the latest. - -![Loader](assets/photoshop_manage_switch.gif) -![Loader](assets/photoshop_manage_update.gif) - - -### Setting section - -Composition properties should be controlled by state in Asset Management System (Ftrack etc). Extension provides couple of buttons to trigger this propagation. - -#### Set Resolution - -Set width and height from AMS to composition. - -#### Set Frame Range - -Start frame and duration in workarea is set according to the settings in AMS. Handles are incorporated (not inclusive). -It is expected that composition(s) is selected first before pushing this button! - -#### Apply All Settings - -Both previous settings are triggered at same time. - -### Experimental tools - -Currently empty. Could contain special tools available only for specific hosts for early access testing. - - -### Workfile builder section - -Next 3 menu items handle creation and usage advanced workfile builder. This could be used to prepare workfile template with placeholders for loaded items and publishable items. -This allow to build template with layers for guides, any text layers and layer for image content which get dynamically populated when template is used an populated by an artist. - -#### Create placeholder - -Load or Create placeholders could be used to provide dynamic content or preparation steps for publish. - -##### Load Placeholder - -This one provide way how to load particular representation for particular subset for particular asset for particular task. -Eg. Whenever artist start `animation` task they want to load `png` representation of `imageMain` subset of current context's asset. - -![Load placeholder](assets/aftereffects_load_placeholder.png) - -#### Create Placeholder - -This allows to create new composition and when populated it will be enhanced with metadata for publish instance which will be created. - -![Create placeholder](assets/aftereffects_create_placeholder.png) - - -### Example - -This is how it looks when `Load placeholder` was used to create `LOADERPLACEHOLDER` item which is added as a layer into `CREATEPLACEHOLDER` composition -created by `Create placeholder`. - -![Prepared template](assets/aftereffects_prepared_template.png) - -Load placeholder was configured to load `image` family, subset with name `imageMain` and `png` representation. - -Any additional layers could be added into composition, when `Build Workfile from template` will be used by an artist, load placeholders will be replace -by loaded item(s). - -![Prepared template](assets/aftereffects_populated_template.png) - -Same prepared template could be used for any asset, in each case correct asset according to context will be used automatically. diff --git a/website/docs/artist_hosts_blender.md b/website/docs/artist_hosts_blender.md deleted file mode 100644 index b2d4c001b4..0000000000 --- a/website/docs/artist_hosts_blender.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -id: artist_hosts_blender -title: Blender -sidebar_label: Blender ---- - -## OpenPype global tools - -- [Set Context](artist_tools_context_manager) -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) -- [Library Loader](artist_tools_library_loader) - -## Working with OpenPype in Blender - -OpenPype is here to ease you the burden of working on project with lots of -collaborators, worrying about naming, setting stuff, browsing through endless -directories, loading and exporting and so on. To achieve that, OpenPype is using -concept of being _"data driven"_. This means that what happens when publishing -is influenced by data in scene. This can by slightly confusing so let's get to -it with few examples. - - -## Setting scene data - -Blender settings concerning framerate, resolution and frame range are handled -by OpenPype. If set correctly in Ftrack, Blender will automatically set the -values for you. - - -## Publishing models - -### Intro - -Publishing models in Blender is pretty straightforward. Create your model as you -need. You might need to adhere to specifications of your studio that can be different -between studios and projects but by default your geometry does not need any -other convention. - -![Model example](assets/blender-model_example.jpg) - -### Creating instance - -Now create **Model instance** from it to let OpenPype know what in the scene you want to -publish. Go **OpenPype โ†’ Create... โ†’ Model**. - -![Model create instance](assets/blender-model_create_instance.jpg) - -`Asset` field is a name of asset you are working on - it should be already filled -with correct name as you've started Blender or switched context to specific asset. You -can edit that field to change it to different asset (but that one must already exists). - -`Subset` field is a name you can decide on. It should describe what kind of data you -have in the model. For example, you can name it `Proxy` to indicate that this is -low resolution stuff. See [Subset](artist_concepts.md#subset). - - - -Read-only field just under it show final subset name, adding subset field to -name of the group you have selected. - -`Use selection` checkbox will use whatever you have selected in Outliner to be -wrapped in Model instance. This is usually what you want. Click on **Create** button. - -You'll notice then after you've created new Model instance, there is a new -collection in Outliner called after your asset and subset, in our case it is -`character1_modelDefault`. The assets selected when creating the Model instance -are linked in the new collection. - -And that's it, you have your first model ready to publish. - -Now save your scene (if you didn't do it already). You will notice that path -in Save dialog is already set to place where scenes related to modeling task on -your asset should reside. As in our case we are working on asset called -**character1** and on task **modeling**, path relative to your project directory will be -`project_XY/assets/character1/work/modeling`. The default name for the file will -be `project_XY_asset_task_version`, so in our case -`simonetest_character1_modeling_v001.blend`. Let's save it. - -![Model create instance](assets/blender-save_modelling_file.jpg) - -### Publishing models - -Now let's publish it. Go **OpenPype โ†’ Publish...**. You will be presented with following window: - -![Model publish](assets/blender-model_pre_publish.jpg) - -Note that content of this window can differs by your pipeline configuration. -For more detail see [Publisher](artist_tools_publisher). - -Items in left column are instances you will be publishing. You can disable them -by clicking on square next to them. White filled square indicate they are ready for -publishing, red means something went wrong either during collection phase -or publishing phase. Empty one with gray text is disabled. - -See that in this case we are publishing from the scene file -`simonetest_character1_modeling_v001.blend` the Blender model named -`character1_modelDefault`. - -Right column lists all tasks that are run during collection, validation, -extraction and integration phase. White items are optional and you can disable -them by clicking on them. - -Lets do dry-run on publishing to see if we pass all validators. Click on flask -icon at the bottom. Validators are run. Ideally you will end up with everything -green in validator section. - -### Fixing problems - -For the sake of demonstration, I intentionally kept the model in Edit Mode, to -trigger the validator designed to check just this. - -![Failed Model Validator](assets/blender-model_publish_error.jpg) - -You can see our model is now marked red in left column and in right we have -red box next to `Mesh is in Object Mode` validator. - -You can click on arrow next to it to see more details: - -![Failed Model Validator details](assets/blender-model_error_details.jpg) - -From there you can see in **Records** entry that there is problem with the -object `Suzanne`. Some validators have option to fix problem for you or just -select objects that cause trouble. This is the case with our failed validator. - -In main overview you can notice little A in a circle next to validator -name. Right click on it and you can see menu item `select invalid`. This -will select offending object in Blender. - -Fix is easy. Without closing Publisher window we just turn back the Object Mode. -Then we need to reset it to make it notice changes we've made. Click on arrow -circle button at the bottom and it will reset the Publisher to initial state. Run -validators again (flask icon) to see if everything is ok. - -It should OK be now. Write some comment if you want and click play icon button -when ready. - -Publish process will now take its course. Depending on data you are publishing -it can take a while. You should end up with everything green and message -**Finished successfully ...** You can now close publisher window. - -To check for yourself that model is published, open -[Asset Loader](artist_tools_loader) - **OpenPype โ†’ Load...**. -There you should see your model, named `modelDefault`. - -### Loading models - -You can load model with [Loader](artist_tools_loader). Go **OpenPype โ†’ Load...**, -select your rig, right click on it and click **Link model (blend)**. - -## Creating Rigs - -Creating and publishing rigs with OpenPype follows similar workflow as with -other data types. Create your rig and mark parts of your hierarchy in sets to -help OpenPype validators and extractors to check it and publish it. - -### Preparing rig for publish - -When creating rigs in Blender, it is important to keep a specific structure for -the bones and the geometry. Let's first create a model and its rig. For -demonstration, I'll create a simple model for a robotic arm made of simple boxes. - -![Blender - Simple model for rigging](assets/blender-rig_model_setup.jpg) - -I have now created the armature `RIG_RobotArm`. While the naming is not important, -you can just adhere to your naming conventions, the hierarchy is. Once the models -are skinned to the armature, the geometry must be organized in a separate Collection. -In this case, I have the armature in the main Collection, and the geometry in -the `Geometry` Collection. - -![Blender - Rig Hierarchy Example](assets/blender-rig_hierarchy_example.jpg) - -When you've prepared your hierarchy, it's time to create *Rig instance* in OpenPype. -Select your whole rig hierarchy and go **OpenPype โ†’ Create...**. Select **Rig**. - -![Blender - Rig Hierarchy Example](assets/blender-rig_create.jpg) - -A new collection named after the selected Asset and Subset should have been created. -In our case, it is `character1_rigDefault`. All the selected armature and models -have been linked in this new collection. You should end up with something like -this: - -![Blender - Rig Hierarchy Example](assets/blender-rig_hierarchy_before_publish.jpg) - -### Publishing rigs - -Publishing rig is done in same way as publishing everything else. Save your scene -and go **OpenPype โ†’ Publish**. For more detail see [Publisher](artist_tools_publisher). - -### Loading rigs - -You can load rig with [Loader](artist_tools_loader). Go **OpenPype โ†’ Load...**, -select your rig, right click on it and click **Link rig (blend)**. - -## Layouts in Blender - -A layout is a set of elements that populate a scene. OpenPype allows to version -and manage those sets. - -### Publishing a layout - -Working with Layout is easy. Just load your assets into scene with -[Loader](artist_tools_loader) (**OpenPype โ†’ Load...**). Populate your scene as -you wish, translate each piece to fit your need. When ready, select all imported -stuff and go **OpenPype โ†’ Create...** and select **Layout**. When selecting rigs, -you need to select only the armature, the geometry will automatically be included. -This will create set containing your selection and marking it for publishing. - -Now you can publish is with **OpenPype โ†’ Publish**. - -### Loading layouts - -You can load a Layout using [Loader](artist_tools_loader) -(**OpenPype โ†’ Load...**). Select your layout, right click on it and -select **Link Layout (blend)**. This will populate your scene with all those -models you've put into layout. diff --git a/website/docs/artist_hosts_harmony.md b/website/docs/artist_hosts_harmony.md deleted file mode 100644 index eaa6edc42a..0000000000 --- a/website/docs/artist_hosts_harmony.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -id: artist_hosts_harmony -title: Harmony -sidebar_label: Harmony ---- - -## Available Tools - -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Publish](artist_tools_publisher) -- [Manage](artist_tools_inventory) - -:::note -Only one tool can be open at a time. If you open a tool while another tool is open, it will wait in queue for the existing tool to be closed. Once the existing tool is closed, the new tool will open. -::: - -## Usage - -The integration creates an `OpenPype` menu entry where all related tools are located. - -:::note -Menu creation can be temperamental. Its best to start Harmony and do nothing else until the application is fully launched. -If you dont see the `OpenPype` menu, then follow this to create it: -- Go to the `Script Editor` -- Find the script called `TB_sceneOpened.js` and run it. -- Choose the `start` method to run. -::: - -### Workfiles - -`OpenPype > Workfiles` - -Work files are temporarily stored locally, in `[user]/.avalon/harmony`, to reduce network bandwidth. When saving the Harmony scene, a background process ensures the network files are updated. - -:::important -Because the saving to the network location happens in the background, be careful when quickly saving and closing Harmony (and the terminal window) since an interrupted saving to the network location can corrupt the workfile. To be sure the workfile is saved to the network location look in the terminal for a line similar to this: - -`DEBUG:avalon.harmony.lib:Saved "[Local Scene Directory]" to "[Network Scene Directory]\[Name Of Workfile].zip"` -::: - -### Create - -`OpenPype > Create` - -![Creator](assets/harmony_creator.png) - -These are the families supported in Harmony: - -- `Render` - - This instance is for generating a render and review. This is a normal write node, but only PNGs are supported at the moment. -- `Template` - - This instance is for generating a templates. This is a normal composite node, which you can connect any number of nodes to. - - Any connected nodes will be published along with their dependencies and any back drops. -- `Palette` - - Palettes are indirectly supported in Harmony. This means you just have to have palettes in your scene to publish them. - -When you `Use selection` on creation, the last selected node will be connected to the created node. - -### Publish - -`OpenPype > Publish` - -![Publish](assets/harmony_publish.png) - -This tool will run through checks to make sure the contents you are publishing is correct. Hit the "Play" button to start publishing. - -You may encounter issues with publishing which will be indicated with red squares. If these issues are within the validation section, then you can fix the issue. If there are issues outside of validation section, please let the OpenPype team know. - -#### Repair Validation Issues - -All validators will give some description about what the issue is. You can inspect this by going into the validator through the arrow: - -![Inspect](assets/harmony_publish_inspect.png) - -You can expand the errors by clicking on them for more details: - -![Expand](assets/harmony_publish_expand.png) - -Some validator have repair actions, which will fix the issue. If you can identify validators with actions by the circle icon with an "A": - -![Actions](assets/harmony_publish_actions.png) - -To access the actions, you right click on the validator. If an action runs successfully, the actions icon will turn green. Once all issues are fixed, you can just hit the "Refresh" button and try to publish again. - -![Repair](assets/harmony_publish_repair.gif) - -### Load - -`OpenPype > Load` - -![Loader](assets/photoshop_loader.png) - -The supported families for Harmony are: - -- `image` -- `harmony.template` - - Only import is current supported for templates. -- `harmony.palette` - - Loaded palettes are moved to the top of the colour stack, so they will acts as overrides. Imported palettes are left in the scene. -- `workfile` - - Only of type `zip`. - -To load, right-click on the subset you want and choose a representation: - -![Loader](assets/photoshop_loader_load.gif) - -:::note -Loading templates or workfiles will import the contents into scene. Referencing is not supported at the moment, so you will have to load newer versions into the scene. -::: - -### Manage - -`OpenPype > Manage` - -![Loader](assets/photoshop_manage.png) - -You can switch to a previous version of the image or update to the latest. - -![Loader](assets/photoshop_manage_switch.gif) -![Loader](assets/photoshop_manage_update.gif) - -:::note -Images and image sequences will be loaded into the scene as read nodes can coloured green. On startup the pipeline checks for any outdated read nodes and colours them red. -- Green = Up to date version in scene. -- Red = Outdated version in scene. -::: diff --git a/website/docs/artist_hosts_hiero.md b/website/docs/artist_hosts_hiero.md deleted file mode 100644 index 977c7a7baf..0000000000 --- a/website/docs/artist_hosts_hiero.md +++ /dev/null @@ -1,268 +0,0 @@ ---- -id: artist_hosts_hiero -title: Hiero -sidebar_label: Hiero / Nuke Studio ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -:::note -All the information also applies to **_Nuke Studio_**(NKS), but for simplicity we only refer to Hiero/NKS. The workflows are identical for both. We are supporting versions **`11.0`** and above. -::: - - - -## OpenPype global tools - -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) - - -## Hiero specific tools - - - -
-
- -### Create Default Tags - -This tool will recreate all necessary OpenPype tags needed for successful publishing. It is automatically ran at start of the Hiero/NKS. Use this tool to manually re-create all the tags if you accidentally delete them, or you want to reset them to default values. - -#### Result - -- Will create tags in Tags bin in case there were none -- Will set all tags to default values if they have been altered - -
-
- -![Default Tags](assets/hiero_defaultTags.png) - -
-
- -
-
- -### Apply Colorspace Project - -This tool will set any defined colorspace definition from OpenPype `Settings / Project / Anatomy / Color Management and Output Formats / Hiero / Workfile` to Hiero `menu / Project / Edit Settings / Color Management tab` - -#### Result - -- Define correct color management settings on project - -
-
- -![Default Tags](assets/hiero_menuColorspaceProject.png) - -
-
- - -
-
- -### Apply Colorspace Clips - -This tool will set any defined colorspace definition from OpenPype `Settings / Project / Anatomy / Color Management and Output Formats / Hiero / Colorspace on Inputs by regex detection` to any matching clip's source path. - -#### Result - -- Set correct `Set Media Color Transform` on each clip of active timeline if it matches defined expressions - -
-
- -![Default Tags](assets/hiero_menuColorspaceClip.png) - -
-
- -## Publishing Shots - - - -
- -With OpenPype, you can use Hiero/NKS as a starting point for creating a project's **shots** as *assets* from timeline clips with its *hierarchycal parents* like **episodes**, **sequences**, **folders**, and its child **tasks**. Most importantly it will create **versions** of plate *subsets*, with or without **reference video**. Publishig is naturally creating clip's **thumbnails** and assigns it to shot *asset*. Hiero is also publishing **audio** *subset* and various **soft-effects** either as retiming component as part of published plates or **color-tranformations**, that will be evailable later on for compositor artists to use either as *viewport input-process* or *loaded nodes* in graph editor. -



- - - -### Preparing timeline for conversion to instances -Because we don't support on-fly data conversion so in case of working with raw camera sources or some other formats which need to be converted for 2D/3D work. We suggest to convert those before and reconform the timeline. Before any clips in timeline could be converted to publishable instances we recommend following. -1. Merge all tracks which supposed to be one and they are multiply only because of editor's style -2. Rename tracks to follow basic structure > if only one layer then `main` in case of multiple layer (elements) for one shot then `main`, and other elements for example: `bg`, `greenscreen`, `fg01`, `fg02`, `display01`, etc. please avoid using [-/_.,%&*] or spaces. These names will be later used in *subset* name creation as `{family}{trackName}` so for example **plateMain** or **plateFg01** -3. Define correct `Set Media Color Transform` at all clips as those will be also published to metadata and used for later loading with correct color transformation. -4. Reviewable video material which you wish to be used as preview videos on any supported Projec manager platform (Ftrack) has to be added ideally to track named **review**. This can be offline edit used as reference video for 2D/3D artists. This video material can be edited to fit length of **main** timeline track or it cand be one long video clip under all clips in **main** track, because OpenPype will trim this to appropriate length with use of FFMPEG. Please be avare we only support MP4(h264) or JPG sequence at the moment. - -
- -![Create menu](assets/hiero_timelinePrep.png) - -
- - -### Converting timeline clips to instances - -Every clip on timeline which is intended to be published has to be converted to publishable instance. - -
- -In OpenPype it is done by tagging a clip with our own metadata. Select all clips you wish to convert and `menu > OpenPype > Create`. -



- -
- -
- -![Create menu](assets/hiero_menuCreate.png) - -
- -
- -Then chose `Create Publishable Clip` in **Instance Creator** dialogue. -

- -Then you can alter Subset name, but this will be changed dynamically and replaces with timeline's track name. -

- -Keep **Use selection** on. -

- -Hit **Create** -

-
- -
- -![Instance Creator](assets/hiero_instanceCreator.png) - -
-
- -Dialogue `Pype publish attributes creator` will open. Here you can define instance properties. If you wish to rename clips dynamically during creation then Keep **Rename clips** ticked. -

- -In case you wish to use *multiple elements of shots* workflow then keep **Enamble vertical sync** ticked on and define correct hero track which is holding main plates, this is usually the **main** track. -
- -
- -![Create menu](assets/hiero_createUIRename.png) - -
-
- -Subset name is created dynamically if `` is selected on **Subset name**. -

- -I case you wish to publish reviewable video as explained above then find the appropriate track from drop down menu **Use review track**. Usually named `review` -

- -Hover above each input field for help. -

- -Handles can be defined here to. In case you wish to have individual clip set differently we recommend to set here the default value and later change those in the created OpenPype tag's metadata under `handleStart` and `handleEnd` properties (look below for details) -
- -
- -![Create menu](assets/hiero_createUIFrames.png) - -
-
- -After you hit **Ok** tags are added to selected clips (except clips in **review** tracks). -

- -If you wish to change any individual properties of the shot then you are able to do it here. In this example we can change `handleStart` and `handleEnd` to some other values. -
- -
- -![Create menu](assets/hiero_tagHandles.png) - -
-
- -### Publishing Effects from Hiero to Nuke -This video shows a way to publish shot look as effect from Hiero to Nuke. - - - -### Assembling edit from published shot versions - - - - -# Nuke Build Workfile -This is a tool of Node Graph initialisation using a pre-created template. - -### Add a profile -The path to the template that will be used in the initialisation must be added as a profile on Project Settings. - -![Create menu](assets/nuke_addProfile.png) - -### Create Place Holder - -![Create menu](assets/nuke_createPlaceHolder.png) - -This tool creates a Place Holder, which is a node that will be replaced by published instances. - -![Create menu](assets/nuke_placeHolderNode.png) -#### Result -- Create a red node called `PLACEHOLDER` which can be manipulated as wanted by using it in Node Graph. - -![Create menu](assets/nuke_placeholder.png) - -:::note -All published instances that will replace the place holder must contain unique input and output nodes in case they will not be imported as a single node. -::: - -![Create menu](assets/nuke_publishedinstance.png) - - -The information about these objects are given by the user by filling the extra attributes of the Place Holder - -![Create menu](assets/nuke_fillingExtraAttributes.png) - - - -### Update Place Holder -This tool allows the user to change the information provided in the extra attributes of the selected Place Holder. - -![Create menu](assets/nuke_updatePlaceHolder.png) - - - -### Build Workfile from template -This tool imports the template used and replaces the existed PlaceHolders with the corresponding published objects (which can contain Place Holders too). In case there is no published items with the description given, the place holder will remain in the node graph. - -![Create menu](assets/nuke_buildWorfileFromTemplate.png) - -#### Result -- Replace `PLACEHOLDER` node in the template with the published instance corresponding to the information provided in extra attributes of the Place Holder - -![Create menu](assets/nuke_buildworkfile.png) - -:::note -In case the instance that will replace the Place holder **A** contains another Place Holder **B** that points to many published elements, all the nodes that were imported with **A** except **B** will be duplicated for each element that will replace **B** -::: - -### Update Workfile -This tool can be used to check if some instances were published after the last build, so they will be imported. - -![Create menu](assets/nuke_updateWorkfile.png) - -:::note -Imported instances must not be deleted because they contain extra attributes that will be used to update the workfile since the place holder is been deleted. -::: diff --git a/website/docs/artist_hosts_houdini.md b/website/docs/artist_hosts_houdini.md deleted file mode 100644 index c4e8293c36..0000000000 --- a/website/docs/artist_hosts_houdini.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -id: artist_hosts_houdini -title: Houdini -sidebar_label: Houdini ---- - -## OpenPype global tools - -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) -- [Library Loader](artist_tools_library-loader) - -## Publishing Alembic Cameras -You can publish baked camera in Alembic format. - -Select your camera and go **OpenPype -> Create** and select **Camera (abc)**. -This will create Alembic ROP in **out** with path and frame range already set. This node will have a name you've -assigned in the **Creator** menu. For example if you name the subset `Default`, output Alembic Driver will be named -`cameraDefault`. After that, you can **OpenPype -> Publish** and after some validations your camera will be published -to `abc` file. - -## Publishing Composites - Image Sequences -You can publish image sequences directly from Houdini's image COP networks. - -You can use any COP node and publish the image sequence generated from it. For example this simple graph to generate some noise: - -![Noise COP](assets/houdini_imagesequence_cop.png) - -To publish the output of the `radialblur1` go to **OpenPype -> Create** and -select **Composite (Image Sequence)**. If you name the variant *Noise* this will create the `/out/imagesequenceNoise` Composite ROP with the frame range set. - -When you hit **Publish** it will render image sequence from selected node. - -:::info Use selection -With *Use selection* is enabled on create the node you have selected when creating will be the node used for published. (It set the Composite ROP node's COP path to it). If you don't do this you'll have to manually set the path as needed on e.g. `/out/imagesequenceNoise` to ensure it outputs what you want. -::: - -## Publishing Point Caches (alembic) -Publishing point caches in alembic format is pretty straightforward, but it is by default enforcing better compatibility -with other DCCs, so it needs data do be exported prepared in certain way. You need to add `path` attribute so objects -in alembic are better structured. When using alembic round trip in Houdini (loading alembics, modifying then and -then publishing modifications), `path` is automatically resolved by alembic nodes. - -In this example, I've created this node graph on **sop** level, and I want to publish it as point cache. - -![Pointcache setup](assets/houdini_pointcache_path.png) - -*Note: `connectivity` will add index for each primitive and `primitivewrangle1` will add `path` attribute, so it will -be for each primitive (`sphere1` and `sphere2`) as Maya is expecting - `strange_GRP/strange0_GEO/strange0_GEOShape`. How -you handle `path` attribute is up to you, this is just an example.* - -Now select the `output0` node and go **OpenPype -> Create** and select **Point Cache**. It will create -Alembic ROP `/out/pointcacheStrange` - -## Publishing Reviews (OpenGL) -To generate a review output from Houdini you need to create a **review** instance. -Go to **OpenPype -> Create** and select **Review**. - -![Houdini Create Review](assets/houdini_review_create_attrs.png) - -On create, with the **Use Selection** checkbox enabled it will set up the first -camera found in your selection as the camera for the OpenGL ROP node and other -non-cameras are set in **Force Objects**. It will then render those even if -their display flag is disabled in your scene. - -## Redshift -:::note Work in progress -This part of documentation is still work in progress. -::: - -## Publishing Render to Deadline -Five Renderers(Arnold, Redshift, Mantra, Karma, VRay) are supported for Render Publishing. -They are named with the suffix("_ROP") -To submit render to deadline, you need to create a **Render** instance. -Go to **Openpype -> Create** and select **Publish**. Before clicking **Create** button, -you need select your preferred image rendering format. You can also enable the **Use selection** to -select your render camera. -![Houdini Create Render](assets/houdini_render_publish_creator.png) - -All the render outputs are stored in the pyblish/render directory within your project path.\ -For Karma-specific render, it also outputs the USD render as default. - -## Publishing cache to Deadline -Artist can publish cache to deadline which increases productivity as artist can use local machine -could be used for other tasks. -Caching on the farm is supported for: - -**Arnold ASS (.ass)** -**Pointcache (.bgeo and .abc)** -**VDB (.vdb)** -**Redshift Proxy (.rs)** - -To submit your cache to deadline, you need to create the instance(s) with clicking -**Submitting to Farm** and you can also enable **Use selection** to -select the object for caching in farm. -![Houdini Farm Cache Creator](assets/houdini_farm_cache_creator.png) - -When you go to Publish Tab and click the instance(s), you can set up your preferred -**Frame per task**. -![Houdini Farm Per Task](assets/houdini_frame_per_task.png) - -Once you hit **Publish**, the cache would be submitted and rendered in deadline. -When the render is finished, all the caches would be located in your publish folder. -You can see them in the Loader. -![Houdini Farm Per Task](assets/houdini_farm_cache_loader.png) - -## USD (experimental support) -### Publishing USD -You can publish your Solaris Stage as USD file. -![Solaris USD](assets/houdini_usd_stage.png) - -This is very simple test stage. I've selected `output` **lop** node and went to **OpenPype -> Create** where I've -selected **USD**. This created `/out/usdDefault` USD ROP node. - -### Publishing USD render - -USD Render works in similar manner as USD file, except it will create **USD Render** ROP node in out and will publish -images produced by it. If you have selected node in Solaris Stage it will by added as **lop path** to ROP. - -## Publishing VDB - -Publishing VDB files works as with other data types. In this example I've created simple PyroFX explosion from -sphere. In `pyro_import` I've converted the volume to VDB: - -![VDB Setup](assets/houdini_vdb_setup.png) - -I've selected `vdb1` and went **OpenPype -> Create** and selected **VDB Cache**. This will create -geometry ROP in `/out` and sets its paths to output vdb files. During the publishing process -whole dops are cooked. - -## Publishing Houdini Digital Assets (HDA) - -You can publish most of the nodes in Houdini as hda for easy interchange of data between Houdini instances or even -other DCCs with Houdini Engine. - -## Creating HDA - -Simply select nodes you want to include in hda and go **OpenPype -> Create** and select **Houdini digital asset (hda)**. -You can even use already existing hda as a selected node, and it will be published (see below for limitation). - -:::caution HDA Workflow limitations -As long as the hda is of same type - it is created from different nodes but using the same (subset) name, everything -is ok. But once you've published version of hda subset, you cannot change its type. For example, you create hda **Foo** -from *Cube* and *Sphere* - it will create hda subset named `hdaFoo` with the same type. You publish it as version 1. -Then you create version 2 with added *Torus*. Then you create version 3 from the scratch from completely different nodes, -but still using resulting subset name `hdaFoo`. Everything still works as expected. But then you use already -existing hda as a base, for example from different artist. Its type cannot be changed from what it was and so even if -it is named `hdaFoo` it has different type. It could be published, but you would never load it and retain ability to -switch versions between different hda types. -::: - -## Loading HDA - -When you load hda, it will install its type in your hip file and add published version as its definition file. When -you switch version via Scene Manager, it will add its definition and set it as preferred. - -## Publishing and loading BGEO caches - -There is a simple support for publishing and loading **BGEO** files in all supported compression variants. - -### Creating BGEO instances - -Select your SOP node to be exported as BGEO. If your selection is in the object level, OpenPype will try to find if there is an `output` node inside, the one with the lowest index will be used: - -![BGEO output node](assets/houdini_bgeo_output_node.png) - -Then you can open Publisher, in Create you select **BGEO PointCache**: - -![BGEO Publisher](assets/houdini_bgeo-publisher.png) - -You can select compression type and if the current selection should be connected to ROPs SOP path parameter. Publishing will produce sequence of files based on your timeline settings. - -### Loading BGEO - -Select your published BGEO subsets in Loader, right click and load them in: - -![BGEO Publisher](assets/houdini_bgeo-loading.png) diff --git a/website/docs/artist_hosts_maya.md b/website/docs/artist_hosts_maya.md deleted file mode 100644 index 364461f4b6..0000000000 --- a/website/docs/artist_hosts_maya.md +++ /dev/null @@ -1,672 +0,0 @@ ---- -id: artist_hosts_maya -title: Maya -sidebar_label: Maya ---- - -## OpenPype global tools - -- [Set Context](artist_tools_context_manager) -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) -- [Library Loader](artist_tools_library_loader) - -## Working with OpenPype in Maya - -OpenPype is here to ease you the burden of working on project with lots of -collaborators, worrying about naming, setting stuff, browsing through endless -directories, loading and exporting and so on. To achieve that, OpenPype is using -concept of being _"data driven"_. This means that what happens when publishing -is influenced by data in scene. This can by slightly confusing so let's get to -it with few examples. - -## Publishing models - -### Intro - -Publishing models in Maya is pretty straightforward. Create your model as you -need. You need to adhere to specifications of your studio that can be different -between studios and projects but by default your geometry has to be named properly. -For example `sphere_GEO` or `cube1_GEO`. Geometry needs to have freezed transformations -and must reside under one group, for example `model_GRP`. - -![Model example](assets/maya-model_hierarchy_example.jpg) - -Note that `sphere_GEO` has frozen transformations. - -### Creating instance - -Now create **Model instance** from it to let OpenPype know what in the scene you want to -publish. Go **OpenPype โ†’ Create... โ†’ Model** - -![Model create instance](assets/maya-model_create_instance.jpg) - -`Asset` field is a name of asset you are working on - it should be already filled -with correct name as you've started Maya or switched context to specific asset. You -can edit that field to change it to different asset (but that one must already exists). - -`Subset` field is a name you can decide on. It should describe what kind of data you -have in the model. For example, you can name it `Proxy` to indicate that this is -low resolution stuff. See [Subset](artist_concepts.md#subset). - -:::note LOD support -By changing subset name you can take advantage of _LOD support_ in OpenPype. Your -asset can contain various resolution defined by different subsets. You can then -switch between them very easy using [Inventory (Manage)](artist_tools_inventory). -There LODs are conveniently grouped so they don't clutter Inventory view. - -Name your subset like `main_LOD1`. Important part is that `_LOD1`. You can have as many LODs as you need. -::: - -Read-only field just under it show final subset name, adding subset field to -name of the group you have selected. - -`Use selection` checkbox will use whatever you have selected in Outliner to be -wrapped in Model instance. This is usually what you want. Click on **Create** button. - -You'll notice then after you've created new Model instance, there is new set -in Outliner called after your subset, in our case it is `modelMain`. - -And that's it, you have your first model ready to publish. - -Now save your scene (if you didn't do it already). You will notice that path -in Save dialog is already set to place where scenes related to modeling task on -your asset should reside. As in our case we are working on asset called -**Ben** and on task **modeling**, path relative to your project directory will be -`project_XY/assets/ben/work/modeling`. Let's save our scene as `model_test_v01`. - -### Publishing models - -Now let's publish it. Go **OpenPype โ†’ Publish...**. You will be presented with following window: - -![Model publish](assets/maya-model_pre_publish.jpg) - -Note that content of this window can differs by your pipeline configuration. -For more detail see [Publisher](artist_tools_publisher). - -Items in left column are instances you will be publishing. You can disable them -by clicking on square next to them. Green square indicate they are ready for -publishing, red means something went wrong either during collection phase -or publishing phase. Empty one with gray text is disabled. - -See that in this case we are publishing from scene file `model_test_v01.mb` in -Maya model named `modelMain (ben)` (next item). Publishing of workfile is -currently disabled (last item). - -Right column lists all tasks that are run during collection, validation, -extraction and integration phase. White items are optional and you can disable -them by clicking on them. - -Lets do dry-run on publishing to see if we pass all validators. Click on flask -icon at the bottom. Validators are run. Ideally you will end up with everything -green in validator section. - -### Fixing problems - -To make things interesting, I intentionally forgot to freeze transformations -on `sphere_GEO` as I know it will trigger validator designed to check just this. - -![Failed Model Validator](assets/maya-model_publish_error.jpg) - -You can see our model is now marked red in left column and in right we have -red box next to `Transform Zero (Freeze)` validator. - -You can click on arrow next to it to see more details: - -![Failed Model Validator details](assets/maya-model_freeze_error_details.jpg) - -From there you can see in **Records** entry that there is problem with `sphere_GEO`. -Some validators have option to fix problem for you or just select objects that -cause trouble. This is the case with our failed validator. - -In main overview you can notice little up arrow in a circle next to validator -name. Right click on it and you can see menu item `select invalid`. This -will select offending object in Maya. - -Fix is easy. Without closing Publisher window we just freeze transformations. -Then we need to reset it to make it notice changes we've made. Click on arrow -circle button at the bottom and it will reset Publisher to initial state. Run -validators again (flask icon) to see if everything is ok. - -It should be now. Write some comment if you want and click play icon button -when ready. - -Publish process will now take its course. Depending on data you are publishing -it can take a while. You should end up with everything green and message -**Finished successfully ...** You can now close publisher window. - -To check for yourself that model is published, open -[Asset Loader](artist_tools_loader) - **OpenPype โ†’ Load...**. -There you should see your model, named `modelMain`. - -## Look development - -Look development in OpenPype is easy. It helps you with versioning different -kinds of shaders and easy switching between them. - -Let se how it works. - -### Loading model - -In this example I have already published model of Buddha. To see how to publish -model with OpenPype see [Publishing Model](artist_hosts_maya.md#publishing-models). - -First of lets start with empty scene. Now go **OpenPype โ†’ Load...** - -![Model loading](assets/maya-model_loading.jpg) - -Here I am loading `modelBuddha`, its version 1 for asset **foo**. Just right-click -on it and select **Reference (abc)**. This will load model into scene as alembic. -Now you can close Loader window. - -### Creating look - -Now you can create whatever look you want. Assign shaders, textures, etc. to model. -In my case, I assigned simple Arnolds _aiSurfaceShader_ and changed its color to red. - -![Look Dev - Red Buddha](assets/maya-look_dev-red_buddha.jpg) - -I am quite happy with it so I want to publish it as my first look. - -### Publishing look - -Select your model in outliner and ho **OpenPype โ†’ Create...**. From there -select **Look**. Make sure `use selection` checkbox is checked. -Mine subset name is `Main`. This will create _Look instance_ with a name **lookMain**. - -Close _Creator_ window. - -Now save your scene, give it some sensible name. Next, go **OpenPype โ†’ Publish**. -This process is almost identical as publishing models, only different _Validators_ -and other plugins will be used. - -This should be painless and cause no trouble so go ahead, click play icon button at -the bottom and it will publish your look. - -:::note publishing multiple looks -You can reference same model into scene multiple times, change materials on every -instance with what you need. Then on every model create _Look instance_. When -publishing all those _Look instances_ will be published at same time. -::: - -### Loading looks into models - -Now lets see how look are applied. Start new empty scene, load your published -model there as before (using _Reference (abc)_). If you didn't notice until now, -there are few yellow icons in left shelf: - -![Maya - shortcut icons](assets/maya-shortcut_buttons.jpg) - -Those are shortcuts for **Look Manager**, [Work Files](artist_tools_workfiles), -[Load](artist_tools_loader), and [Manage (Inventory)](artist_tools_inventory). - -Those can be found even in top menu, but that depends on your studio setup. - -You are interested now in **Look Manager** - first item with brush icon. Select -your Buddha model and open **Look Manager**. - -![Maya - Look Manager](assets/maya-look_dev-look_manager.jpg) - -This is **Look Manager** window. Yours would be empty until you click **Get All Assets** -or **Get Assets From Selection**. You can use later to quick assign looks if you have -multiple assets loaded in scene. Click on one of those button now. - -You should now see all assets and their subsets loaded in scene, and on right side -all applicable published looks. - -Select you asset and on the right side right click on `Main` look. Apply it. - -You notice that Buddha model is now red, materials you've published are now applied -to it. - -That way you can create looks as you want and version them using OpenPype. - -## Setting scene data - -Maya settings concerning framerate, resolution and frame range are handled by -OpenPype. If set correctly in Ftrack, Maya will validate you have correct fps on -scene save and publishing offering way to fix it for you. - -For resolution and frame range, use **OpenPype โ†’ Set Frame Range** and -**OpenPype โ†’ Set Resolution** - - -## Creating rigs with OpenPype - -Creating and publishing rigs with OpenPype follows similar workflow as with -other data types. Create your rig and mark parts of your hierarchy in sets to -help OpenPype validators and extractors to check and publish it. - -### Preparing rig for publish - -When creating rigs, it is recommended (and it is in fact enforced by validators) -to separate bones or driven objects, their controllers and geometry so they are -easily managed. Currently OpenPype doesn't allow to publish model at the same time as -its rig so for demonstration purposes, I'll first create simple model for robotic -arm, just made out of simple boxes and I'll publish it. - -![Maya - Simple model for rigging](assets/maya-rig_model_setup.jpg) - -For more information about publishing models, see [Publishing models](artist_hosts_maya.md#publishing-models). - -Now let's start with empty scene. Load your model - **OpenPype โ†’ Load...**, right -click on it and select **Reference (abc)**. - -I've created a few bones in `rig_GRP`, their controllers in `controls_GRP` and -placed the rig's output geometry in `geometry_GRP`. Naming of the groups is not important - just adhere to -your naming conventions. Then I parented everything into a single top group named `arm_rig`. - -With the prepared hierarchy it is time to create a *Rig instance* in OpenPype. -Select the top group of your rig and go to **OpenPype โ†’ Create...**. Select **Rig**. -A publish set for your rig is created in your scene to mark rig parts for export. -Notice that it has two subsets - `controls_SET` and `out_SET`. Put your controls into `controls_SET` -and geometry to `out_SET`. You should end up with something like this: - -![Maya - Rig Hierarchy Example](assets/maya-rig_hierarchy_example.jpg) - -:::note controls_SET and out_SET contents -It is totally allowed to put the `geometry_GRP` in the `out_SET` as opposed to -the individual meshes - it's even **recommended**. However, the `controls_SET` -requires the individual controls in it that the artist is supposed to animate -and manipulate so the publish validators can accurately check the rig's -controls. -::: - -### Publishing rigs - -Publishing rigs is done in a same way as publishing everything else. Save your scene -and go **OpenPype โ†’ Publish**. When you run validation you'll most likely run into -a few issues at first. Although a number of them will seem to be intimidating you -will find out they are mostly minor things, easily fixed and are there to optimize -your rig for consistency and safe usage by the artist. - -- **Non Duplicate Instance Members (ID)** - This will most likely fail because when -creating rigs, we usually duplicate few parts of it to reuse them. But duplication -will duplicate also ID of original object and OpenPype needs every object to have -unique ID. This is easily fixed by **Repair** action next to validator name. click -on little up arrow on right side of validator name and select **Repair** form menu. - -- **Joints Hidden** - This is enforcing joints (bones) to be hidden for user as -animator usually doesn't need to see them and they clutter his viewports. So -well behaving rig should have them hidden. **Repair** action will help here also. - -- **Rig Controllers** will check if there are no transforms on unlocked attributes -of controllers. This is needed because animator should have ease way to reset rig -to it's default position. It also check that those attributes doesn't have any -incoming connections from other parts of scene to ensure that published rig doesn't -have any missing dependencies. - -### Loading rigs - -You can load rig with [Loader](artist_tools_loader). Go **OpenPype โ†’ Load...**, -select your rig, right click on it and **Reference** it. - -### Animation instances - -Whenever you load a rig an animation publish instance is automatically created -for it. This means that if you load a rig you don't need to create a pointcache -instance yourself to publish the geometry. This is all cleanly prepared for you -when loading a published rig. - -:::tip Missing animation instance for your loaded rig? -Did you accidentally delete the animation instance for a loaded rig? You can -recreate it using the [**Recreate rig animation instance**](artist_hosts_maya.md#recreate-rig-animation-instance) -inventory action. -::: - -## Point caches -OpenPype is using Alembic format for point caches. Workflow is very similar as -other data types. - -### Creating Point Caches - -To create point cache just create whatever hierarchy you want and animate it. -Select its root and Go **OpenPype โ†’ Create...** and select **Point Cache**. - -After that, publishing will create corresponding **abc** files. - -When creating the instance, a objectset child `proxy` will be created. Meshes in the `proxy` objectset will be the viewport representation where loading supports proxies. Proxy representations are stored as `resources` of the subset. - -Example setup: - -![Maya - Point Cache Example](assets/maya-pointcache_setup.png) - -#### Options - -- **Frame Start**: which frame to start the export at. -- **Frame End**: which frame to end the export at. -- **Handle Start**: additional frames to export at frame start. Ei. frame start - handle start = export start. -- **Handle Start**: additional frames to export at frame end. Ei. frame end + handle end = export end. -- **Step**: frequency of sampling the export. For example when dealing with quick movements for motion blur, a step size of less than 1 might be better. -- **Refresh**: refresh the viewport when exporting the pointcache. For performance is best to leave off, but certain situations can require to refresh the viewport, for example using the Bullet plugin. -- **Attr**: specific attributes to publish separated by `;`. -- **AttrPrefix**: specific attributes which start with this prefix to publish separated by `;`. -- **Include User Defined Attribudes**: include all user defined attributes in the publish. -- **Farm**: if your studio has Deadline configured, artists could choose to offload potentially long running export of pointache and publish it to the farm. Only thing that is necessary is to toggle this attribute in created pointcache instance to True. -- **Priority**: Farm priority. - -### Loading Point Caches - -Loading point cache means creating reference to **abc** file with Go **OpenPype โ†’ Load...**. - -Example result: - -![Maya - Point Cache Example](assets/maya-pointcache_loaded.png) - -## Set dressing in Maya - -Set dressing is term for easily populate complex scenes with individual parts. -OpenPype allows to version and manage those sets. - -### Publishing Set dress / Layout - -Working with Set dresses is very easy. Just load your assets into scene with -[Loader](artist_tools_loader) (**OpenPype โ†’ Load...**). Populate your scene as -you wish, translate each piece to fit your need. When ready, select all imported -stuff and go **OpenPype โ†’ Create...** and select **Set Dress** or **Layout**. -This will create set containing your selection and marking it for publishing. - -:::note set dress vs layout -Currently *set dress* and *layout* are functionally identical -::: - -Now you can publish is with **OpenPype โ†’ Publish**. - -### Loading Set dress / Layout - -You can load Set dress / Layout using [Loader](artist_tools_loader) -(**OpenPype โ†’ Load...**). Select you layout or set dress, right click on it and -select **Reference Maya Ascii (ma)**. This will populate your scene with all those -models you've put into layout. - -## Rendering with OpenPype - -OpenPype in Maya can be used for submitting renders to render farm and for their -subsequent publishing. Right now OpenPype support [AWS Thinkbox Deadline](https://www.awsthinkbox.com/deadline) -and [Royal Render](https://www.royalrender.de/). - -* For setting up Royal Render support see [admin section](module_royalrender.md) -* For setting up Deadline support see [here](module_deadline.md) - - -### Creating basic render setup - -If you want to submit your render to farm, just follow these simple steps. - -#### Preparing scene - -Lets start with empty scene. First I'll pull in my favorite Buddha model. -**OpenPype โ†’ Load...**, select model and right+click to pop up context menu. From -there just click on **Reference (abc)**. - -Next, I want to be sure that I have same frame range as is set on shot I am working -on. To do this just **OpenPype โ†’ Set Frame Range**. This should set Maya timeline to same -values as they are set on shot in *Ftrack* for example. - -I have my time set, so lets create some animation. We'll turn Buddha model around for -50 frames (this is length of my timeline). - -Select model, go to first frame, key Y axis rotation, go to last frame, enter 360 to -**Channel Editor** Y rotation, key it and its done. If you are not sure how to do it, -you are probably reading wrong documentation. - -Now let set up lights, ground and camera. I am lazy so I create Arnolds Skydome light: -**Arnold โ†’ Lights โ†’ Skydome Light**. As ground simple Plane will suffice and I'll set -my perspective view as I like and create new camera from it (`CTRL+SHIFT+C`) and rename -it from `persp1` to `mainCamera`. - -One last thing, I'll assign basic *aiSurfaceShader* to my Buddha and do some little -tweaks on it. - -#### Prepare scene for submission - -As we have working simple scene we can start preparing it for rendering. OpenPype is fully utilizing -Render Setup layers for this. First of all, we need to create *Render instance* to tell OpenPype what -to do with renders. You can easily render locally or on render farm without it, but *Render instance* -is here to mark render layers you want to publish. - -Lets create it. Go **OpenPype โ†’ Create...**. There select **Render** from list. If you keep -checked **Use selection** it will use your current Render Layers (if you have them). Otherwise, -if no render layers is present in scene, it will create one for you named **Main** and under it -default collection with `*` selector. - -OpenPype will try to connect to render farm and fetch machine pool list. - -So now my scene now looks like this: - -![Maya - Render scene Setup](assets/maya-render_setup.jpg) - -You can see that it created `renderingMain` set and under it `LAYER_Main`. This set corresponds to -**Main** render layer in Render Setup. This was automatically created because I had not created any -render layers in scene before. If you already have layers and you use **Use selection**, they will -appear here, prefixed with `LAYER_`. Those layer set are created whenever you create new layer in -Render Setup and are deleted if you delete layer in Render Setup. However if you delete `LAYER_` set, -layer in Render Setup isn't deleted. It just means it won't be published. - -Creating *Render instance* will also set image prefix in render settings to OpenPype defaults based on -renderer you use - for example if you render with Arnold, it is `maya///_`. - -There are few setting on *Render instance* `renderingMain` in **Attributes Editor**: - -![Maya - Render attributes](assets/maya-renderglobals.jpg) - -Few options that needs explaining: - -* `Primary Pool` - here is list of pool fetched from server you can select from. -* `Suspend publish Job` - job sent to farm will not start render automatically -but is in *waiting* state. -* `Extend Frames` - if checked it will add new frames to previous render, so you can -extend previous image sequence. -* `Override Existing Frame` - will overwrite file in destination if they exists -* `Priority` is priority of job on farm -* `Frames Per Task` is number of sequence division between individual tasks (chunks) -making one job on farm. - -Now if you run publish, you notice there is in right column new item called -`Render Layers` and in it there is our new layer `Main (999_abc_0010) [1-10]`. First part is -layer name, second `(999_abc_0010)` is asset name and rest is frame range. - -![Maya - Render Publish errors](assets/maya-render_publish_detail1.jpg) - -You see I already tried to run publish but was stopped by few errors. Lets go -through them one by one just to see what we need to set up further in scene for -successful publish. - -**No Default Cameras Renderable** is telling me: - -```fix -Renderable default cameras found: [u'|persp|perspShape'] -``` - -and so can be resolved by simple change in *Main* layer render settings. -All I have to do is just remove the `persp` camera from render settings and add there correct camera. - -This leaves me only with **Render Settings** error. If I click on it to see -details, I see it has problem with animation not being enabled: - -```fix -Animation needs to be enabled. Use the same frame for start and end to render single frame -``` - -Go to **Render Settings**, select your render layer and in **Common** tab change -in **File Output** `Frame/Animation ext` to whatever you want, just not _Single Frame_. -Set **Frame Range** `Start frame` and `End frame` according your needs. - -If you run into problems with *image file prefix* - this should be set correctly when -creating *Render instance*, but you can tweak it. It needs to begin with `maya/` token -to avoid render conflicts between DCCs. It needs to have `` or `` (vray) and -`` or `` (vray). If you have more then one renderable cameras, add `` token. - -Sane default for arnold, redshift or renderman is: - -```fix -maya//_ -``` - -and for vray: - -```fix -maya// -``` - -Doing **OpenPype โ†’ Set Resolution** will set correct resolution on camera. - -Scene is now ready for submission and should publish without errors. - -:::tip what happens when I publish my render scene -When publishing is finished, job is created on farm. This job has one more dependent job connected to itself. -When render is finished, this other job triggers in and run publish again, but this time it is publishing rendered image sequence and creating quicktime movie for preview from it. Only those rendered sequences that have **beauty** AOV get preview as it doesn't make sense to make it for example from cryptomatte. -::: - -### Attaching render to subset - -You can create render that will be attached to another subset you are publishing, rather than being published on its own. Let's assume, you want to render a model turnaround. -In the scene from where you want to publish your model create *Render subset*. Prepare your render layer as needed and then drag -model subset (Maya set node) under corresponding `LAYER_` set under *Render instance*. During publish, it will submit this render to farm and -after it is rendered, it will be attached to your model subset. - -### Tile Rendering -:::note Deadline -This feature is only supported when using Deadline. See [here](module_deadline#openpypetileassembler-plugin) for setup. -::: -On the render instance objectset you'll find: - -* `Tile Rendering` - for enabling tile rendering. -* `Tile X` - number of tiles in the X axis. -* `Tile Y` - number of tiles in the Y axis. - -When submittig to Deadline, you'll get: - -- for each frame a tile rendering job, to render each from Maya. -- for each frame a tile assembly job, to assemble the rendered tiles. -- job to publish the assembled frames. - -## Render Setups - -### Publishing Render Setups - -OpenPype can publish whole **Render Settings** setup. You can then version in and load it to -any Maya scene. This helps TDs to distribute per asset/shots render settings for Maya. - -To publish render settings, go **OpenPype โ†’ Create...** and select **Render Setup Preset**. - -In your scene will appear set `rendersetup`. This one has no settings, only its presence -in scene will trigger publishing of render settings. - -When you publish scene, current settings in **Render Settings** will be serialized to json file. - -### Loading Render Setups - -In any scene, you can load published render settings with **OpenPype โ†’ Load...**. Select your published -render setup settings, right+click on it and select **Load RenderSetup template**. - -This will load and parse json file and apply all setting there to your Render Setting. - -:::warning -This will overwrite all setting you already have. -::: - -## Reviews - -OpenPype supports creating review video for almost any type of data you want to publish. -What we call review video is actually _playblast_ or _capture_ (depending on terminology -you are familiar with) made from pre-defined camera in scene. This is very useful -in cases where you want to add turntable preview of your model for example. But it can -be used to generate preview for animation, simulations, and so on. You can either -publish review as separate subset version, or you can attach generated video to subset you -are publishing - for example attach video of turntable rotation to published model as in -following example. - -### Setting scene for review extraction - -Lets see how review publishing works on simple scene. We will publish model with -turntable preview video. - -I'll be using Stanford University dragon model. Start with empty scene. -Create your model, import it or load from OpenPype. I'll just import model as OBJ -file. - -After we have our model in, we need to set everything to be able to publish it -as model - for detail see [Publishing models](artist_hosts_maya.md#publishing-models). - -To recap - freeze transforms, rename it to `dragon_GEO` and put it into group -`dragon_GRP`. Then select this group and **OpenPype โ†’ Create...** and choose **Model**. - -Now, lets create camera we need to generate turntable video. I prefer to animate -camera itself and not model because all animation keys will be associated with camera -and not model we want to publish. - -I've created camera, named it `reviewCamera` and parent it under `reviewRotation_LOC` -locator. I set my timeline to 50 frames, key `reviewRotation_LOC` Y axis on frame -1 to 0 and on frame 50 to 360. I've also set animation curve between those two keys -to linear. - -To mark camera to be used for review, select camera `reviewCamera` and go **OpenPype โ†’ Create...** -and choose **Review**. - -This will create set `review` including selected camera. You can set few options -on this set to control review video generation: - -* `Active` - control on/off state -* `Frame Start` - starting frame for review -* `Frame End` - end frame for review -* `Handles` - number of handle frame before and after -* `Step` - number of steps -* `Fps` - framerate - -Next step is to move your model set to review set so it will be connected to each other. - -This is my scene: - -![Maya - Review model setup](assets/maya-model_review_setup.jpg) - -You see that `modelMain` in under `reviewMain` with `reviewCamera`. - -_* note that I had to fix UVs and normals on Stanford dragon model as it wouldn't pass -model validators_ - -### Publishing model with review - -You can now publish your model and generate review video. Go **OpenPype โ†’ Publish...**, -validate if you will, and publish it. During publishing, Maya will create _playblast_ -for whole frame range you've specified, then it will pass those frames to _ffmpeg_. -That will create video file, pass it to another extractor creating burnins in it -and finally uploading this video to ftrack with your model (or other type) published -version. All parts of this process - like what burnins, what type of video file, -settings for Maya playblast - can be customized by your TDs. For more information -about customizing review process refer to [admin section](project_settings/settings_project_global.md/#publish-plugins). - -If you don't move `modelMain` into `reviewMain`, review will be generated but it will -be published as separate entity. - - -## Inventory Actions - -### Connect Geometry - -This action will connect geometries between containers. - -#### Usage - -Select 1 container of type `animation` or `pointcache`, then 1+ container of any type. - -#### Details - -The action searches the selected containers for 1 animation container of type `animation` or `pointcache`. This animation container will be connected to the rest of the selected containers. Matching geometries between containers is done by comparing the attribute `cbId`. - -The connection between geometries is done with a live blendshape. - -### Recreate rig animation instance - -This action can regenerate an animation instance for a loaded rig, for example -for when it was accidentally deleted by the user. - -![Maya - Inventory Action Recreate Rig Animation Instance](assets/maya-inventory_action_recreate_animation_instance.png) - -#### Usage - -Select 1 or more container of type `rig` for which you want to recreate the -animation instance. diff --git a/website/docs/artist_hosts_maya_arnold.md b/website/docs/artist_hosts_maya_arnold.md deleted file mode 100644 index da16ba66c0..0000000000 --- a/website/docs/artist_hosts_maya_arnold.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: artist_hosts_maya_arnold -title: Arnold for Maya -sidebar_label: Arnold ---- -## Arnold Scene Source (.ass) -Arnold Scene Source can be published as a single file or a sequence of files, determined by the frame range. - -When creating the instance, two objectsets are created; `content` and `proxy`. Meshes in the `proxy` objectset will be the viewport representation when loading as `standin`. - -### Arnold Scene Source Proxy Workflow -In order to utilize operators and proxies, the content and proxy nodes need to share the same names (including the shape names). This is done by parenting the content and proxy nodes into separate groups. For example: - -![Arnold Scene Source](assets/maya-arnold_scene_source.png) - -## Standin -Arnold Scene Source `ass` and Alembic `abc` are supported to load as standins. - -### Standin Proxy Workflow -If a subset has a proxy representation, this will be used as display in the viewport. At render time the standin path will be replaced using the recommended string replacement workflow; - -https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_maya_operators_am_Updating_procedural_file_paths_with_string_replace_html - -Since the content and proxy nodes share the same names and hierarchy, any manually shader assignments will be shared. - - -:::note for advanced users -You can stop the proxy swapping by disabling the string replacement operator found in the container. -![Arnold Standin](assets/maya-arnold_standin.png) -::: diff --git a/website/docs/artist_hosts_maya_multiverse.md b/website/docs/artist_hosts_maya_multiverse.md deleted file mode 100644 index a173e79125..0000000000 --- a/website/docs/artist_hosts_maya_multiverse.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -id: artist_hosts_maya_multiverse -title: Multiverse for Maya -sidebar_label: Multiverse USD ---- - -## Working with Multiverse in OpenPype - -OpenPype supports creating, publishing and loading of [Multiverse | USD]( -https://multi-verse.io) data. The minimum Multiverse version supported is v6.7, -and version 7.0 is recommended. - -In a nutshell it is possible to: - -- Create USD Assets, USD compositions, USD Overrides. - - This _creates_ OpenPype instances as Maya set nodes that contain information - for published USD data. - -- Create Multiverse Looks. - - This _creates_ OpenPype instances as Maya set nodes that contain information - for published Maya shading networks data and USD material assignment data. - -- Publish USD Assets, USD compositions and USD Overrides. - - This _writes_ USD files to disk and _publishes_ information to the OpenPype - database. - -- Publish Multiverse Looks. - - This _writes_ a Maya file containing shading networks (to import in Maya), a - USD override file containing material assignment information (to layer in a - Multiverse Compound), it copies original & mip-mapped textures to disk and - _publishes_ information to the OpenPype database. - -- Load any USD data into Multiverse "Compound" shape nodes. - - This _reads_ USD files (and also Alembic files) into Maya by _streaming_ them - to the viewport. - -- Rendering USD data procedurally with 3DelightNSI, Arnold, Redshift, - RenderMan and VRay. - - This reads USD files by _streaming_ them procedurally to the renderer, at - render time. - -USD files written by Multiverse are 100% native USD data, they can be exchanged -with any other DCC applications able to interchange USD. Likewise, Multiverse -can read native USD data created by other applications. The USD extensions are -supported: `.usd` (binary), `.usda` (ASCII), `.usdz`. (zipped, optionally with -textures). Sequences of USD files can also be read via "USD clips". - -It is also possible to load Alembic data (`.abc`) in Multiverse Compounds, -further compose it & override it in other USD files, and render it procedurally. -Alembic data is always converted on the fly (in memory) to USD data. USD clip -from Alembic data are also supported. - - -### Configuration - -To configure Multiverse in OpenPype, an admin privileges needs to setup a new -OpenPype tool in the OpenPype Project Settings, using a similar configuration as -the one depicted here: - -![Maya - Multiverse Setup](assets/maya-multiverse_setup.png) - - -``` -{ - "MULTIVERSE_PATH": "/Path/to/Multiverse-{MULTIVERSE_VERSION}", - "MAYA_MODULE_PATH": "{MULTIVERSE}/Maya;{MAYA_MODULE_PATH}" -} - -{ - "MULTIVERSE_VERSION": "7.1.0-py27" -} - -``` - -The Multiverse Maya module file (.mod) pointed above contains all the necessary -environment variables to run Multiverse. - -The OpenPype settings will contain blocks to enable/disable the Multiverse -Creators and Loader, along with sensible studio setting. - -For more information about setup of Multiverse please refer to the relative page -on the [Multiverse official documentation](https://multi-verse.io/docs). - - -### Understanding Assets, Compounds, Compositions, Overrides and Layering - -In Multiverse we use some terminology that relates to USD I/O: terms like -"Assets", "Compounds", "Compositions", "Overrides" and "Layering". - -Please hop to the new [Multiverse Introduction]( -https://j-cube.jp/solutions/multiverse/docs/usage/introduction) page on the -official documentation to understand them before reading the next sections. - - -### Creators - -It is possible to create OpenPype "instances" (resulting in Maya set containers) -for publishing Multiverse USD Assets, Compositions, Overrides and Looks. - -When creating OpenPype instances for Multiverse USD Asset, Composition, -Override and Look, the creator plug-in will put the relative selected data in a -Maya set node which holds the properties used by the Multiverse data writer for -publishing. - -You can choose the USD file format in the Creators' set nodes: - -- Assets: `.usd` (default) or `.usda` or `.usdz` -- Compositions: `.usda` (default) or `.usd` -- Overrides: `.usda` (default) or `.usd` -- Looks: `.ma` (default) - -![Maya - Multiverse Asset Creator](assets/maya-multiverse_openpype_asset_creator.png) - -![Maya - Multiverse Asset Creator](assets/maya-multiverse_openpype_composition_creator.png) - -![Maya - Multiverse Asset Creator](assets/maya-multiverse_openpype_override_creator.png) - -![Maya - Multiverse Asset Creator](assets/maya-multiverse_openpype_look_creator.png) - -### Publishers - -The relative publishers for Multiverse USD Asset, Composition, Override and Look -are available. The first three write USD files to disk, while look writes a Maya -file along with the mip-mapped textures. All communicate publish info to the -OpenPype database. - -![Maya - Multiverse Publisher](assets/maya-multiverse_openpype_publishers.png) - - -### Loader - -The loader creates a Multiverse "Compound" shape node reading the USD file of -choice. All data is _streamed_ to the viewport and not contained in Maya. Thanks -to the various viewport draw options the user can strategically decide how to -minimize the cost of viewport draw effectively being able to load any data, this -allows to bring into Maya scenes of virtually unlimited complexity. - -![Maya - Multiverse Loader](assets/maya-multiverse_openpype_loader.png) - -:::tip Note -When using the Loader, Multiverse, by design, never "imports" USD data into the -Maya scene as Maya data. Instead, when desired, Multiverse permits to import -specific USD primitives, or entire hierarchies, into the Maya scene as Maya data -selectively from MEOW, it also tracks what is being imported with a "live -connection" , so upon modification, it is possible to write (create & publish) -the modifies data as a USD file for being layered on top of its relative -Compound. See the [Multiverse Importer]( -https://j-cube.jp/solutions/multiverse/docs/usage/importer)) documentation. -::: - -### Look - -In OpenPype a Multiverse Look is the combination of: - -- a Maya file that contains the shading networks that were assigned to the items - of a Multiverse Compound. -- a Multiverse USD Override file that contains the material assignment - information (which Maya material was assigned to which USD item) -- mip-mapped textures - -Multiverse Look shading networks are typically Maya-referenced in the lighting -and shot scenes. - -Materials are assigned to the USD items in the Compound via the "material -assignment" information that is output in the lookdev stage by a Multiverse -Override. Once published the override can be Layered on the Compound so that -materials will be assigned to items. Finally, an attribute Override on the root -item of the Compound is used to define the `namespace` with which the shading -networks were referenced in Maya. At this point the renderer knows which -material to assign to which item and it is possible to render and edit the -materials as usual. Because the material exists in Maya you can perform IPR and -tune the materials as you please. - -The Multiverse Look will also publish textures in optimized mip-map format, -currently supporting the `.tdl` (Texture Delight) mip map format of the 3Delight -NSI renderer. MipMaps are required when the relative option is checked and you -are publishing Multiverse Looks with the `final` or `-` subset, while they are -not required with the `WIP` or `test` subsets. MipMaps are found automatically -as long as they exist alongside the original textures. Their generation can be -automatic when using 3Delight for Maya or can be manual by using the `tdlmake` -binary utility. - - -### About embedding shading networks in USD - -Alternatively, but also complementary to the Multiverse Look, as of Multiverse -7 it is also possible to write shading networks _inside_ USD files: that is -achieved by using either the Asset writer (if material are defined in the -modeling stage) and the Override writer (if materials are defined in the lookdev -or later stage). - -Some interesting consequences of USD shading networks in Multiverse: - -1. they can be overridden by a shading network in Maya by assigning in MEOW a - Maya material as an override -2. they are available for assignment in MEOW, so you can assign a USD material - to an item as an override -3. From Hypershade you can use the Multiverse USD shading network write File> - Export option to write USD shading network libraries to then layer on an asset - and perform 2. again. - -Note that: - -- Shading networks in USD can then be currently rendered with - 3DelightNSI -- Shading networks in USD can be used for interchange with DCC apps. Multiverse - shading networks are written natively with the USD Shade schema. -- usdPreviewSurface shading networks are too considered embedded shading - networks, though they are classified separately from non-preview / final - quality shading networks -- USDZ files use usdPreviewSurface shading networks, and therefore can be, too, - rendered (with 3DelightNSI) -- in case both usdPreviewSurface and final quality shading networks, the latter - will be used for rendering (while the former can be previewed in the viewport) -- it is possible to disable rendering of any embedded shading network via the - relative option in the Compound Attribute Editor. - - -### Rendering - -Multiverse offers procedural rendering with all the major production renderers: - -- 3DelightNSI -- Arnold -- Redshift -- RenderMan -- VRay - -Procedural rendering effectively means that data is _streamed_ to the renderer -at render-time, without the need to store the data in the Maya scene (this -effectively means small .ma/.mb files that load fast) nor in the renderer native -file format scene description file (this effectively means tiny `.nsi` / `.ass` -/ `.vrscene` / `.rib` files that load fast). - -This is completely transparent to the user: Multiverse Compound nodes present in -the scene, once a render is launched, will stream data to the renderer in a -procedural fashion. - - -### Example Multiverse Pipeline and API - -An example diagram of the data flow in a Maya pipeline using Multiverse is -available, see the [Multiverse Pipeline]( -https://j-cube.jp/solutions/multiverse/docs/pipeline) documentation. - - -A very easy to use Python API to automate any task is available, the API is -user friendly and does not require any knowledge of the vast and complex USD -APIs. See the [Multiverse Python API]( -https://j-cube.jp/solutions/multiverse/docs/dev/python-api.html) documentation. diff --git a/website/docs/artist_hosts_maya_redshift.md b/website/docs/artist_hosts_maya_redshift.md deleted file mode 100644 index 268c49d75c..0000000000 --- a/website/docs/artist_hosts_maya_redshift.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: artist_hosts_maya_redshift -title: Redshift for Maya -sidebar_label: Redshift ---- - -## Working with Redshift in OpenPype - -### Using Redshift Proxies - -OpenPype supports working with Redshift Proxy files. You can create Redshift Proxy from almost -any hierarchy in Maya and it will be included there. Redshift can export animation -proxy file per frame. - -### Creating Redshift Proxy - -To mark data to publish as Redshift Proxy, select them in Maya and - **OpenPype โ†’ Create ...** and -then select **Redshift Proxy**. You can name your subset and hit **Create** button. - -You can enable animation in Attribute Editor: - -![Maya - Yeti Rig Setup](assets/maya-create_rs_proxy.jpg) - -### Publishing Redshift Proxies - -Once data are marked as Redshift Proxy instance, they can be published - **OpenPype โ†’ Publish ...** - -### Using Redshift Proxies - -Published proxy files can be loaded with OpenPype Loader. It will create mesh and attach Redshift Proxy -parameters to it - Redshift will then represent proxy with bounding box. diff --git a/website/docs/artist_hosts_maya_vray.md b/website/docs/artist_hosts_maya_vray.md deleted file mode 100644 index a19fce9735..0000000000 --- a/website/docs/artist_hosts_maya_vray.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -id: artist_hosts_maya_vray -title: VRay for Maya -sidebar_label: VRay ---- - -## Working with VRay in OpenPype - -### #Using VRay Proxies - -OpenPype support publishing, loading and using of VRay Proxy in look management. Their underlying format -can be either vrmesh or alembic. - -:::warning vrmesh or alembic and look management -Be aware that **vrmesh** cannot be used with looks as it doesn't retain IDs necessary to map shaders to geometry. -::: - -### Creating VRay Proxy - -To create VRay Proxy, select geometry you want and - **OpenPype โ†’ Create ...** select **VRay Proxy**. Name your -subset as you want and press **Create** button. - -This will create `vrayproxy` set for your subset. You can set some options in Attribute editor, mainly if you want -export animation instead of single frame. - -![Maya - VRay Proxy Creation](assets/maya-vray_proxy.jpg) - -### Publishing VRay Proxies - -VRay Proxy can be published - **OpenPype โ†’ Publish ...**. It will publish data as VRays `vrmesh` format and as -Alembic file. - -## Using VRay Proxies - -You can load VRay Proxy using loader - **OpenPype โ†’ Loader ...** - -![Maya - VRay Proxy Creation](assets/maya-vray_proxy-loader.jpg) - -Select your subset and right-click. Select **Import VRay Proxy (vrmesh)** to import it. - -:::note -Note that even if it states `vrmesh` in descriptions, if loader finds Alembic published along (default behavior) it will -use abc file instead of vrmesh as it is more flexible and without it looks doesn't work. -::: diff --git a/website/docs/artist_hosts_maya_xgen.md b/website/docs/artist_hosts_maya_xgen.md deleted file mode 100644 index db7bbd0557..0000000000 --- a/website/docs/artist_hosts_maya_xgen.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -id: artist_hosts_maya_xgen -title: Xgen for Maya -sidebar_label: Xgen ---- - -OpenPype supports Xgen classic with the follow workflow. It eases the otherwise cumbersome issues around Xgen's side car files and hidden behaviour inside Maya. The workflow supports publishing, loading and updating of Xgen collections, along with connecting animation from geometry and (guide) curves. - -## Setup - -### Settings - -Go to project settings > `Maya` > enable `Open Workfile Post Initialization`; - -`project_settings/maya/open_workfile_post_initialization` - -This is due to two errors occurring when opening workfile containing referenced xgen nodes on launch of Maya, specifically: - -- ``Critical``: Duplicate collection errors on launching workfile. This is because Maya first imports Xgen when referencing in external Maya files, then imports Xgen again when the reference edits are applied. -``` -Importing XGen Collections... -# Error: XGen: Failed to find description ball_xgenMain_01_:parent in collection ball_xgenMain_01_:collection. Abort applying delta: P:/PROJECTS/OP01_CG_demo/shots/sh040/work/Lighting/cg_sh040_Lighting_v001__ball_xgenMain_01___collection.xgen # -# Error: XGen: Tried to import a duplicate collection, ball_xgenMain_02_:collection, from file P:/PROJECTS/OP01_CG_demo/shots/sh040/work/Lighting/cg_sh040_Lighting_v001__ball_xgenMain_02___collection.xgen. Aborting import. # -``` -- ``Non-critical``: Errors on opening workfile and failed opening of published xgen. This is because Maya imports Xgen when referencing in external Maya files but the reference edits that ensure the location of the Xgen files are correct, has not been applied yet. -``` -Importing XGen Collections... -# Error: XGen: Failed to open file: P:/PROJECTS/OP01_CG_demo/shots/sh040/work/Lighting/cg_ball_xgenMain_v035__ball_rigMain_01___collection.xgen # -# Error: XGen: Failed to import collection from file P:/PROJECTS/OP01_CG_demo/shots/sh040/work/Lighting/cg_ball_xgenMain_v035__ball_rigMain_01___collection.xgen # -``` - -Go to project settings > `Deadline` > `Publish plugins` > `Maya Submit to Deadline` > disable `Use Published scene`; - -`project_settings/deadline/publish/MayaSubmitDeadline/use_published` - -This is due to temporary workaround while fixing rendering with published scenes. - -## Create - -Create an Xgen instance to publish. This needs to contain only **one Xgen collection**. - -`OpenPype > Create... > Xgen` - -You can create multiple Xgen instances if you have multiple collections to publish. - -:::note -The Xgen publishing requires a namespace on the Xgen collection (palette) and the geometry used. -::: - -### Publish - -The publishing process will grab geometry used for Xgen along with any external files used in the collection's descriptions. This creates an isolated Maya file with just the Xgen collection's dependencies, so you can use any nested geometry when creating the Xgen description. An Xgen version will consist of: - -- Maya file (`.ma`) - this contains the geometry and the connections to the Xgen collection and descriptions. -- Xgen file (`.xgen`) - this contains the Xgen collection and description. -- Resource files (`.ptx`, `.xuv`) - this contains Xgen side car files used in the collection and descriptions. - -## Load - -Open the Loader tool, `OpenPype > Loader...`, and navigate to the published Xgen version. On right-click you'll get the option `Reference Xgen (ma)` -When loading an Xgen version the following happens: - -- References in the Maya file. -- Copies the Xgen file (`.xgen`) to the current workspace. -- Modifies the Xgen file copy to load the current workspace first then the published Xgen collection. -- Makes a custom attribute on the Xgen collection, `float_ignore`, which can be seen under the `Expressions` tab of the `Xgen` UI. This is done to initialize the Xgen delta file workflow. -- Setup an Xgen delta file (`.xgd`) to store any workspace changes of the published Xgen version. - -When the loading is done, Xgen collection will be in the Xgen delta file workflow which means any changes done in the Maya workfile will be stored in the current workspace. The published Xgen collection will remain intact, even if the user assigns maps to any attributes or otherwise modifies any attribute. - -### Updating - -When there are changes to the Xgen version, the user will be notified when opening the workfile or publishing. Since the Xgen is referenced, it follows the standard Maya referencing system and overrides. - -For example publishing `xgenMain` version 1 with the attribute `renderer` set to `None`, then version 2 has `renderer` set to `Arnold Renderer`. When updating from version 1 to 2, the `renderer` attribute will be updated to `Arnold Renderer` unless there is a local override. - -### Connect Patches - -When loading in an Xgen version, it does not have any connections to anything in the workfile, so its static in the position it was published in. Use the [Connect Geometry](artist_hosts_maya#connect-geometry) action to connect Xgen to any matching loaded animated geometry. - -### Connect Guides - -Along with patches you can also connect the Xgen guides to an Alembic cache. - -#### Usage - -Select 1 animation container, of family `animation` or `pointcache`, then the Xgen containers to connect to. Right-click > `Actions` > `Connect Xgen`. - -***Note: Only alembic (`.abc`) representations are allowed.*** - -#### Details - -Connecting the guide will make Xgen use the Alembic directly, setting the attributes under `Guide Animation`, so the Alembic needs to contain the same amount of curves as guides in the Xgen. - -The animation container gets connected with the Xgen container, so if the animation container is updated so will the Xgen container's attribute. - -## Rendering - -To render with Xgen, follow the [Rendering With OpenPype](artist_hosts_maya#rendering-with-openpype) guide. - -### Details - -When submitting a workfile with Xgen, all Xgen related files will be collected and published as the workfiles resources. This means the published workfile is no longer referencing the workspace Xgen files. diff --git a/website/docs/artist_hosts_maya_yeti.md b/website/docs/artist_hosts_maya_yeti.md deleted file mode 100644 index aa783cc8b6..0000000000 --- a/website/docs/artist_hosts_maya_yeti.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -id: artist_hosts_maya_yeti -title: Yeti for Maya -sidebar_label: Yeti ---- - -## Working with Yeti in OpenPype - -OpenPype can work with [Yeti](https://peregrinelabs.com/yeti/) in two data modes. -It can handle Yeti caches and Yeti rigs. - -## Yeti Caches - -### Creating and publishing - -Let start by creating simple Yeti setup, just one object and Yeti node. Open new -empty scene in Maya and create sphere. Then select sphere and go **Yeti โ†’ Create Yeti Node on Mesh** -Open Yeti node graph **Yeti โ†’ Open Graph Editor** and create setup like this: - -![Maya - Yeti Basic Graph](assets/maya-yeti_basic_setup.jpg) - -It doesn't matter what setting you use now, just select proper shape in first -*Import* node. Select your Yeti node and create *Yeti Cache instance* - **OpenPype โ†’ Create...** -and select **Yeti Cache**. Leave `Use selection` checked. You should end up with this setup: - -![Maya - Yeti Basic Setup](assets/maya-yeti_basic_setup_outline.jpg) - -You can see there is `yeticacheDefault` set. Instead of *Default* it could be named with -whatever name you've entered in `subset` field during instance creation. - -We are almost ready for publishing cache. You can check basic settings by selecting -Yeti cache set and opening *Extra attributes* in Maya **Attribute Editor**. - -![Maya - Yeti Basic Setup](assets/maya-yeti_cache_attributes.jpg) - -Those attributes there are self-explanatory, but: - -- `Preroll` is number of frames simulation will run before cache frames are stored. -This is useful to "steady" simulation for example. -- `Frame Start` from what frame we start to store cache files -- `Frame End` to what frame we are storing cache files -- `Fps` of cache -- `Samples` how many time samples we take during caching - -You can now publish Yeti cache as any other types. **OpenPype โ†’ Publish**. It will -create sequence of `.fur` files and `.fursettings` metadata file with Yeti node -setting. - -:::note Collect Yeti Cache failure -If you encounter **Collect Yeti Cache** failure during collecting phase, and the error is like -```fix -No object matches name: pgYetiMaya1Shape.cbId -``` -then it is probably caused by scene not being saved before publishing. -::: - -### Loading - -You can load Yeti cache by **OpenPype โ†’ Load ...**. Select your cache, right+click on -it and select **Load Yeti cache**. This will create Yeti node in scene and set its -cache path to point to your published cache files. Note that this Yeti node will -be named with same name as the one you've used to publish cache. Also notice that -when you open graph on this Yeti node, all nodes are as they were in publishing node. - -## Yeti Rigs - -### Creating and publishing - -Yeti Rigs are designed to connect to published models or animation rig. The workflow gives the Yeti Rig full control on that geometry to do additional things on top of whatever input comes in, e.g. deleting faces, pushing faces in/out, subdividing, etc. - -Let's start with a [model](artist_hosts_maya.md#loading-model) or [rig](artist_hosts_maya.md#loading-rigs) loaded into the scene. Here we are using a simple rig. - -![Maya - Yeti Simple Rig](assets/maya-yeti_simple_rig.png) - -We'll need to prepare the scene a bit. We want some Yeti hair on the ball geometry, so duplicating the geometry, adding the Yeti hair and grouping it together. - -![Maya - Yeti Hair Setup](assets/maya-yeti_hair_setup.png) - -:::note yeti nodes and types -You can use any number of Yeti nodes and types, but they have to have unique names. -::: - -Now we need to connect the Yeti Rig with the animation rig. Yeti Rigs work by publishing the attribute connections from its input nodes and reconnect them later in the pipeline. This means we can only use attribute connections to from outside of the Yeti Rig hierarchy. Internal to the Yeti Rig hierarchy, we can use any complexity of node connections. We'll connnect the Yeti Rig geometry to the animation rig, with the transform and mesh attributes. - -![Maya - Yeti Rig Setup](assets/maya-yeti_rig_setup.png) - -Now we are ready for publishing. Select the Yeti Rig group (`rig_GRP`) and -create *Yeti Rig instance* - **OpenPype โ†’ Create...** and select **Yeti Rig**. -Leave `Use selection` checked. - -Last step is to add our geometry to the rig instance, so middle+drag its -geometry to `input_SET` under the `yetiRigMain` set representing rig instance. -Note that its name can differ and is based on your subset name. - -![Maya - Yeti Publish Setup](assets/maya-yeti_publish_setup.png) - -You can have any number of nodes in the Yeti Rig, but only nodes with incoming attribute connections from outside of the Yeti Rig hierarchy is needed in the `input_SET`. - -Save your scene and ready for publishing our new simple Yeti Rig! - -Go to publish **OpenPype โ†’ Publish** and run. This will publish rig with its geometry -as `.ma` scene, save Yeti node settings and export one frame of Yeti cache from -the beginning of your timeline. It will also collect all textures used in Yeti -node, copy them to publish folder `resource` directory and set *Image search path* -of published node to this location. - -### Loading - -You can load published Yeti Rigs in OpenPype with **OpenPype โ†’ Load ...**, -select you Yeti rig and right+click on it. In context menu you should see -**Load Yeti Rig** item (among others). - -To connect the Yeti Rig with published animation, we'll load in the animation and use the Inventory to establish the connections. - -![Maya - Yeti Publish Setup](assets/maya-yeti_load_connections.png) - -The Yeti Rig should now be following the animation. :tada: diff --git a/website/docs/artist_hosts_nuke_tut.md b/website/docs/artist_hosts_nuke_tut.md deleted file mode 100644 index c3f01e042a..0000000000 --- a/website/docs/artist_hosts_nuke_tut.md +++ /dev/null @@ -1,363 +0,0 @@ ---- -id: artist_hosts_nuke_tut -title: Nuke -sidebar_label: Nuke ---- - -:::note -OpenPype supports Nuke version **`11.0`** and above. -::: - -## OpenPype global tools - -- [Set Context](artist_tools_context_manager) -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) -- [Library Loader](artist_tools_library_loader) - -## Nuke specific tools - -
-
- -### Set Frame Ranges - -Use this feature in case you are not sure the frame range is correct. - -##### Result - -- setting Frame Range in script settings -- setting Frame Range in viewers (timeline) - -
-
- -![Set Frame Ranges](assets/nuke_setFrameRanges.png) - -
-
- - -
- -![Set Frame Ranges Timeline](assets/nuke_setFrameRanges_timeline.png) - -
- -1. limiting to Frame Range without handles -2. **Input** handle on start -3. **Output** handle on end - -
-
- -### Set Resolution - -
-
- - -This menu item will set correct resolution format for you defined by your production. - -##### Result - -- creates new item in formats with project name -- sets the new format as used - -
-
- -![Set Resolution](assets/nuke_setResolution.png) - -
-
- - -### Set Colorspace - -
-
- -This menu item will set correct Colorspace definitions for you. All has to be configured by your production (Project coordinator). - -##### Result - -- set Colorspace in your script settings -- set preview LUT to your viewers -- set correct colorspace to all discovered Read nodes (following expression set in settings) - -See [Nuke Color Management](artist_hosts_nuke_tut.md#nuke-color-management) - -
-
- -![Set Colorspace](assets/nuke_setColorspace.png) - -
-
- - -### Apply All Settings - -
-
- -It is usually enough if you once per while use this option just to make yourself sure the workfile is having set correct properties. - -##### Result - -- set Frame Ranges -- set Colorspace -- set Resolution - -
-
- -![Apply All Settings](assets/nuke_applyAllSettings.png) - -
-
- -### Build Workfile - -
-
- -This tool will append all available subsets into an actual node graph. It will look into database and get all last [versions](artist_concepts.md#version) of available [subsets](artist_concepts.md#subset). - - -##### Result - -- adds all last versions of subsets (rendered image sequences) as read nodes -- ~~adds publishable write node as `renderMain` subset~~ - -
-
- -![Build First Work File](assets/nuke_buildFirstWorkfile.png) - -
-
- -## Nuke QuickStart - -This QuickStart is short introduction to what OpenPype can do for you. It attempts to make an overview for compositing artists, and simplifies processes that are better described in specific parts of the documentation. - - - -### Launch Nuke - Shot and Task Context -OpenPype has to know what shot and task you are working on. You need to run Nuke in context of the task, using Ftrack Action or OpenPype Launcher to select the task and run Nuke. - -![Run Nuke From Ftrack](assets/nuke_tut/nuke_RunNukeFtrackAction_p3.png) -![Run Nuke From Launcher](assets/nuke_tut/nuke_RunNukeLauncher_p2.png) - -:::tip Admin Tip - Nuke version -You can [configure](admin_settings_project_anatomy.md#Attributes) which DCC version(s) will be available for current project in **Studio Settings โ†’ Project โ†’ Anatomy โ†’ Attributes โ†’ Applications** -::: - -### Nuke Initial setup -Nuke OpenPype menu shows the current context - -![Context](assets/nuke_tut/nuke_Context.png) - -Launching Nuke with context stops your timer, and starts the clock on the shot and task you picked. - -Openpype makes initial setup for your Nuke script. It is the same as running [Apply All Settings](artist_hosts_nuke_tut.md#apply-all-settings) from the OpenPype menu. - -- Reads frame range and resolution from Avalon database, sets it in Nuke Project Settings, -Creates Viewer node, sets itโ€™s range and indicates handles by In and Out points. - -- Reads Color settings from the project configuration, and sets it in Nuke Project Settings and Viewer. - -- Sets project directory in the Nuke Project Settings to the Nuke Script Directory - -:::tip Tip - Project Settings -After Nuke starts it will automatically **Apply All Settings** for you. If you are sure the settings are wrong just contact your supervisor and he will set them correctly for you in project database. -::: - -### Save Nuke script โ€“ the Work File -Use OpenPype - Work files menu to create a new Nuke script. Openpype offers you the preconfigured naming. -![Context](assets/nuke_tut/nuke_WorkFileSaveAs.png) - -The Next Available Version checks the work folder for already used versions and offers the lowest unused version number automatically. - -Subversion can be used to distinguish or name versions. For example used to add shortened artist name. - -More about [workfiles](artist_tools_workfiles). - - -:::tip Admin Tips -- **Workfile Naming** - - - The [workfile naming](admin_settings_project_anatomy.md#templates) is configured in anatomy, see **Studio Settings โ†’ Project โ†’ Anatomy โ†’ Templates โ†’ Work** - -- **Open Workfile** - - - You can [configure](project_settings/settings_project_nuke.md#create-first-workfile) Nuke to automatically open the last version, or create a file on startup. See **Studio Settings โ†’ Project โ†’ Global โ†’ Tools โ†’ Workfiles** - -- **Nuke Color Settings** - - - [Color setting](project_settings/settings_project_nuke.md) for Nuke can be found in **Studio Settings โ†’ Project โ†’ Anatomy โ†’ Color Management and Output Formats โ†’ Nuke** -::: - -### Load plate -Use Load from OpenPype menu to load any plates or renders available. - -![Asset Load](assets/nuke_tut/nuke_AssetLoader.png) - -Pick the plate asset, right click and choose Load Image Sequence to create a Read node in Nuke. - -Note that the Read node created by OpenPype is green. Green color indicates the highest version of asset is loaded. Asset versions could be easily changed by [Manage](#managing-versions). Lower versions will be highlighted by orange color on the read node. - -![Asset Load](assets/nuke_tut/nuke_AssetLoadOutOfDate.png) - -More about [Asset loader](artist_tools_loader). - -### Create Write Node -To create OpenPype managed Write node, select the Read node you just created, from OpenPype menu, pick Create. -In the Instance Creator, pick Create Write Render, and Create. - -![OpenPype Create](assets/nuke_tut/nuke_Creator.png) - -This will create a Group with a Write node inside. - -![OpenPype Create](assets/nuke_tut/nuke_WriteNodeCreated.png) - -:::tip Admin Tip - Configuring write node -You can configure write node parameters in **Studio Settings โ†’ Project โ†’ Anatomy โ†’ Color Management and Output Formats โ†’ Nuke โ†’ Nodes** -::: - -### Create Prerender Node -Creating Prerender is very similar to creating OpenPype managed Write node. - - - -#### What Nuke Publish Does -From Artist perspective, Nuke publish gathers all the stuff found in the Nuke script with Publish checkbox set to on, exports stuff and raises the Nuke script (workfile) version. - -The Pyblish dialog shows the progress of the process. - -The left column of the dialog shows what will be published. Typically it is one or more renders or prerenders, plus work file. - -![OpenPype Publish](assets/nuke_tut/nuke_PyblishDialogNuke.png) - -The right column shows the publish steps - -##### Publish steps -1. Gathers all the stuff found in the Nuke script with Publish checkbox set to on -2. Collects all the info (from the script, databaseโ€ฆ) -3. Validates components to be published (checks render range and resolution...) -4. Extracts data from the script - - generates thumbnail - - creates review(s) like h264 - - adds burnins to review(s) - - Copies and renames components like render(s), review(s), Nuke script... to publish folder -5. Integrates components (writes to database, sends preview of the render to Ftrack ... -6. Increments Nuke script version, cleans up the render directory - -Gathering all the info and validating usually takes just a few seconds. Creating reviews for long, high resolution shots can however take significant amount of time when publishing locally. - -##### Pyblish Note and Intent -![Note and Intent](assets/nuke_tut/nuke_PyblishDialogNukeNoteIntent.png) - -Artist can add Note and Intent before firing the publish button. The Note and Intent is meant for easy communication between artist and supervisor. After publish, Note and Intent can be seen in Ftrack notes. - -##### Pyblish Checkbox - -![Note and Intent](assets/nuke_tut/nuke_PyblishCheckBox.png) - -Pyblish Dialog tries to pack a lot of info in a small area. One of the more tricky parts is that it uses non-standard checkboxes. Some squares can be turned on and off by the artist, some are mandatory. - -If you run the publish and decide to not publish the Nuke script, you can turn it off right in the Pyblish dialog by clicking on the checkbox. If you decide to render and publish the shot in lower resolution to speed up the turnaround, you have to turn off the Write Resolution validator. If you want to use an older version of the asset (older version of the plate...), you have to turn off the Validate containers, and so on. - -More info about [Using Pyblish](artist_tools_publisher) - -:::tip Admin Tip - Configuring validators -You can configure Nuke validators like Output Resolution in **Studio Settings โ†’ Project โ†’ Nuke โ†’ Publish plugins** -::: - -### Review -![Write Node Review](assets/nuke_tut/nuke_WriteNodeReview.png) - -When you turn the review checkbox on in your OpenPype write node, here is what happens: -- OpenPype uses the current Nuke script to - - Load the render - - Optionally apply LUT - - Render Prores 4444 with the same resolution as your render -- Use Ffmpeg to convert the Prores to whatever review(s) you defined -- Use Ffmpeg to add (optional) burnin to the review(s) from previous step - -Creating reviews is a part of the publishing process. If you choose to do a local publish or to use existing frames, review will be processed also on the artist's machine. -If you choose to publish on the farm, you will render and do reviews on the farm. - -So far there is no option for using existing frames (from your local / check render) and just do the review on the farm. - -More info about [configuring reviews](pype2/admin_presets_plugins.md#extractreview). - -:::tip Admin Tip - Configuring Reviews -You can configure reviewsin **Studio Settings โ†’ Project โ†’ Global โ†’ Publish plugins โ†’ ExtractReview / ExtractBurnin** -Reviews can be configured separately for each host, task, or family. For example Maya can produce different review to Nuke, animation task can have different burnin then modelling, and plate can have different review then model. -::: - -### Render and Publish - -![OpenPype Create](assets/nuke_tut/nuke_WriteNode.png) - -Letโ€™s say you want to render and publish the shot right now, with only a Read and Write node. You need to decide if you want to render, check the render and then publish it, or you want to execute the render and publish in one go. - -If you wish to check your render before publishing, you can use your local machine or your farm to render the write node as you would do without OpenPype, load and check your render (OpenPype Write has a convenience button for that), and if happy, use publish with Use existing frames option selected in the write node to generate the review on your local machine. - -If you want to render and publish on the farm in one go, run publish with On farm option selected in the write node to render and make the review on farm. - -![Versionless](assets/nuke_tut/nuke_RenderLocalFarm.png) - -### Version-less Render - -![Versionless](assets/nuke_tut/nuke_versionless.png) - -OpenPype is configured so your render file names have no version number until the render is fully finished and published. The main advantage is that you can keep the render from the previous version and re-render only part of the shot. With care, this is handy. - -Main disadvantage of this approach is that you can render only one version of your shot at one time. Otherwise you risk to partially overwrite your shot render before publishing copies and renames the rendered files to the properly versioned publish folder. - -When making quick farm publishes, like making two versions with different color correction, care must be taken to let the first job (first version) completely finish before the second version starts rendering. - - - -### Managing Versions - -![Versionless](assets/nuke_tut/nuke_ManageVersion.png) - -OpenPype checks all the assets loaded to Nuke on script open. All out of date assets are colored orange, up to date assets are colored green. - -Use Manage to switch versions for loaded assets. - -### Loading Effects -This video show how to publish effect from Hiero / Nuke Studio, and use the effect in Nuke. - - - - - -### Nuke Color Management - - - -## Troubleshooting - -### Fixing Validate Containers - -If your Pyblish dialog fails on Validate Containers, you might have an old asset loaded. Use OpenPype - Manage... to switch the asset(s) to the latest version. - -![Versionless](assets/nuke_tut/nuke_ValidateContainers.png) - - - -### Fixing Validate Version -If your Pyblish dialog fails on Validate Version, you might be trying to publish already published version. Rise your version in the OpenPype WorkFiles SaveAs. - -Or maybe you accidentally copied write node from different shot to your current one. Check the write publishes on the left side of the Pyblish dialog. Typically you publish only one write. Locate and delete the stray write from other shot. - - diff --git a/website/docs/artist_hosts_photoshop.md b/website/docs/artist_hosts_photoshop.md deleted file mode 100644 index 12203a5c6e..0000000000 --- a/website/docs/artist_hosts_photoshop.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -id: artist_hosts_photoshop -title: Photoshop -sidebar_label: Photoshop ---- - -## Available Tools - -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Publish](artist_tools_publisher) -- [Manage](artist_tools_inventory) - -## Setup - -To install the extension, download, install [Anastasyi's Extension Manager](https://install.anastasiy.com/). Open Anastasyi's Extension Manager and select Photoshop in menu. Then go to `{path to pype}hosts/photoshop/api/extension.zxp`. Drag extension.zxp and drop it to Anastasyi's Extension Manager. The extension will install itself. - -## Usage - -When you launch Photoshop you will be met with the Workfiles app. If dont have any previous workfiles, you can just close this window. - -In Photoshop you can find the tools in the `OpenPype` extension: - -![Extension](assets/photoshop_extension.png) - -You can show the extension panel by going to `Window` > `Extensions` > `OpenPype`. - -### Publish - -When you are ready to share some work, you will need to publish. This is done by opening the `Publisher` through the `Publish...` button. - -![Publish](assets/photoshop_publish.png) - -There is always instance for workfile created automatically (see 'workfileArt' item in `Subsets to publish` column.) This allows to publish (and therefore backup) -workfile which is used to produce another publishable elements (as `image` and `review` items). - -#### Create - -Main publishable item in Photoshop will be of `image` family. Result of this item (instance) is picture that could be loaded and used in another DCCs (for example as -single layer in composition in AfterEffects, reference in Maya etc). - -There are couple of options what to publish: -- separate image per layer (or group of layers) -- all visible layers (groups) flattened into single image - -In most cases you would like to keep `Create only for selected` toggled on and select what you would like to publish. Toggling this off -will allow you to create instance(s) for all visible layers without a need to select them explicitly. - -For separate layers option keep `Create separate instance for each selected` toggled, select multiple layers and hit `Create >>>` button in the middle column. - -This will result in: - -![Image instances creates](assets/photoshop_publish_images.png) - -(In Photoshop's `Layers` tab standard layers will be wrapped into group and enriched with โ„— symbol to denote publishable instance. With `Create separate instance for each selected` toggled off -it will create only single publishable instance which will wrap all visible layers.) - -Name of publishable instance (eg. subset name) could be configured with a template in `project_settings/global/tools/creator/subset_name_profiles`. -(This must be configured by admin who has access to Openpype Settings.) - -Trash icon under the list of instances allows to delete any selected `image` instance. - -Workfile instance will be automatically recreated though. If you do not want to publish it, use pill toggle on the instance item. - -If you would like to modify publishable instance, click on `Publish` tab at the top. This would allow you to change name of publishable -instances, disable them from publishing, change their task etc. - -Publisher allows publishing into different context, just click on any instance, update `Variant`, `Asset` or `Task` in the form in the middle and don't forget to click on the 'Confirm' button. - -#### Validate - -If you would like to run validation rules set by your Studio, click on funnel icon at the bottom right. This will run through all -enabled instances, you could see more information after clicking on `Details` tab. - -![Image instances creates](assets/photoshop_publish_validations.png) - -In this dialog you could see publishable instances in left column, triggered plugins in the middle and logs in the right column. - -In left column you could see that `review` instance was created automatically. This instance flattens all publishable instances or -all visible layers if no publishable instances were created into single image which could serve as a single reviewable element (for example in Ftrack). - -Creation of Review could be disabled in `project_settings/photoshop/publish/CollectReview`. - -If you are satisfied with results of validation phase (and there are no errors there), you might hit `Publish` button at bottom right. -This will run through extraction phase (it physically creates images from `image` instances, creates `review` etc) and publishes them -(eg. stores files into their final destination and stores metadata about them into DB). -This part might take a while depending on amount of layers in the workfile, amount of available memory and performance of your machine. - -You may encounter issues with publishing which will be indicated with red squares. If these issues are within the validation section, then you can fix the issue. If there are issues outside of validation section, please let the OpenPype team know. - -You can always start new publish run with a circle arrow button at the bottom right. You might also want to move between phases (Create, Update etc) -by clicking on available tabs at the top of the dialog. - -#### Simplified publish - -There is a simplified workflow for simple use case where only single image should be created containing all visible layers. -No image instances must be present in a workfile and `project_settings/photoshop/publish/CollectInstances/flatten_subset_template` must be filled in Settings. -Then artists just need to hit 'Publish' button in menu. - -#### Repair Validation Issues - -If there is some issue in validator phase, you will receive something like this: - -![Validation error](assets/photoshop_publish_failed.png) - -All validators will give some description about what the issue is. You can inspect this by clicking on items in the left column. - -If there is an option of automatic repair, there will be `Repair` button on the right. In other case you need to fix the issue manually. -(By deleting and recreating instance etc.) - -#### Buttons on the bottom right are for: -- `Refresh publishing` - set publishing process to starting position - useful if previous publish failed, or you changed configuration of a publish -- `Stop/pause publishing` - if you would like to pause publishing process at any time -- `Validate` - if you would like to run only collecting and validating phases (nothing will be published yet) -- `Publish` - standard way how to kick off full publishing process - -### Load - -When you want to load existing published work, you can load in smart layers through the `Loader`. You can reach the `Loader` through the extension's `Load` button. - -![Loader](assets/photoshop_loader.png) - -The supported families for Photoshop are: - -- `image` - -To load an image, right-click on the subset you want and choose a representation: - -![Loader](assets/photoshop_loader_load.gif) - -### Manage - -Now that we have some images loaded, we can manage which version is loaded. This is done through the `Scene Inventory`. You can reach it through the extension's `Manage` button. - -:::note -Loaded images has to stay as smart layers in order to be updated. If you rasterize the layer, you cannot update it to a different version. -::: - -![Loader](assets/photoshop_manage.png) - -You can switch to a previous version of the image or update to the latest. - -![Loader](assets/photoshop_manage_switch.gif) -![Loader](assets/photoshop_manage_update.gif) - - -#### Support help -If you would like to ask for help admin or support, you could use any of the three options on the `Note` button on bottom left: -- `Go to details` - switches into a more detailed list of published instances and plugins. -- `Copy report` - stash full publishing log to a clipboard -- `Export report` - save log into a file for sending it via mail or any communication tool - -If you are able to fix the workfile yourself, use the first button on the right to set the UI to initial state before publish. (Click the `Publish` button to start again.) - -#### Legacy instances - -All screenshots from Publish are from updated dialog, before publishing was being done by regular `Pyblish` tool. -New publishing process should be backward compatible, eg. if you have a workfile with instances created in the previous publishing approach, they will be translated automatically and -could be used right away. - -If you hit on unexpected behaviour with old instances, contact support first, then you could try to delete and recreate instances from scratch. -Nuclear option is to purge workfile metadata in `File > File Info > Origin > Headline`. This is only for most determined daredevils though! diff --git a/website/docs/artist_hosts_resolve.md b/website/docs/artist_hosts_resolve.md deleted file mode 100644 index bb183455db..0000000000 --- a/website/docs/artist_hosts_resolve.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -id: artist_hosts_resolve -title: DaVinci Resolve -sidebar_label: DaVinci Resolve ---- - - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -:::warning -Before you are able to start with OpenPype tools in DaVinci Resolve, installation of its own Python 3.6 interpreter and PySide 2 has to be done. Go to [Installation of python and pyside](admin_hosts_resolve.md#installation-of-python-and-pyside) link for more information -::: - - - -## OpenPype global tools - -- [Work Files](artist_tools_workfiles) -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) - - -
- -## Creating Shots from timeline items - -Before a clip can be published with [Publisher](artist_tools_publisher) timeline item has to be marked with OpenPype metadata markers. This way it is converted to a publishable subset. - -Lets do it step by step. - -
- - -
- -### Color clips before opening Create menu - - -Timeline video clips should be colored to `Chocolate` color for OpenPype to se it as selected for subset creation. - - -
- -![Create menu](assets/resolve_select_clips_timeline_chocolate.png) - -
-
- - -### Rename timeline track names - -
- - -
- -To be able to work with dynamic subset name, which is based on track names it is recommended to rename those tracks to what type of plates their clips represent. Commonly used ones are `main`, `review`, `fg01`, `fg02`, `bg`, `bg01`, etc. It is completely up to you but we recommend to always have at least `main` plate. For example if a clip is on track **element** and subset family is set to **plate** then the resulting subset name will be **plateElement** - -

-
- -
- -![Create menu](assets/resolve_creator_subset_name.png) -The name of the resulting *subset* can be seen in the **OpenPypeData** marker. -



-
- -
- -![Create menu](assets/resolve_remame_track_names.png) -Simple track setup where we are only using `main` and `review` track names. - -
-
- -![Create menu](assets/resolve_create_vertical_rename_timeline.png) -An example of used track names. The yellow frame is highlighting vertically aligned clips - which are going to be renamed and grouped together under one asset (shot) name. The concept of vertical renaming will be explained later in [Vertical Synchronization of Subset Attributes](#vertical-synchronization-of-subset-attributes). - -
-
- - -### Create menu... - -
-
- -After all clips which are intended to be converted to publishable instances are colored to `Chocolate` color, you can open OpenPype menu. - -
-
- -![Create menu](assets/resolve_menu_openpype.png) - -
- -
- -
-
- -After the menu widget is opened (it can take while so be patient please :). - -Hit `Create ...` and then set **Use selection** to active and select the family to **Create Publishable Clips**. - -The Subset name can stay as it is, it is not going to be used because each clip will generate it's own name. - -
-
- -![Create menu](assets/resolve_create_clips.png) - -
-
- -
-
- -The new windows that opens, let's you define various attributes for your future subsets and shots. - -Set Rename clips to active if you wish to use different names of shots in pipeline then the original clip names conformed from EDL/XML. - -**Count sequence from** - Start of the shot numbering if `#` is used in one of the keywords - -**Stepping number** - Sequential gaps in the numbering - -As you can see the in `{shot}` key within *Shot Template Keywords* section, you can use `#` symbol do define padding of the number in sequence and where it's going to be used. - -
-
- -![Create menu](assets/resolve_create_renaming_clips.png) - -
-
- -
-
- -Notice the relationship of following sections. Keys from **Shot Template Keywords** sections will be used for formatting of templates in **Shot Hierarchy And Rename Settings** section. - -**Shot parent hierarchy** will be forming parents of the asset (shot) *the hidden root for this is project folder*. So for example of this template we will get resulging string `shots/sq01` - -**Clip name template** in context of clip sitting on track name `main` in second position `mainsq01sh020`. This is due track key is hosting `{_track_}` which is inheriting name form timeline track name. Other allowed namespases are: -- `{_sequence_}`: timeline name -- `{_clip_}`: clip name -- `{_trackIndex_}`: position of track on timeline from bottom -- `{_clipIndex_}`: clip position on timeline from left - -
-
- -![Create menu](assets/resolve_create_template_filling.png) - -
-
- -### Vertical synchronization of subset attributes - -In case you are only working with two tracks on timeline where `main` track is going to be used as plates for compositors and `review` track holds mp4 clips for offlines and web preview. **Enable vertical sync** can be deactivated. - -In multiple tracks scenario - as mentioned [here](#rename-timeline-track-names) - it is recommended to activate **Enable vertical sync** and define the hero (driving) track to *main*. This will ensure that all of the clips on corresponding to the same shots will have the same publishing parameters. - -

- -
- -
- -![Create menu](assets/resolve_create_single_track_rename_hero_track.png) - -
- -
- -![Create menu](assets/resolve_create_vertical_rename_creator_ui.png) - -
-
- - -## Publishing Shots - -
-
- -Once all `Chocolate` colored clips have gone through the [creator](#rcreate-menu), have been colored to `Pink` color and a marker has been created for each of them, it means they have been successfully converted to publishable clips. Now we can run **Publisher** - it's button can be found in the OpenPype menu. - -

-
- -
-
- -![Create menu](assets/resolve_publish_instance_review_main.png) -Notice that the main track clips and review had been merged into one instance. And since it is main `hero` clip it is also holding all new shot metadata. For that reason it also create secon instance for each with `shot` family. This instance will create all shot hierarchy and pass frame range attributes to shot (asset). - -
-
- -
-
- -![Create menu](assets/resolve_publish_instance_other_plateSubsets.png) -Also notice how the subset name is formed form a *track* name and *subset family* from previous steps. - -Also important is to notice the asset name in *OpenPypeData* at marker - the name is the same for all **Vertically renamed** shots as they have been grouped together. Unfortunately Resolve is not allowing to rename the clips so the only way to know is to see it in marker's metadata. - -
-
- -
diff --git a/website/docs/artist_hosts_substancepainter.md b/website/docs/artist_hosts_substancepainter.md deleted file mode 100644 index 86bcbba82e..0000000000 --- a/website/docs/artist_hosts_substancepainter.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -id: artist_hosts_substancepainter -title: Substance Painter -sidebar_label: Substance Painter ---- - -## OpenPype global tools - -- [Work Files](artist_tools.md#workfiles) -- [Load](artist_tools.md#loader) -- [Manage (Inventory)](artist_tools.md#inventory) -- [Publish](artist_tools.md#publisher) -- [Library Loader](artist_tools.md#library-loader) - -## Working with OpenPype in Substance Painter - -The Substance Painter OpenPype integration allows you to: - -- Set the project mesh and easily keep it in sync with updates of the model -- Easily export your textures as versioned publishes for others to load and update. - -## Setting the project mesh - -Substance Painter requires a project file to have a mesh path configured. -As such, you can't start a workfile without choosing a mesh path. - -To start a new project using a published model you can _without an open project_ -use OpenPype > Load.. > Load Mesh on a supported publish. This will prompt you -with a New Project prompt preset to that particular mesh file. - -If you already have a project open, you can also replace (reload) your mesh -using the same Load Mesh functionality. - -After having the project mesh loaded or reloaded through the loader -tool the mesh will be _managed_ by OpenPype. For example, you'll be notified -on workfile open whether the mesh in your workfile is outdated. You can also -set it to specific version using OpenPype > Manage.. where you can right click -on the project mesh to perform _Set Version_ - -:::info -A Substance Painter project will always have only one mesh set. Whenever you -trigger _Load Mesh_ from the loader this will **replace** your currently loaded -mesh for your open project. -::: - -## Publishing textures - -To publish your textures we must first create a `textureSet` -publish instance. - -To create a **TextureSet instance** we will use OpenPype's publisher tool. Go -to **OpenPype โ†’ Publish... โ†’ TextureSet** - -The texture set instance will define what Substance Painter export template (`.spexp`) to -use and thus defines what texture maps will be exported from your workfile. This -can be set with the **Output Template** attribute on the instance. - -:::info -The TextureSet instance gets saved with your Substance Painter project. As such, -you will only need to configure this once for your workfile. Next time you can -just click **OpenPype โ†’ Publish...** and start publishing directly with the -same settings. -::: - -#### Publish per output map of the Substance Painter preset - -The Texture Set instance generates a publish per output map that is defined in -the Substance Painter's export preset. For example a publish from a default -PBR Metallic Roughness texture set results in six separate published subsets -(if all the channels exist in your file). - -![Substance Painter PBR Metallic Roughness Export Preset](assets/substancepainter_pbrmetallicroughness_export_preset.png) - -When publishing for example a texture set with variant **Main** six instances will -be published with the variants: -- Main.**BaseColor** -- Main.**Emissive** -- Main.**Height** -- Main.**Metallic** -- Main.**Normal** -- Main.**Roughness** - -The bold output map name for the publish is based on the string that is pulled -from the what is considered to be the static part of the filename templates in -the export preset. The tokens like `$mesh` and `(_$colorSpace)` are ignored. -So `$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)` becomes `BaseColor`. - -An example output for PBR Metallic Roughness would be: - -![Substance Painter PBR Metallic Roughness Publish Example in Loader](assets/substancepainter_pbrmetallicroughness_published.png) - -## Known issues - -#### Can't see the OpenPype menu? - -If you're unable to see the OpenPype top level menu in Substance Painter make -sure you have launched Substance Painter through OpenPype and that the OpenPype -Integration plug-in is loaded inside Substance Painter: **Python > openpype_plugin** - -#### Substance Painter + Steam - -Running the steam version of Substance Painter within OpenPype will require you -to close the Steam executable before launching Substance Painter through OpenPype. -Otherwise the Substance Painter process is launched using Steam's existing -environment and thus will not be able to pick up the pipeline integration. - -This appears to be a limitation of how Steam works. \ No newline at end of file diff --git a/website/docs/artist_hosts_tvpaint.md b/website/docs/artist_hosts_tvpaint.md deleted file mode 100644 index a8a6cee5f8..0000000000 --- a/website/docs/artist_hosts_tvpaint.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -id: artist_hosts_tvpaint -title: TVPaint -sidebar_label: TVPaint ---- - -- [Work Files](artist_tools_workfiles) -- [Load](artist_tools_loader) -- [Scene Inventory](artist_tools_inventory) -- [Publish](artist_tools_publisher) -- [Library](artist_tools_library) - - -## Setup -When you launch TVPaint with OpenPype for the very first time it is necessary to do some additional steps. Right after the TVPaint launching a few system windows will pop up. - -![permission](assets/tvp_permission.png) - -Choose `Replace the file in the destination`. Then another window shows up. - -![permission2](assets/tvp_permission2.png) - -Click on `Continue`. - -After opening TVPaint go to the menu bar: `Windows โ†’ Plugins โ†’ OpenPype`. - -![pypewindow](assets/tvp_hidden_window.gif) - -Another TVPaint window pop up. Please press `Yes`. This window will be presented in every single TVPaint launching. Unfortunately, there is no other way how to workaround it. - -![writefile](assets/tvp_write_file.png) - -Now OpenPype Tools menu is in your TVPaint work area. - -![openpypetools](assets/tvp_openpype_menu.png) - -You can start your work. - ---- - -## Usage -In TVPaint you can find the Tools in OpenPype menu extension. The OpenPype Tools menu should be available in your work area. However, sometimes it happens that the Tools menu is hidden. You can display the extension panel by going to `Windows -> Plugins -> OpenPype`. - -## Create & Publish -To be able to publish, you have to mark what should be published. The marking part is called **Create**. In TVPaint you can create and publish **[Reviews](#review)**, **[Workfile](#workfile)**, **[Render Layers](#render-layer)** and **[Render Passes](#render-pass)**. - -:::important -TVPaint integration tries to not guess what you want to publish from the scene. Therefore, you should tell what you want to publish. -::: - -![createlayer](assets/tvp_publisher.png) - -### Review -`Review` will render all visible layers and create a reviewable output. -- Is automatically created without any manual work. -- You can disable the created instance if you want to skip review. - -### Workfile -`Workfile` integrate the source TVPaint file during publishing. Publishing of workfile is useful for backups. -- Is automatically created without any manual work. -- You can disable the created instance if you want to skip review. - -### Render Layer - -
-
- -Render Layer bakes all the animation layers of one particular color group together. - -- In the **Create** tab, pick `Render Layer` -- Fill `variant`, type in the name that the final published RenderLayer should have according to the naming convention in your studio. *(L10, BG, Hero, etc.)* - - Color group will be renamed to the **variant** value -- Choose color group from combobox - - or select a layer of a particular color and set combobox to **<Use selection>** -- Hit `Create` button - -After creating a RenderLayer, choose any amount of animation layers that need to be rendered together and assign them the color group. - -You can change `variant` later in **Publish** tab. - -
-
- -![createlayer](assets/tvp_create_layer.png) - -
-
-
- -**How to mark TVPaint layer to a group** - -In the bottom left corner of your timeline, you will note a **Color group** button. - -![colorgroups](assets/tvp_color_groups.png) - -It allows you to choose a group by checking one of the colors of the color list. - -![colorgroups](assets/tvp_color_groups2.png) - -The timeline's animation layer can be marked by the color you pick from your Color group. Layers in the timeline with the same color are gathered into a group represents one render layer. - -![timeline](assets/tvp_timeline_color.png) - - -### Render Pass - -Render Passes are smaller individual elements of a [Render Layer](artist_hosts_tvpaint.md#render-layer). A `character` render layer might -consist of multiple render passes such as `Line`, `Color` and `Shadow`. - -Render Passes are specific because they have to belong to a particular Render Layer. You have to select to which Render Layer the pass belongs. Try to refresh if you don't see a specific Render Layer in the options. - -
-
- -When you want to create Render Pass -- choose one or several TVPaint layers. -- in the **Create** tab, pick `Render Pass`. -- fill the `variant` with desired name of pass, e.g. `Color`. -- select the Render Layer you want the Render Pass to belong to from the combobox. - - if you don't see new Render Layer try refresh first. -- Press `Create` - -After creating a Render Pass, selected the TVPaint layers that should be marked with color group of Render Layer. - -You can change `variant` or Render Layer later in **Publish** tab. - -
-
- -![createpass](assets/tvp_create_pass.png) - -
-
- -:::warning -You cannot change TVPaint layer name once you mark it as part of Render Pass. You would have to remove created Render Pass and create it again with new TVPaint layer name. -::: - -

- -In this example, OpenPype will render selected animation layers within the given color group. E.i. the layers *L020_colour_fx*, *L020_colour_mouth*, and *L020_colour_eye* will be rendered as one pass belonging to the yellow RenderLayer. - -![renderpass](assets/tvp_timeline_color2.png) - -Now that you have created the required instances, you can publish them. -- Fill the comment on the bottom of the window. -- Double check enabled instance and their context. -- Press `Publish`. -- Wait to finish. -- Once the `Publisher` turns turns green your renders have been published. - ---- - -## Load -When you want to load existing published work you can reach the `Loader` through the OpenPype Tools `Load` button. - -The supported families for TVPaint are: - -- `render` -- `image` -- `background` -- `plate` - -To load a family item, right-click on the subset you want and import their representations, switch among the versions, delete older versions, copy files, etc. - -![Loader](assets/tvp_loader.gif) - ---- - -## Scene Inventory -Scene Inventory shows you everything that you have loaded into your scene using OpenPype. You can reach it through the extension's `Scene Inventory` button. - -![sceneinventory](assets/tvp_scene_inventory.png) - -You can switch to a previous version of the file or update it to the latest or delete items. diff --git a/website/docs/artist_hosts_unreal.md b/website/docs/artist_hosts_unreal.md deleted file mode 100644 index d79e9c387c..0000000000 --- a/website/docs/artist_hosts_unreal.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -id: artist_hosts_unreal -title: Unreal -sidebar_label: Unreal ---- - -## Introduction - -OpenPype supports Unreal in similar ways as in other DCCs Yet there are few specific you need to be aware of. - -### Creating the Unreal project - -Selecting a task and opening it with Unreal will generate the Unreal project, if it hasn't been created before. -By default, OpenPype includes the plugin that will be built together with the project. - -Alternatively, the Environment variable `"OPENPYPE_UNREAL_PLUGIN"` can be set to the path of a compiled version of the plugin. -The version of the compiled plugin must match the version of Unreal with which the project is being created. - -:::note -Unreal version 5.0 onwards requires the following Environment variable: - -`"UE_PYTHONPATH": "{PYTHONPATH}"` -::: - -### Project naming - -Unreal doesn't support project names starting with non-alphabetic character. So names like `123_myProject` are -invalid. If OpenPype detects such name it automatically prepends letter **P** to make it valid name, so `123_myProject` will become `P123_myProject`. There is also soft-limit on project name length to be shorter then 20 characters. Longer names will issue warning in Unreal Editor that there might be possible side effects. - -## OpenPype global tools - -OpenPype global tools can be found in Unreal's toolbar and in the *Tools* main menu: - -![Unreal OpenPype Menu](assets/unreal_openpype_tools.png) - -- [Create](artist_tools_creator) -- [Load](artist_tools_loader) -- [Manage (Inventory)](artist_tools_inventory) -- [Publish](artist_tools_publisher) -- [Library Loader](artist_tools_library_loader) - -## Static Mesh - -### Loading - -To import Static Mesh model, just choose **OpenPype โ†’ Load ...** and select your mesh. Static meshes are transferred as FBX files as specified in [Unreal Engine 4 Static Mesh Pipeline](https://docs.unrealengine.com/en-US/Engine/Content/Importing/FBX/StaticMeshes/index.html). This action will create new folder with subset name (`unrealStaticMeshMain_CON` for example) and put all data into it. Inside, you can find: - -![Unreal Container Content](assets/unreal_container.jpg) - -In this case there is **lambert1**, material pulled from Maya when this static mesh was published, **antennaA_modelMain** is the geometry itself, **modelMain_v002_CON** is a *AssetContainer* type and is there to mark this directory as Avalon Container (to track changes) and to hold OpenPype metadata. - -### Publishing - -Publishing of Static Mesh works in similar ways. Select your mesh in *Content Browser* and **OpenPype โ†’ Create ...**. This will create folder named by subset you've chosen - for example **unrealStaticMeshDefault_INS**. It this folder is that mesh and *Avalon Publish Instance* asset marking this folder as publishable instance and holding important metadata on it. If you want to publish this instance, go **OpenPype โ†’ Publish ...** - -## Layout - -There are two different layout options in Unreal, depending on the type of project you are working on. -One only imports the layout, and saves it in a level. -The other uses [Master Sequences](https://docs.unrealengine.com/4.27/en-US/AnimatingObjects/Sequencer/Overview/TracksShot/) to track the whole level sequence hierarchy. -You can choose in the Project Settings if you want to generate the level sequences. - -![Unreal OP Settings Level Sequence](assets/unreal_setting_level_sequence.png) - -### Loading - -To load a layout, click on the OpenPype icon in Unrealโ€™s main taskbar, and select **Load**. - -![Unreal OP Tools Load](assets/unreal_openpype_tools_load.png) - -Select the task on the left, then right click on the layout asset and select **Load Layout**. - -![Unreal Layout Load](assets/unreal_load_layout.png) - -If you need to load multiple layouts, you can select more than one task on the left, and you can load them together. - -![Unreal Layout Load Batch](assets/unreal_load_layout_batch.png) - -### Navigating the project - -The layout will be imported in the directory `/Content/OpenPype`. The layout will be split into two subfolders: -- *Assets*, which will contain all the rigs and models contained in the layout; -- *Asset name* (in the following example, *episode 2*), a folder named as the **asset** of the current **task**. - -![Unreal Layout Loading Result](assets/unreal_layout_loading_result.png) - -If you chose to generate the level sequences, in the second folder you will find the master level for the task (usually an episode), the level sequence and the folders for all the scenes in the episodes. -Otherwise you will find the level generated for the loaded layout. - -#### Layout without level sequences - -In the layout folder, you will find the level with the imported layout and an object of *AssetContainer* type. The latter is there to mark this directory as Avalon Container (to track changes) and to hold OpenPype metadata. - -![Unreal Layout Loading No Sequence](assets/unreal_layout_loading_no_sequence.png) - -The layout level will and should contain only the data included in the layout. To add lighting, or other elements, like an environment, you have to create a master level, and add the layout level as a [streaming level](https://docs.unrealengine.com/5.0/en-US/level-streaming-in-unreal-engine/). - -Create the master level and open it. Then, open the *Levels* window (from the menu **Windows โ†’ Levels**). Click on **Levels โ†’ Add Existing** and select the layout level and the other levels you with to include in the scene. The following example shows a master level in which have been added a light level and the layout level. - -![Unreal Add Level](assets/unreal_add_level.png) -![Unreal Level List](assets/unreal_level_list_no_sequences.png) - -#### Layout with level sequences - -In the episode folder, you will find the master level for the episode, the master level sequence and the folders for all the scenes in the episodes. - -After opening the master level, open the *Levels* window (from the menu **Windows โ†’ Levels**), and you will see the list of the levels of each shot of the episode for which a layout has been loaded. - -![Unreal Level List](assets/unreal_level_list.png) - -If it has not been added already, you will need to add the environment to the level. Click on **Levels โ†’ Add Existing** and select the level with the environment (check with the studio where it is located). - -![Unreal Add Level](assets/unreal_add_level.png) - -After adding the environment level to the master level, you will need to set it as always loaded by right clicking it, and selecting **Change Streaming Method** and selecting **Always Loaded**. - -![Unreal Level Streaming Method](assets/unreal_level_streaming_method.png) - -### Update layouts - -To manage loaded layouts, click on the OpenPype icon in Unrealโ€™s main taskbar, and select **Manage**. - -![Unreal OP Tools Manage](assets/unreal_openpype_tools_manage.png) - -You will get a list of all the assets that have been loaded in the project. -The version number will be in red if it isnโ€™t the latest version. Right click on the element, and select Update if you need to update the layout. - -:::note -**DO NOT** update rigs or models imported with a layout. Update only the layout. -::: - -## Rendering - -:::note -The rendering requires a layout loaded with the option to create the level sequences **on**. -::: - -To render and publish an episode, a scene or a shot, you will need to create a publish instance. The publish instance for the rendering is based on one level sequence. That means that if you want to render the whole episode, you will need to create it for the level sequence of the episode, but if you want to render just one shot, you will need to create it for that shot. - -Navigate to the folder that contains the level sequence that you need to render. Select the level sequence, and then click on the OpenPype icon in Unrealโ€™s main taskbar, and select **Create**. - -![Unreal OP Tools Create](assets/unreal_openpype_tools_create.png) - -In the Instance Creator, select **Unreal - Render**, give it a name, and click **Create**. - -![Unreal OP Instance Creator](assets/unreal_create_render.png) - -The render instance will be created in `/Content/OpenPype/PublishInstances`. - -Select the instance you need to render, and then click on the OpenPype icon in Unrealโ€™s main taskbar, and select **Render**. You can render more than one instance at a time, if needed. Just select all the instances that you need to render before selecting the **Render** button from the OpenPype menu. - -![Unreal OP Tools Render](assets/unreal_openpype_tools_render.png) - -Once the render is finished, click on the OpenPype icon in Unrealโ€™s main taskbar, and select **Publish**. - -![Unreal OP Tools Publish](assets/unreal_openpype_tools_publish.png) - -On the left, you will see the render instances. They will be automatically reorganised to have an instance for each shot. So, for example, if you have created the render instance for the whole episode, here you will have an instance for each shot in the episode. - -![Unreal Publish Render](assets/unreal_publish_render.png) - -Click on the play button in the bottom right, and it will start the publishing process. diff --git a/website/docs/artist_install.md b/website/docs/artist_install.md deleted file mode 100644 index 6fb5abe9e2..0000000000 --- a/website/docs/artist_install.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -id: artist_install -title: Installation -sidebar_label: Installation ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -## Installation - -OpenPype comes in packages for Windows (10 or Server), Mac OS X (Mojave or higher), and Linux distribution (Centos, Ubuntu), and you can install them on your machine the same way as you are used to. - -:::important -To install OpenPype you will need administrator permissions. -::: - -:::note pick your platform - - - - -For installation on Windows, download and run the executable file `OpenPype-3.0.0.exe`. -During the installation process, you can change the destination location path of the application, - -![Windows installation](assets/install_01.png) - -and create an icon on the desktop. - -![Windows create icon](assets/install_02.png) - - - - - - -For installation on your Linux distribution, download and unzip `OpenPype-3.0.0.zip`. A new folder `OpenPype-3.0.0` will be created. -Inside this folder find and run `openpype_gui`, - -![Linux launch](assets/install_03.png) - - - - - - -For installation on Mac OS X, download and run dmg image file `OpenPype-3.0.0.dmg`. - -Drag the OpenPype icon into the Application folder. - -![Mac installation](assets/install_04.png) - -After the installation, you can find OpenPype among the other Applications. - - - -::: - -## Run OpenPype - -To run OpenPype click on the icon or find executable file (e.g. `C:\Program Files (x86)\OpenPype\openpype_gui.exe`) in the application location. -On the very first run of OpenPype the user will be asked for OpenPype Mongo URL. -This piece of information will be provided by the administrator or project manager who set up the studio. - -![Mongo example](assets/install_05.png) - -Once the Mongo URL address is entered, press `Start`, and OpenPype will be initiated. -OpenPype will also remember the connection for the next launch, so it is a one-time process. - -:::note -If the launch was successful, the artist should see a turquoise OpenPype logo in their -tray menu. Keep in mind that on Windows this icon might be hidden by default, in which case, the artist can simply drag the icon down to the tray. - -![Systray](assets/artist_systray.png) -::: \ No newline at end of file diff --git a/website/docs/artist_kitsu.md b/website/docs/artist_kitsu.md deleted file mode 100644 index 9ef782c297..0000000000 --- a/website/docs/artist_kitsu.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: artist_kitsu -title: Kitsu -sidebar_label: Kitsu ---- - -# How to use Kitsu in OpenPype - -## Login to Kitsu module in OpenPype -1. Launch OpenPype, the `Kitsu Credentials` window will open automatically, if not, or if you want to log-in with another account, go to systray OpenPype icon and click on `Kitsu Connect`. -2. Enter your credentials and press *Ok*: - - ![kitsu-login](assets/kitsu/kitsu_credentials.png) - -:::tip -In Kitsu, All the publish actions executed by `pyblish` will be attributed to the currently logged-in user. -::: \ No newline at end of file diff --git a/website/docs/artist_publish.md b/website/docs/artist_publish.md deleted file mode 100644 index b1be2e629e..0000000000 --- a/website/docs/artist_publish.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -id: artist_publish -title: Publishing -sidebar_label: Publishing ---- - -## What is publishing? - -A process of exporting particular data from your work scene to be shared with others. - -Think of publishing as a checkpoint between two people, making sure that we catch mistakes as soon as possible and donโ€™t let them pass through pipeline step that would eventually need to be repeated if these mistakes are not caught. - -Every time you want to share a piece of work with others (be it camera, model, textures, animation or whatever), you need toย publishย this data. The main reason is to save time down the line and make it very clear what can and cannot be used in production. -This process should mostly be handled by publishing scripts but in certain cases might have to be done manually. - -Published assets should comply to these rules: - -- Clearly named, based on internal naming conventions. -- Versioned (with master version created for certain types of assets). -- Immediately usable, without any dependencies to unpublished assets or work files. -- Immutable - -All of these go into the publish folder for the given entity (shot, asset, sequence) - -:::note -Keep in mind that while publishing the data might take you some extra time, it will save much more time in the long run when your colleagues donโ€™t need to dig through your work files trying to understand them and find that model you saved by hand. -::: - -## Families: - -The Instances are categorized into โ€˜familiesโ€™ based on what type of data they contain. Some instances might have multiple families if needed. A shot camera will for example have families 'camera' and 'review' to indicate that it's going to be used for review quicktime, but also exported into a file on disk. - -Following family definitions and requirements are OpenPype defaults and what we consider good industry practice, but most of the requirements can be easily altered to suit the studio or project needs. -Here's a list of supported families - -| Family | Comment | Example Subsets | -|-------------------------|-------------------------------------------------------| ------------------------- | -| [Model](#model) | Cleaned geo without materials | main, proxy, broken | -| [Look](#look) | Package of shaders, assignments and textures | main, wet, dirty | -| [Rig](#rig) | Characters or props with animation controls | main, deform, sim | -| [Assembly](#assembly) | A complex model made from multiple other models. | main, deform, sim | -| [Layout](#layout) | Simple representation of the environment | main, | -| [Setdress](#setdress) | Environment containing only referenced assets | main, | -| [Camera](#camera) | May contain trackers or proxy geo, only single camera | main, tracked, anim | -| | expected. | | -| [Animation](#animation) | Animation exported from a rig. | characterA, vehicleB | -| [Cache](#cache) | Arbitrary animated geometry or fx cache | rest, ROM , pose01 | -| MayaAscii | Maya publishes that don't fit other categories | | -| [Render](#render) | Rendered frames from CG or Comp | | -| RenderSetup | Scene render settings, AOVs and layers | | -| Plate | Ingested, transcode, conformed footage | raw, graded, imageplane | -| Write | Nuke write nodes for rendering | | -| Image | Any non-plate image to be used by artists | Reference, ConceptArt | -| LayeredImage | Software agnostic layered image with metadata | Reference, ConceptArt | -| Review | Reviewable video or image. | | -| Matchmove | Matchmoved camera, potentially with geometry, allows | main | -| | multiple cameras even with planes. | | -| Workfile | Backup of the workfile with all its content | uses the task name | -| Nukenodes | Any collection of nuke nodes | maskSetup, usefulBackdrop | -| Yeticache | Cached out yeti fur setup | | -| YetiRig | Yeti groom ready to be applied to geometry cache | main, destroyed | -| VrayProxy | Vray proxy geometry for rendering | | -| VrayScene | Vray full scene export | | -| ArnodldStandin | All arnold .ass archives for rendering | main, wet, dirty | -| LUT | | | -| Nukenodes | | | -| Gizmo | | | -| Nukenodes | | | -| Harmony.template | | | -| Harmony.palette | | | - - - -### Model - -Clean geometry without any material assignments. Published model can be as small as a single mesh, or as complex as a full building. That is purely up to the artist or the supervisor. Models can contain hierarchy defined by groups or nulls for better organisation. - -Apart from model subsets, we also support LODs as extra level on top of subset. To publish LODs, you just need to prepare subsets for publishing names `modelMySubsetName_LOD##`, if OpenPype finds `_LOD##` (hashes replaced with LOD level), it will automatically be considered a LOD of the given subset. - -Example Subsets: -`modelMain`, `modelProxy`, `modelSculpt`, `modelBroken`, `modelMain_LOD01`, `modelMain_LOD02` - -Example representations: -`.ABC`, `.MA`, `.MB`, `.BLEND`, `.OBJ`, `.FBX` - - -### Look - -A package of materials, shaders, assignments, textures and attributes that collectively define a look of a model for rendering or preview purposes. This can usually be applied only to the model is was authored for, or its corresponding cache, however, material sharing across multiple models is also possible. A look should be fully self-contained and ready for rendering. - -Example Subsets: -`lookMain`, `lookProxy`, `lookWet`, `lookDirty`, `lookBlue`, `lookRed` - -Example Representations: -`.MA + .JSON`, `.MTLX (yet unsupported)`, `.BLEND` - -Please note that a look is almost never a single representation, but a combination of multiple. -For example in Maya a look consists of `.ma` file with the shaders, `.json` file which -contains the attributes and assignments and `/resources` folder with all the required textures. - - -### Rig - -Characters or props with animation controls or other parameters, ready to be referenced into a scene and animated. Animation Rigs tend to be very software specific, but in general they tend to consist of Geometry, Bones or Joints, Controllers and Deformers. OpenPype in maya supports both, self-contained rigs, that include everything in one file, but also rigs that use nested references to bring in geometry, or even skeleton. By default we bake rigs into a single file during publishing, but that behaviour can be turned off to keep the nested references live in the animation scenes. - -Example Subsets: -`rigMain`, `rigMocap`, `rigSim`, `rigCamera`, `rigMuscle` - -Example Representations: -`.MA`, `.MB`, `.BLEND`, `.HDA` - - -### Assembly - -A subset created by combining two or more smaller subsets into a composed bigger asset. -A good example would be a restaurant table asset with the cutlery and chairs included, -that will eventually be loaded into a restaurant Set. Instead of loading each individual -fork and knife for each table in the restaurant, we can first prepare `assemblyRestaurantTable` subset -which will contain the table itself, with cutlery, flowers, plates and chairs nicely arranged. - -This table can then be loaded multiple times into the restaurant for easier scene management -and updates. - -Extracted assembly doesn't contain any geometry directly, but rather information about all the individual subsets that are inside the assembly, their version and transformations. On top of that and alembic is exported which only holds any extra transforms and groups that are needed to fully re-create the original assembled scene. - -Assembly ca also be used as a sort of collection of elements that are often used together in the shots. For example if we're set dressing lot's of forest shots, it would make sense to make and assembly of all the forest elements for scattering so we don't have to load them individually into each shot. - -Example Subsets: -`assemblyTable`, `assemblyForestElements`, `assemblyRoof` - -Example Representations: -`.ABC + .JSON` - - - -### Setdress - -Fully prepared environment scene assembled from other previously published assets. Setdress should be ready for rendering as is, including any instancing, material assignments and other complex setups the environment requires. Due to this complexity, setdress is currently only publishable in the native file format of the host where it was created. In maya that would be `.ma` or `.mb` file. - - -### Camera - -Clean virtual camera without any proprietary rigging, or host specific information. Considering how widely across the hosts published cameras are used in production, published camera should ideally be as simple and clean as possible to ensure consistency when loaded into various hosts. - - -Example Representations: -`.MA`, `.ABC` - - -### Cache - -Geometry or effect with baked animation. Cache is usually exported as alembic, -but can be potentially any other representation that makes sense in the given scenario. -Cache is defined by the artist directly in the fx or animation scene. - -Example Subsets: -`assemblyTable`, `assemblyForestElements`, `assemblyRoof` - -Example Representations: -`.ABC`, `.VDB`, `.BGEO` - - -### Animation - -Published result of an animation created with a rig. Animation can be extracted -as animation curves, cached out geometry or even fully animated rig with all the controllers. -Animation cache is usually defined by a rigger in the rig file of a character or -by FX TD in the effects rig, to ensure consistency of outputs. - -Example Subsets: -`animationBob_01`, `animationJack_02`, `animationVehicleA` - -Example Representations: -`.MA`, `.ABC`, `.JSON` - - -### Yeti Cache - -Cached out yeti fur simulation that originates from a yeti rig applied in the shot context. - - -### Yeti Rig - -Yeti groom setup ready to be applied to a cached out character in the shot context. - -### Render diff --git a/website/docs/artist_tools.md b/website/docs/artist_tools.md deleted file mode 100644 index 30e5cec84f..0000000000 --- a/website/docs/artist_tools.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: artist_tools -title: Tools -sidebar_label: Tools ---- - -# Tools - -OpenPype offers a collection of core tools in tandem with the Integrations: - -- [Context Manager](artist_tools_context_manager) -- [Creator](artist_tools_creator) -- [Loader](artist_tools_loader) -- [Library Loader](artist_tools_library_loader) -- [Publisher](artist_tools_publisher) -- [Inventory](artist_tools_inventory) -- [Workfiles](artist_tools_workfiles) -- [Look Assigner](artist_tools_look_assigner) -- [Subset Manager](artist_tools_subset_manager) -- [Sync Queue](artist_tools_sync_queue) - diff --git a/website/docs/artist_tools_context_manager.md b/website/docs/artist_tools_context_manager.md deleted file mode 100644 index 254401e9de..0000000000 --- a/website/docs/artist_tools_context_manager.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: artist_tools_context_manager -title: Context Manager -sidebar_label: Context Manager -description: A tool to manage the context within a host app. ---- - -# Context Manager - -Any time your host app is open in a defined context it can be changed to different hierarchy, asset or task within a project. This will allow you to change your opened session to any other asset, shot and tasks within the same project. This is useful particularly in cases where your host takes long time to start. - -![workfiles_1](assets/tools_context_manager.png) - - -:::note -Notice that the window doesn't close after hitting `Accept` and confirming the change of context. This behaviour let's you keep the window open and change the context multiple times in a row. -::: diff --git a/website/docs/artist_tools_creator.md b/website/docs/artist_tools_creator.md deleted file mode 100644 index e2f3f3b482..0000000000 --- a/website/docs/artist_tools_creator.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: artist_tools_creator -title: Creator -sidebar_label: Creator -description: A tool to generate metadata for asset publishing. ---- - -# Creator - -## Details - -Despite the name, Creator isn't for making new content in your scene, but rather taking what's already in it and creating all the metadata your content needs to be published. - -In Maya this means creating a set with everything you want to publish and assigning custom attributes to it so it gets picked up during publishing stage. - -In Nuke it's either converting an existing write node to a publishable one, or simply creating a write node with all the correct settings and outputs already set. - -## Usage - -1. Select what you want to publish from your scenes. -2. Open *Creator* from OpenPype menu. -3. Choose what family (data type) you need to export. -4. Type the name for you export. This name is how others are going to be able to refer to this particular subset when loading it into their scenes. Every assets should have a Main subset, but can have any number of other variants. -5. Click on *Create*. - diff --git a/website/docs/artist_tools_inventory.md b/website/docs/artist_tools_inventory.md deleted file mode 100644 index 95207e2b47..0000000000 --- a/website/docs/artist_tools_inventory.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -id: artist_tools_inventory -title: Inventory -sidebar_label: Inventory -description: Manage already loaded subsets. ---- - -# Inventory - -With Scene Inventory, you can browse, update and change subsets loaded with [Loader](artist_tools_loader) into your scene or script. - -:::note -You should first understand [Key concepts](artist_concepts) to understand how you can use this tool. -::: - -## Details - - -Once a subset is loaded, it turns into a container within a scene. This containerization allows us to have a good overview of everything in the scene, but also makes it possible to change versions, notify user if something is outdated, replace one asset for another, etc. - - -The scene manager has a simple GUI focused on efficiency. You can see everything that has been previously loaded into the scene, how many time it's been loaded, what version and a lot of other information. Loaded assets are grouped by their asset name, subset name and representation. This grouping gives ability to apply changes for all instances of the loaded asset *(e.g. when __tree__ is loaded 20 times you can easily update version for all of them)*. - -![tools_scene_inventory_10](assets/tools/tools_scene_inventory_10-small.png) - -To interact with any container, you need to right click it and you'll see a drop down with possible actions. The key actions for production are already implemented, but more will be added over time. - -![tools_scene_inventory_20](assets/tools/tools_scene_inventory_20.png) - -## Usage - -### Change version -You can change versions of loaded subsets with scene inventory tool. Version of loaded assets is colored to red when newer version is available. - - -![tools_scene_inventory_40](assets/tools/tools_scene_inventory_40.png) - -#### Update to the latest version -Select containers or subsets you want to update, right-click selection and press `Update to latest`. - -#### Change to specific version -Select containers or subsets you want to change, right-click selection, press `Set version`, select from dropdown version you want change to and press `OK` button to confirm. - - -![tools_scene_inventory_30](assets/tools/tools_scene_inventory_30.png) - - -### Switch Asset -It's tool in Scene inventory tool that gives ability to switch asset, subset and representation of loaded assets. - - -![tools_scene_inventory_50](assets/tools/tools_scene_inventory_50.png) - - -Because loaded asset is in fact representation of version published in asset's subset it is possible to switch each of this part *(representation, version, subset and asset)*, but with limitations. Limitations are obvious as you can imagine when you have loaded `.ma` representation of `modelMain` subset from `car` asset it is not possible to switch subset to `modelHD` and keep same representation if `modelHD` does not have published `.ma` representation. It is possible to switch multiple loaded assets at once that makes this tool very powerful helper if all published assets contain same subsets and representations. - -Switch tool won't let you cross the border of limitations and inform you when you have to specify more if impossible combination occurs *(It is also possible that there will be no possible combination for selected assets)*. Border is colored to red and confirm button is not enabled when specification is required. - - -![tools_scene_inventory_55](assets/tools/tools_scene_inventory_55.png) - - -Possible switches: -- switch **representation** (`.ma` to `.abc`, `.exr` to `.dpx`, etc.) -- switch **subset** (`modelMain` to `modelHD`, etc.) - - `AND` keep same **representation** *(with limitations)* - - `AND` switch **representation** *(with limitations)* -- switch **asset** (`oak` to `elm`, etc.) - - `AND` keep same **subset** and **representation** *(with limitations)* - - `AND` keep same **subset** and switch **representation** *(with limitations)* - - `AND` switch **subset** and keep same **representation** *(with limitations)* - - `AND` switch **subset** and **representation** *(with limitations)* - -We added one more switch layer above subset for LOD (Level Of Depth). That requires to have published subsets with name ending with **"_LOD{number}"** where number represents level (e.g. modelMain_LOD1). Has the same limitations as mentioned above. This is handy when you want to change only subset but keep same LOD or keep same subset but change LOD for multiple assets. This option is hidden if you didn't select subset that have published subset with LODs. - -![tools_scene_inventory_54](assets/tools/tools_scene_inventory_54.png) - -## Filtering - -### Filter by name - -There is a search bar on the top for cases when you have a complex scene with many assets and need to find a specific one. - -
-
- -![tools_scene_inventory_60](assets/tools/tools_scene_inventory_60-small.png) - -
-
- -![tools_scene_inventory_61](assets/tools/tools_scene_inventory_61-small.png) - -
-
- - -### Filter with Cherry-pick selection - -
-
- -To keep only selected subsets right-click selection and press `Cherry-Pick (Hierarchy)` *(Border of subset list change to **orange** color when Cherry-pick filtering is set so you know filter is applied).* - -
-
- -![tools_scene_inventory_62-small](assets/tools/tools_scene_inventory_62-small.png) - -
-
- -
-
- -To return to original state right-click anywhere in subsets list and press `Back to Full-View`. - -
-
- -![tools_scene_inventory_63-small](assets/tools/tools_scene_inventory_63-small.png) - -
-
- - -:::tip -You can Cherry-pick from Cherry-picked subsets. -::: diff --git a/website/docs/artist_tools_library_loader.md b/website/docs/artist_tools_library_loader.md deleted file mode 100644 index f85d4e6117..0000000000 --- a/website/docs/artist_tools_library_loader.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -id: artist_tools_library_loader -title: Library Loader -sidebar_label: Library Loader -description: Allows loading published subsets from projects of type "Library". ---- - -# Library Loader - -Library loader is extended [loader](artist_tools_loader) which allows to load published subsets from Library projects. Controls are same but library loader has extra Combo Box which allows you to choose project you want to load from. - -
-
- -![tools_library_1](assets/tools/tools_library_1-small.png) - -
-
- -![tools_library_2](assets/tools/tools_library_2-small.png) - -
-
- -## Delivery Action - -Library Loader contains functionality to export any selected asset, subsets and their version to configurable folder. -Delivery follows structure based on defined template, this template must be configured first by Admin in the Settings. - -![delivery_action](assets/tools/tools_delivery_loader.png) - -* Usage -- Select all required subsets for export (you can change theirs versions by double clicking on 'Version' value) -- Right click and select **Deliver Versions** from context menu -- Select predefined Delivery template (must be configured by Admin system or project wide) -- Fill value for root folder (folder will be created if it doesn't exist) -- Filter out type of representation you are not interested in -- Push **Deliver** button -- Dialog must be kept open until export is finished -- In a case of problems with any of the representation, that one will be skipped, description of error will be provided in the dialog - - diff --git a/website/docs/artist_tools_loader.md b/website/docs/artist_tools_loader.md deleted file mode 100644 index 3ae69b1cf6..0000000000 --- a/website/docs/artist_tools_loader.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -id: artist_tools_loader -title: Loader -sidebar_label: Loader -description: Allows loading published subsets from the same project. ---- - -# Loader -Loader loads published subsets into your current scene or script. - -## Usage -1. Open *Loader* from OpenPype menu. -2. Select the asset where the subset you want to load is published. -3. From subset list select the subset you want. -4. Right-click the subset. -5. From action menu select what you want to do *(load, reference, ...)*. - - -![tools_loader_1](assets/tools/tools_loader_1.png) - -
-
- -## Refresh data -Data are not auto-refreshed to avoid database issues. To refresh assets or subsets press refresh button. - -
-
- -![tools_loader_50](assets/tools/tools_loader_50.png) - -
-
- -## Load another version -Loader by default load last version, but you can of course load another versions. Double-click on the subset in the version column to expose the drop down, choose version you want to load and continue from point 4 of the [Usage](#usage-1). - -
-
- - ![tools_loader_21](assets/tools/tools_loader_21.png) -
-
- - ![tools_loader_22](assets/tools/tools_loader_22.png) -
-
- - -## Filtering - -### Filter Assets and Subsets by name -To filter assets/subsets by name just type name or part of name to filter text input. Only assets/subsets containing the entered string remain. - -- **Assets filtering example** *(it works the same for subsets)*: - -
-
- -![tools_loader_4](assets/tools/tools_loader_4-small.png) - -
-
- -![tools_loader_5](assets/tools/tools_loader_5-small.png) - -
-
- - -### Filter Subsets by Family - -
-
- -To filter [subsets](artist_concepts.md#subset) by their [families](artist_publish.md#families) you can use families list where you can check families you want to see or uncheck families you are not interested in. - -
-
- -![tools_loader_30](assets/tools/tools_loader_30-small.png) - -
-
- - - -## Subset groups -Subsets may be grouped which can help to make the subset list more transparent. You can toggle visibility of groups with `Enable Grouping` checkbox. - -![tools_loader_40](assets/tools/tools_loader_40-small.png) - - -### Add to group or change current group -You can set group of selected subsets with shortcut `Ctrl + G`. - -![tools_loader_41](assets/tools/tools_loader_41-small.png) - - -:::warning -You'll set the group in Avalon database so your changes will take effect for all users. -::: - -## Site Sync support - -If **Site Sync** is enabled additional widget is shown in right bottom corner. -It contains list of all representations of selected version(s). It also shows availability of representation files -on particular site (*active* - mine, *remote* - theirs). - -![site_sync_support](assets/site_sync_loader.png) - -On this picture you see that representation files are available only on remote site (could be GDrive or other). -If artist wants to work with the file(s) they need to be downloaded first. That could be done by right mouse click on -particular representation (or multiselect all) and select *Download*. - -This will mark representation to be download which will happen in the background if OpenPype Tray is running. - -For more details of progress, state or possible error details artist should open **[Sync Queue](#Sync-Queue)** item in Tray app. - -Work in progress... - diff --git a/website/docs/artist_tools_look_assigner.md b/website/docs/artist_tools_look_assigner.md deleted file mode 100644 index 29002802b0..0000000000 --- a/website/docs/artist_tools_look_assigner.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: artist_tools_look_assigner -title: Look Assigner -sidebar_label: Look Assigner -description: Manage published looks to their respective model(s). ---- - -# Look Assigner - -The Look Manager takes care of assigning published looks to the correct model in the scene. - -## Details - -When a look is published it also stores the information about what shading networks need to be assigned to which models, but it also stores all the render attributes on the mesh necessary for a successful render. - -## Usage - -Look Assigner has GUI is made of two parts. On the left you will see the list of all the available models in the scene and on the right side, all the looks that can be associate with them. To assign a look to a model you just need to: - -1. Click on "load all subsets". -2. Choose a subset from the menu on the left. -3. Right click on a look from the list on the right. -4. Choose "Assign". - -At this point you should have a model with all it's shaders applied correctly. The tool automatically loads the latest look available. - diff --git a/website/docs/artist_tools_publisher.md b/website/docs/artist_tools_publisher.md deleted file mode 100644 index 456049d824..0000000000 --- a/website/docs/artist_tools_publisher.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: artist_tools_publisher -title: Publisher -sidebar_label: Publisher -description: Publish versioned work progress into the project. ---- - -# Publisher - -Use publish to share your work with others. It collects, validates and exports the data in standardized way. - -## Details - -When you run pyblish, the UI is made of 2 main parts. On the left, you see all the items pyblish will be working with (called instances), and on the right a list of actions that are going to process these items. -Even though every task type has some pre-defined settings of what should be collected from the scene and what items will be published by default. You can technically publish any output type from any task type. -Each item is passed through multiple plugins, each doing a small piece of work. These are organized into 4 areas and run in sequence. - -## Using Pyblish - -In the best case scenario, you open pyblish from the Avalon menu, press play, wait for it to finish, and youโ€™re done. -These are the steps in detail, for cases, where the default settings donโ€™t work for you or you know that the task youโ€™re working on, requires a different treatment. - -### Collect - -Finds all the important data in the scene and makes it ready for publishing - -### Validate - -Each validator makes sure your output complies to one particular condition. This could be anything from naming conventions, scene setting, to plugin usage. An item can only be published if all validators pass. - -### Extract - -Extractor takes the item and saves it to the disk. Usually to temporary location. Each extractor represents one file format and there can be multiple file formats exported for each item. - -### Integrate - -Integrator takes the extracted files, categorizes and moves them to a correct location on the disk or on the server. - diff --git a/website/docs/artist_tools_subset_manager.md b/website/docs/artist_tools_subset_manager.md deleted file mode 100644 index fd1bc5f477..0000000000 --- a/website/docs/artist_tools_subset_manager.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: artist_tools_subset_manager -title: Subset Manager -sidebar_label: Subset Manager -description: Manage all the publish-able elements. ---- - -# Subset Manager - -Subset Manager lists all items which are meant for publishig and will be published if Publish is triggered - -## Details - -One or more items (instances) could be published any time Publish process is started. Each this publishable -item must be created by Creator tool previously. Subset Manager provides easy way how to check which items, -and how many, will be published. - -It also provides clean and preferable way how to remove unwanted item from publishing. - -## Usage - -Subset Manager has GUI is made of two parts. On the left you will see the list of all the available publishable items in the scene and on the right side, details about these items. - -
- -![subset_manager](assets/tools_subset_manager.png) -
- -Any time new item is Created, it will show up here. - -Currently there is only single action, 'Remove instance' which cleans workfile file from publishable item metadata. -This might not remove underlying host item, it depends on host and implementation! - -It might also happen that user deletes underlying host item(for example layer in Photoshop) directly in the host, but metadata will stay. -This could result in phantom issues during publishing. Use Subset Manager to purge workfile from abandoned items. - -Please check behaviour in host of your choice. - diff --git a/website/docs/artist_tools_sync_queu.md b/website/docs/artist_tools_sync_queu.md deleted file mode 100644 index 7dac8638f9..0000000000 --- a/website/docs/artist_tools_sync_queu.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: artist_tools_sync_queue -title: Sync Queue -sidebar_label: Sync Queue -description: Track sites synchronization progress. ---- - -# Sync Queue - -## Details - -If **Site Sync** is configured for a project, each asset is marked to be synchronized to a remote site during publishing. -Each artist's OpenPype Tray application handles synchronization in background, it looks for all representation which -are marked with the site of the user (unique site name per artist) and remote site. - -Artists then can see progress of synchronization via **Sync Queue** link in the Tray application. - -Artists can see all synced representation in this dialog with helpful information such as when representation was created, when it was synched, -status of synchronization (OK or Fail) etc. - -## Usage - -With this app artists can modify synchronized representation, for example mark failed representation for re-sync etc. - -![Sync Queue](assets/site_sync_sync_queue.png) - -Actions accessible by context menu on single (or multiple representations): -- *Open in Explorer* - if site is locally accessible, open folder with it with OS based explorer -- *Re-sync Active Site* - mark artist own side for re-download (repre must be accessible on remote side) -- *Re-sync Remote Site* - mark representation for re-upload -- *Completely remove from local* - removes tag of synchronization to artist's local site, removes files from disk (available only for personal sites) -- *Change priority* - mark representations with higher priority for faster synchronization run - -Double click on any of the representation open Detail dialog with information about all files for particular representation. -In this dialog error details could be accessed in the context menu. - -#### Context menu on project name -Artists can also Pause whole server or specific project for synchronization. In that state no download/upload is being run. -This might be helpful if the artist is not interested in a particular project for a while or wants to save bandwidth data limit for a bit. - -Another option is `Validate files on active site`. This option triggers process where all representation of the selected project are looped through, file paths are resolved for active site and -if paths point to local system, paths are physically checked if files are existing. If file exists and representation is not marked to be present on 'active_site' in DB, DB is updated -to follow that. - -This might be useful if artist has representation files that Site Sync doesn't know about (newly attached external drive with representations from studio). -This project might take a while! diff --git a/website/docs/artist_tools_workfiles.md b/website/docs/artist_tools_workfiles.md deleted file mode 100644 index 2e1d939c97..0000000000 --- a/website/docs/artist_tools_workfiles.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -id: artist_tools_workfiles -title: Workfiles -sidebar_label: Workfiles -description: Save versioned progress files. ---- - -# Workfiles - -Save new working scenes or scripts, or open the ones you previously worked on. - -## Details - -Instead of digging through your software native file browser, you can simply open the workfiles app and see all the files for the asset or shot you're currently working with. The app takes care of all the naming and the location of your work files. - -When saving a scene you can also add a comment. It is completely up to you how you use this, however we recommend using it for subversion within your current working version. - -Let's say that the last version of the comp you published was v003 and now you're working on the file prj_sh010_compositing_v004.nk if you want to keep snapshots of your work, but not iterate on the main version because the supervisor is expecting next publish to be v004, you can use the comment to do this, so you can save the file under the name prj_sh010_compositing_v004_001 , prj_sh010_compositing_v004_002. the main version is automatically iterated every time you publish something. - -## Usage - -
-
- -### To open existing file: - -1. Open Workfiles tool from OpenPype menu -2. Select file from list - the latest version is the highest *(descendent ordering)* -3. Press `Open` button - -
-
- -![workfiles_1](assets/workfiles_1.png) - -
-
- - -### To save new workfile -1. Open Workfiles tool from OpenPype menu -2. Press `Save As` button -3. You can add optional comment to the filename, that will be appended at the end -4. Press `OK` - -:::note -You can manually override the workfile version by unticking next available version and using the version menu to choose your own. -::: - diff --git a/website/docs/artist_work.md b/website/docs/artist_work.md deleted file mode 100644 index de2290fc0c..0000000000 --- a/website/docs/artist_work.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: artist_work -title: Working on tasks -sidebar_label: Working ---- - -Check the [documentation](https://docusaurus.io) for how to use Docusaurus. - -## Lorem - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus elementum massa eget nulla aliquet sagittis. Proin odio tortor, vulputate ut odio in, ultrices ultricies augue. Cras ornare ultrices lorem malesuada iaculis. Etiam sit amet libero tempor, pulvinar mauris sed, sollicitudin sapien. - -## Mauris In Code - - Mauris vestibulum ullamcorper nibh, ut semper purus pulvinar ut. Donec volutpat orci sit amet mauris malesuada, non pulvinar augue aliquam. Vestibulum ultricies at urna ut suscipit. Morbi iaculis, erat at imperdiet semper, ipsum nulla sodales erat, eget tincidunt justo dui quis justo. Pellentesque dictum bibendum diam at aliquet. Sed pulvinar, dolor quis finibus ornare, eros odio facilisis erat, eu rhoncus nunc dui sed ex. Nunc gravida dui massa, sed ornare arcu tincidunt sit amet. Maecenas efficitur sapien neque, a laoreet libero feugiat ut. - -## Nulla - -Nulla facilisi. Maecenas sodales nec purus eget posuere. Sed sapien quam, pretium a risus in, porttitor dapibus erat. Sed sit amet fringilla ipsum, eget iaculis augue. Integer sollicitudin tortor quis ultricies aliquam. Suspendisse fringilla nunc in tellus cursus, at placerat tellus scelerisque. Sed tempus elit a sollicitudin rhoncus. Nulla facilisi. Morbi nec dolor dolor. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras et aliquet lectus. Pellentesque sit amet eros nisi. Quisque ac sapien in sapien congue accumsan. Nullam in posuere ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin lacinia leo a nibh fringilla pharetra. - -## Orci - -Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin venenatis lectus dui, vel ultrices ante bibendum hendrerit. Aenean egestas feugiat dui id hendrerit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur in tellus laoreet, eleifend nunc id, viverra leo. Proin vulputate non dolor vel vulputate. Curabitur pretium lobortis felis, sit amet finibus lorem suscipit ut. Sed non mollis risus. Duis sagittis, mi in euismod tincidunt, nunc mauris vestibulum urna, at euismod est elit quis erat. Phasellus accumsan vitae neque eu placerat. In elementum arcu nec tellus imperdiet, eget maximus nulla sodales. Curabitur eu sapien eget nisl sodales fermentum. diff --git a/website/docs/assets/3dsmax_SavingFirstFile2_OP.png b/website/docs/assets/3dsmax_SavingFirstFile2_OP.png deleted file mode 100644 index 4066ee0f1a..0000000000 Binary files a/website/docs/assets/3dsmax_SavingFirstFile2_OP.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_SavingFirstFile_OP.png b/website/docs/assets/3dsmax_SavingFirstFile_OP.png deleted file mode 100644 index c4832ca6bb..0000000000 Binary files a/website/docs/assets/3dsmax_SavingFirstFile_OP.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_context.png b/website/docs/assets/3dsmax_context.png deleted file mode 100644 index 9b84cb2587..0000000000 Binary files a/website/docs/assets/3dsmax_context.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_menu_OP.png b/website/docs/assets/3dsmax_menu_OP.png deleted file mode 100644 index bce2f9aac0..0000000000 Binary files a/website/docs/assets/3dsmax_menu_OP.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_menu_first_OP.png b/website/docs/assets/3dsmax_menu_first_OP.png deleted file mode 100644 index c3a7b00cbb..0000000000 Binary files a/website/docs/assets/3dsmax_menu_first_OP.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_model_OP.png b/website/docs/assets/3dsmax_model_OP.png deleted file mode 100644 index 293c06642c..0000000000 Binary files a/website/docs/assets/3dsmax_model_OP.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_tray_OP.png b/website/docs/assets/3dsmax_tray_OP.png deleted file mode 100644 index cfd0b07ef6..0000000000 Binary files a/website/docs/assets/3dsmax_tray_OP.png and /dev/null differ diff --git a/website/docs/assets/3dsmax_validate_attributes.png b/website/docs/assets/3dsmax_validate_attributes.png deleted file mode 100644 index 5af8236188..0000000000 Binary files a/website/docs/assets/3dsmax_validate_attributes.png and /dev/null differ diff --git a/website/docs/assets/admin_hosts_aftereffects_settings.png b/website/docs/assets/admin_hosts_aftereffects_settings.png deleted file mode 100644 index 9b879585f8..0000000000 Binary files a/website/docs/assets/admin_hosts_aftereffects_settings.png and /dev/null differ diff --git a/website/docs/assets/admin_hosts_harmony_settings.png b/website/docs/assets/admin_hosts_harmony_settings.png deleted file mode 100644 index 800a64e986..0000000000 Binary files a/website/docs/assets/admin_hosts_harmony_settings.png and /dev/null differ diff --git a/website/docs/assets/admin_hosts_photoshop_settings.png b/website/docs/assets/admin_hosts_photoshop_settings.png deleted file mode 100644 index 9478fbedf7..0000000000 Binary files a/website/docs/assets/admin_hosts_photoshop_settings.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_create_placeholder.png b/website/docs/assets/aftereffects_create_placeholder.png deleted file mode 100644 index e81fee349f..0000000000 Binary files a/website/docs/assets/aftereffects_create_placeholder.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_creator.png b/website/docs/assets/aftereffects_creator.png deleted file mode 100644 index 203ecb6fb7..0000000000 Binary files a/website/docs/assets/aftereffects_creator.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_creator_after.png b/website/docs/assets/aftereffects_creator_after.png deleted file mode 100644 index 3933202f71..0000000000 Binary files a/website/docs/assets/aftereffects_creator_after.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_extension.png b/website/docs/assets/aftereffects_extension.png deleted file mode 100644 index b14992471a..0000000000 Binary files a/website/docs/assets/aftereffects_extension.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_load_placeholder.png b/website/docs/assets/aftereffects_load_placeholder.png deleted file mode 100644 index 4a7c08c639..0000000000 Binary files a/website/docs/assets/aftereffects_load_placeholder.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_loader.png b/website/docs/assets/aftereffects_loader.png deleted file mode 100644 index 9fd69b04f7..0000000000 Binary files a/website/docs/assets/aftereffects_loader.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_populated_template.png b/website/docs/assets/aftereffects_populated_template.png deleted file mode 100644 index 2a71fd0070..0000000000 Binary files a/website/docs/assets/aftereffects_populated_template.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_prepared_template.png b/website/docs/assets/aftereffects_prepared_template.png deleted file mode 100644 index f50c53ecf7..0000000000 Binary files a/website/docs/assets/aftereffects_prepared_template.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_publish.png b/website/docs/assets/aftereffects_publish.png deleted file mode 100644 index 4cfe3d1d6b..0000000000 Binary files a/website/docs/assets/aftereffects_publish.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_publish_failed.png b/website/docs/assets/aftereffects_publish_failed.png deleted file mode 100644 index 5821fcbb31..0000000000 Binary files a/website/docs/assets/aftereffects_publish_failed.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_publish_instance.png b/website/docs/assets/aftereffects_publish_instance.png deleted file mode 100644 index 7ce7f194b9..0000000000 Binary files a/website/docs/assets/aftereffects_publish_instance.png and /dev/null differ diff --git a/website/docs/assets/aftereffects_render_instance.png b/website/docs/assets/aftereffects_render_instance.png deleted file mode 100644 index b9be8b3f5d..0000000000 Binary files a/website/docs/assets/aftereffects_render_instance.png and /dev/null differ diff --git a/website/docs/assets/artist_systray.png b/website/docs/assets/artist_systray.png deleted file mode 100644 index 6a0dd23375..0000000000 Binary files a/website/docs/assets/artist_systray.png and /dev/null differ diff --git a/website/docs/assets/blender-model_create_instance.jpg b/website/docs/assets/blender-model_create_instance.jpg deleted file mode 100644 index d0891c5d05..0000000000 Binary files a/website/docs/assets/blender-model_create_instance.jpg and /dev/null differ diff --git a/website/docs/assets/blender-model_error_details.jpg b/website/docs/assets/blender-model_error_details.jpg deleted file mode 100644 index 1756254e5f..0000000000 Binary files a/website/docs/assets/blender-model_error_details.jpg and /dev/null differ diff --git a/website/docs/assets/blender-model_example.jpg b/website/docs/assets/blender-model_example.jpg deleted file mode 100644 index 98d98e903f..0000000000 Binary files a/website/docs/assets/blender-model_example.jpg and /dev/null differ diff --git a/website/docs/assets/blender-model_pre_publish.jpg b/website/docs/assets/blender-model_pre_publish.jpg deleted file mode 100644 index 11233229c5..0000000000 Binary files a/website/docs/assets/blender-model_pre_publish.jpg and /dev/null differ diff --git a/website/docs/assets/blender-model_publish_error.jpg b/website/docs/assets/blender-model_publish_error.jpg deleted file mode 100644 index 260d9b9996..0000000000 Binary files a/website/docs/assets/blender-model_publish_error.jpg and /dev/null differ diff --git a/website/docs/assets/blender-rig_create.jpg b/website/docs/assets/blender-rig_create.jpg deleted file mode 100644 index 169ddae84f..0000000000 Binary files a/website/docs/assets/blender-rig_create.jpg and /dev/null differ diff --git a/website/docs/assets/blender-rig_hierarchy_before_publish.jpg b/website/docs/assets/blender-rig_hierarchy_before_publish.jpg deleted file mode 100644 index 81f3916c9e..0000000000 Binary files a/website/docs/assets/blender-rig_hierarchy_before_publish.jpg and /dev/null differ diff --git a/website/docs/assets/blender-rig_hierarchy_example.jpg b/website/docs/assets/blender-rig_hierarchy_example.jpg deleted file mode 100644 index 6ab6897650..0000000000 Binary files a/website/docs/assets/blender-rig_hierarchy_example.jpg and /dev/null differ diff --git a/website/docs/assets/blender-rig_model_setup.jpg b/website/docs/assets/blender-rig_model_setup.jpg deleted file mode 100644 index 6f967cdab4..0000000000 Binary files a/website/docs/assets/blender-rig_model_setup.jpg and /dev/null differ diff --git a/website/docs/assets/blender-save_modelling_file.jpg b/website/docs/assets/blender-save_modelling_file.jpg deleted file mode 100644 index d7f2401c51..0000000000 Binary files a/website/docs/assets/blender-save_modelling_file.jpg and /dev/null differ diff --git a/website/docs/assets/deadline_configure_plugin.png b/website/docs/assets/deadline_configure_plugin.png deleted file mode 100644 index f734ca7aca..0000000000 Binary files a/website/docs/assets/deadline_configure_plugin.png and /dev/null differ diff --git a/website/docs/assets/deadline_fail.png b/website/docs/assets/deadline_fail.png deleted file mode 100644 index 7758e35b01..0000000000 Binary files a/website/docs/assets/deadline_fail.png and /dev/null differ diff --git a/website/docs/assets/deadline_group.png b/website/docs/assets/deadline_group.png deleted file mode 100644 index b0ec0e1cb9..0000000000 Binary files a/website/docs/assets/deadline_group.png and /dev/null differ diff --git a/website/docs/assets/deadline_job_version.png b/website/docs/assets/deadline_job_version.png deleted file mode 100644 index 0b78d6a35c..0000000000 Binary files a/website/docs/assets/deadline_job_version.png and /dev/null differ diff --git a/website/docs/assets/deadline_review.png b/website/docs/assets/deadline_review.png deleted file mode 100644 index b4466d2d67..0000000000 Binary files a/website/docs/assets/deadline_review.png and /dev/null differ diff --git a/website/docs/assets/experimental_tools_menu.png b/website/docs/assets/experimental_tools_menu.png deleted file mode 100644 index 79fa8d3655..0000000000 Binary files a/website/docs/assets/experimental_tools_menu.png and /dev/null differ diff --git a/website/docs/assets/experimental_tools_settings.png b/website/docs/assets/experimental_tools_settings.png deleted file mode 100644 index 4d514e8a8f..0000000000 Binary files a/website/docs/assets/experimental_tools_settings.png and /dev/null differ diff --git a/website/docs/assets/ffmpeg_path.png b/website/docs/assets/ffmpeg_path.png deleted file mode 100644 index 6bc99cc2ca..0000000000 Binary files a/website/docs/assets/ffmpeg_path.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-api.gif b/website/docs/assets/ftrack/ftrack-api.gif deleted file mode 100644 index b2caf6ca98..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-api.gif and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-api.png b/website/docs/assets/ftrack/ftrack-api.png deleted file mode 100644 index c69967d78e..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-api.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-api2.png b/website/docs/assets/ftrack/ftrack-api2.png deleted file mode 100644 index 1653f8f603..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-api2.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-api3.png b/website/docs/assets/ftrack/ftrack-api3.png deleted file mode 100644 index 0ea03f5224..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-api3.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-api4.png b/website/docs/assets/ftrack/ftrack-api4.png deleted file mode 100644 index 3ee7551dce..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-api4.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-collect-advanced.png b/website/docs/assets/ftrack/ftrack-collect-advanced.png deleted file mode 100644 index 5249685c86..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-collect-advanced.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-collect-main.png b/website/docs/assets/ftrack/ftrack-collect-main.png deleted file mode 100644 index 7c75cd6269..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-collect-main.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-component_open-icon.png b/website/docs/assets/ftrack/ftrack-component_open-icon.png deleted file mode 100644 index 1ea7a97d4c..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-component_open-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-component_open_1-small.png b/website/docs/assets/ftrack/ftrack-component_open_1-small.png deleted file mode 100644 index 6a783ab973..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-component_open_1-small.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-component_open_1.png b/website/docs/assets/ftrack/ftrack-component_open_1.png deleted file mode 100644 index 5fdf16a0a2..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-component_open_1.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-create_folders-icon.png b/website/docs/assets/ftrack/ftrack-create_folders-icon.png deleted file mode 100644 index be88cf8993..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-create_folders-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-create_project_folders-icon.png b/website/docs/assets/ftrack/ftrack-create_project_folders-icon.png deleted file mode 100644 index 06c689267a..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-create_project_folders-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-custom_attrib_apps.jpg b/website/docs/assets/ftrack/ftrack-custom_attrib_apps.jpg deleted file mode 100644 index bbd4fd9842..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-custom_attrib_apps.jpg and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-delete_asset-icon.png b/website/docs/assets/ftrack/ftrack-delete_asset-icon.png deleted file mode 100644 index 2786ece2d0..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-delete_asset-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-delivery-icon.png b/website/docs/assets/ftrack/ftrack-delivery-icon.png deleted file mode 100644 index 30775c9a50..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-delivery-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login-api.png b/website/docs/assets/ftrack/ftrack-login-api.png deleted file mode 100644 index d47d46ce2f..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login-api.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_1.png b/website/docs/assets/ftrack/ftrack-login_1.png deleted file mode 100644 index cc9b51b39b..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_1.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_2.png b/website/docs/assets/ftrack/ftrack-login_2.png deleted file mode 100644 index e654f70283..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_2.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_3.png b/website/docs/assets/ftrack/ftrack-login_3.png deleted file mode 100644 index 1677ea7f57..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_3.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_50.png b/website/docs/assets/ftrack/ftrack-login_50.png deleted file mode 100644 index 46d1b3c686..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_50.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_60.png b/website/docs/assets/ftrack/ftrack-login_60.png deleted file mode 100644 index 8302c198c3..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_60.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_71-small.png b/website/docs/assets/ftrack/ftrack-login_71-small.png deleted file mode 100644 index 0b66ed520d..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_71-small.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_71.png b/website/docs/assets/ftrack/ftrack-login_71.png deleted file mode 100644 index 2331dcb4c2..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_71.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_80-small.png b/website/docs/assets/ftrack/ftrack-login_80-small.png deleted file mode 100644 index 6473e2bee6..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_80-small.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_80.png b/website/docs/assets/ftrack/ftrack-login_80.png deleted file mode 100644 index 67aecd1e84..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_80.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-login_81.png b/website/docs/assets/ftrack/ftrack-login_81.png deleted file mode 100644 index ae145d6c73..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-login_81.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-multiple_notes-icon.png b/website/docs/assets/ftrack/ftrack-multiple_notes-icon.png deleted file mode 100644 index 3ebc240df7..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-multiple_notes-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-multiple_notes_1-small.png b/website/docs/assets/ftrack/ftrack-multiple_notes_1-small.png deleted file mode 100644 index d4f7bd865e..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-multiple_notes_1-small.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-multiple_notes_1.png b/website/docs/assets/ftrack/ftrack-multiple_notes_1.png deleted file mode 100644 index 401f02e1ce..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-multiple_notes_1.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-prepare_project-icon.png b/website/docs/assets/ftrack/ftrack-prepare_project-icon.png deleted file mode 100644 index 44facfa3ae..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-prepare_project-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-prepare_project_1-small.png b/website/docs/assets/ftrack/ftrack-prepare_project_1-small.png deleted file mode 100644 index c2d1066ffd..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-prepare_project_1-small.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-prepare_project_1.png b/website/docs/assets/ftrack/ftrack-prepare_project_1.png deleted file mode 100644 index 488ea5710d..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-prepare_project_1.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-pype_admin-icon.png b/website/docs/assets/ftrack/ftrack-pype_admin-icon.png deleted file mode 100644 index f8ccbe66db..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-pype_admin-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-pype_doctor-icon.png b/website/docs/assets/ftrack/ftrack-pype_doctor-icon.png deleted file mode 100644 index 23c408d373..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-pype_doctor-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack-thumbnail-icon.png b/website/docs/assets/ftrack/ftrack-thumbnail-icon.png deleted file mode 100644 index f27cd96a3b..0000000000 Binary files a/website/docs/assets/ftrack/ftrack-thumbnail-icon.png and /dev/null differ diff --git a/website/docs/assets/ftrack/ftrack_logout.gif b/website/docs/assets/ftrack/ftrack_logout.gif deleted file mode 100644 index 81088075c4..0000000000 Binary files a/website/docs/assets/ftrack/ftrack_logout.gif and /dev/null differ diff --git a/website/docs/assets/harmony_creator.png b/website/docs/assets/harmony_creator.png deleted file mode 100644 index 8593889c64..0000000000 Binary files a/website/docs/assets/harmony_creator.png and /dev/null differ diff --git a/website/docs/assets/harmony_publish.png b/website/docs/assets/harmony_publish.png deleted file mode 100644 index dc57757122..0000000000 Binary files a/website/docs/assets/harmony_publish.png and /dev/null differ diff --git a/website/docs/assets/harmony_publish_actions.png b/website/docs/assets/harmony_publish_actions.png deleted file mode 100644 index 86083ad54b..0000000000 Binary files a/website/docs/assets/harmony_publish_actions.png and /dev/null differ diff --git a/website/docs/assets/harmony_publish_expand.png b/website/docs/assets/harmony_publish_expand.png deleted file mode 100644 index 6969b15647..0000000000 Binary files a/website/docs/assets/harmony_publish_expand.png and /dev/null differ diff --git a/website/docs/assets/harmony_publish_inspect.png b/website/docs/assets/harmony_publish_inspect.png deleted file mode 100644 index d2fd8922af..0000000000 Binary files a/website/docs/assets/harmony_publish_inspect.png and /dev/null differ diff --git a/website/docs/assets/harmony_publish_repair.gif b/website/docs/assets/harmony_publish_repair.gif deleted file mode 100644 index bf7065801e..0000000000 Binary files a/website/docs/assets/harmony_publish_repair.gif and /dev/null differ diff --git a/website/docs/assets/hiero-admin_scriptsmenu.png b/website/docs/assets/hiero-admin_scriptsmenu.png deleted file mode 100644 index 6de136a434..0000000000 Binary files a/website/docs/assets/hiero-admin_scriptsmenu.png and /dev/null differ diff --git a/website/docs/assets/hiero_createUIFrames.png b/website/docs/assets/hiero_createUIFrames.png deleted file mode 100644 index 798b3efb79..0000000000 Binary files a/website/docs/assets/hiero_createUIFrames.png and /dev/null differ diff --git a/website/docs/assets/hiero_createUIRename.png b/website/docs/assets/hiero_createUIRename.png deleted file mode 100644 index 3c02254559..0000000000 Binary files a/website/docs/assets/hiero_createUIRename.png and /dev/null differ diff --git a/website/docs/assets/hiero_defaultTags.png b/website/docs/assets/hiero_defaultTags.png deleted file mode 100644 index 225ec7d484..0000000000 Binary files a/website/docs/assets/hiero_defaultTags.png and /dev/null differ diff --git a/website/docs/assets/hiero_instanceCreator.png b/website/docs/assets/hiero_instanceCreator.png deleted file mode 100644 index bcda6cdd18..0000000000 Binary files a/website/docs/assets/hiero_instanceCreator.png and /dev/null differ diff --git a/website/docs/assets/hiero_menuColorspaceClip.png b/website/docs/assets/hiero_menuColorspaceClip.png deleted file mode 100644 index 4014da2675..0000000000 Binary files a/website/docs/assets/hiero_menuColorspaceClip.png and /dev/null differ diff --git a/website/docs/assets/hiero_menuColorspaceProject.png b/website/docs/assets/hiero_menuColorspaceProject.png deleted file mode 100644 index 6b8e6e1b89..0000000000 Binary files a/website/docs/assets/hiero_menuColorspaceProject.png and /dev/null differ diff --git a/website/docs/assets/hiero_menuCreate.png b/website/docs/assets/hiero_menuCreate.png deleted file mode 100644 index cbd816a203..0000000000 Binary files a/website/docs/assets/hiero_menuCreate.png and /dev/null differ diff --git a/website/docs/assets/hiero_menuDefaultTags.png b/website/docs/assets/hiero_menuDefaultTags.png deleted file mode 100644 index ba542e1019..0000000000 Binary files a/website/docs/assets/hiero_menuDefaultTags.png and /dev/null differ diff --git a/website/docs/assets/hiero_menuPublish.png b/website/docs/assets/hiero_menuPublish.png deleted file mode 100644 index 4259dc44e4..0000000000 Binary files a/website/docs/assets/hiero_menuPublish.png and /dev/null differ diff --git a/website/docs/assets/hiero_tagHandles.png b/website/docs/assets/hiero_tagHandles.png deleted file mode 100644 index 84e7012088..0000000000 Binary files a/website/docs/assets/hiero_tagHandles.png and /dev/null differ diff --git a/website/docs/assets/hiero_timelinePrep.png b/website/docs/assets/hiero_timelinePrep.png deleted file mode 100644 index 253bc114ee..0000000000 Binary files a/website/docs/assets/hiero_timelinePrep.png and /dev/null differ diff --git a/website/docs/assets/houdini-admin_shelvesmanager.png b/website/docs/assets/houdini-admin_shelvesmanager.png deleted file mode 100644 index ba2f15a6a5..0000000000 Binary files a/website/docs/assets/houdini-admin_shelvesmanager.png and /dev/null differ diff --git a/website/docs/assets/houdini/update-houdini-vars-context-change.png b/website/docs/assets/houdini/update-houdini-vars-context-change.png deleted file mode 100644 index 74ac8d86c9..0000000000 Binary files a/website/docs/assets/houdini/update-houdini-vars-context-change.png and /dev/null differ diff --git a/website/docs/assets/houdini_bgeo-loading.png b/website/docs/assets/houdini_bgeo-loading.png deleted file mode 100644 index e8aad66f43..0000000000 Binary files a/website/docs/assets/houdini_bgeo-loading.png and /dev/null differ diff --git a/website/docs/assets/houdini_bgeo-publisher.png b/website/docs/assets/houdini_bgeo-publisher.png deleted file mode 100644 index 5c3534077f..0000000000 Binary files a/website/docs/assets/houdini_bgeo-publisher.png and /dev/null differ diff --git a/website/docs/assets/houdini_bgeo_output_node.png b/website/docs/assets/houdini_bgeo_output_node.png deleted file mode 100644 index 160f0a259b..0000000000 Binary files a/website/docs/assets/houdini_bgeo_output_node.png and /dev/null differ diff --git a/website/docs/assets/houdini_farm_cache_creator.png b/website/docs/assets/houdini_farm_cache_creator.png deleted file mode 100644 index bf0af80336..0000000000 Binary files a/website/docs/assets/houdini_farm_cache_creator.png and /dev/null differ diff --git a/website/docs/assets/houdini_farm_cache_loader.png b/website/docs/assets/houdini_farm_cache_loader.png deleted file mode 100644 index 27b0122fab..0000000000 Binary files a/website/docs/assets/houdini_farm_cache_loader.png and /dev/null differ diff --git a/website/docs/assets/houdini_frame_per_task.png b/website/docs/assets/houdini_frame_per_task.png deleted file mode 100644 index a7d8b33114..0000000000 Binary files a/website/docs/assets/houdini_frame_per_task.png and /dev/null differ diff --git a/website/docs/assets/houdini_imagesequence_cop.png b/website/docs/assets/houdini_imagesequence_cop.png deleted file mode 100644 index 54ed5977b9..0000000000 Binary files a/website/docs/assets/houdini_imagesequence_cop.png and /dev/null differ diff --git a/website/docs/assets/houdini_pointcache_path.png b/website/docs/assets/houdini_pointcache_path.png deleted file mode 100644 index 3687a9c0dd..0000000000 Binary files a/website/docs/assets/houdini_pointcache_path.png and /dev/null differ diff --git a/website/docs/assets/houdini_render_publish_creator.png b/website/docs/assets/houdini_render_publish_creator.png deleted file mode 100644 index 5dd73d296a..0000000000 Binary files a/website/docs/assets/houdini_render_publish_creator.png and /dev/null differ diff --git a/website/docs/assets/houdini_review_create_attrs.png b/website/docs/assets/houdini_review_create_attrs.png deleted file mode 100644 index 8735e79914..0000000000 Binary files a/website/docs/assets/houdini_review_create_attrs.png and /dev/null differ diff --git a/website/docs/assets/houdini_usd_stage.png b/website/docs/assets/houdini_usd_stage.png deleted file mode 100644 index cba9428604..0000000000 Binary files a/website/docs/assets/houdini_usd_stage.png and /dev/null differ diff --git a/website/docs/assets/houdini_vdb_setup.png b/website/docs/assets/houdini_vdb_setup.png deleted file mode 100644 index e27e0b6c36..0000000000 Binary files a/website/docs/assets/houdini_vdb_setup.png and /dev/null differ diff --git a/website/docs/assets/install_01.png b/website/docs/assets/install_01.png deleted file mode 100644 index c6b55826a3..0000000000 Binary files a/website/docs/assets/install_01.png and /dev/null differ diff --git a/website/docs/assets/install_02.png b/website/docs/assets/install_02.png deleted file mode 100644 index 1e97fd8139..0000000000 Binary files a/website/docs/assets/install_02.png and /dev/null differ diff --git a/website/docs/assets/install_03.png b/website/docs/assets/install_03.png deleted file mode 100644 index 1ddd0eea8b..0000000000 Binary files a/website/docs/assets/install_03.png and /dev/null differ diff --git a/website/docs/assets/install_04.png b/website/docs/assets/install_04.png deleted file mode 100644 index 6c03c5abd4..0000000000 Binary files a/website/docs/assets/install_04.png and /dev/null differ diff --git a/website/docs/assets/install_05.png b/website/docs/assets/install_05.png deleted file mode 100644 index a7119a49fa..0000000000 Binary files a/website/docs/assets/install_05.png and /dev/null differ diff --git a/website/docs/assets/integrate_kitsu_note_settings.png b/website/docs/assets/integrate_kitsu_note_settings.png deleted file mode 100644 index 9c59f0bf5c..0000000000 Binary files a/website/docs/assets/integrate_kitsu_note_settings.png and /dev/null differ diff --git a/website/docs/assets/kitsu/kitsu_credentials.png b/website/docs/assets/kitsu/kitsu_credentials.png deleted file mode 100644 index 25c1ad93c4..0000000000 Binary files a/website/docs/assets/kitsu/kitsu_credentials.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_custom_namespace.png b/website/docs/assets/maya-admin_custom_namespace.png deleted file mode 100644 index 80707ea727..0000000000 Binary files a/website/docs/assets/maya-admin_custom_namespace.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_dirmap_settings.png b/website/docs/assets/maya-admin_dirmap_settings.png deleted file mode 100644 index 9d5780dfc8..0000000000 Binary files a/website/docs/assets/maya-admin_dirmap_settings.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_exclude_handles.png b/website/docs/assets/maya-admin_exclude_handles.png deleted file mode 100644 index 9a50f2c287..0000000000 Binary files a/website/docs/assets/maya-admin_exclude_handles.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_extract_playblast_settings.png b/website/docs/assets/maya-admin_extract_playblast_settings.png deleted file mode 100644 index 9312e30321..0000000000 Binary files a/website/docs/assets/maya-admin_extract_playblast_settings.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_extract_playblast_settings_camera_options.png b/website/docs/assets/maya-admin_extract_playblast_settings_camera_options.png deleted file mode 100644 index 1a5561328e..0000000000 Binary files a/website/docs/assets/maya-admin_extract_playblast_settings_camera_options.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_extract_playblast_settings_viewport_options.png b/website/docs/assets/maya-admin_extract_playblast_settings_viewport_options.png deleted file mode 100644 index 5b801775d3..0000000000 Binary files a/website/docs/assets/maya-admin_extract_playblast_settings_viewport_options.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_gpu_cache.png b/website/docs/assets/maya-admin_gpu_cache.png deleted file mode 100644 index 8b07b06c1e..0000000000 Binary files a/website/docs/assets/maya-admin_gpu_cache.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_include_handles.png b/website/docs/assets/maya-admin_include_handles.png deleted file mode 100644 index 88d2270ddc..0000000000 Binary files a/website/docs/assets/maya-admin_include_handles.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_model_name_validator.png b/website/docs/assets/maya-admin_model_name_validator.png deleted file mode 100644 index d1b92c5fc3..0000000000 Binary files a/website/docs/assets/maya-admin_model_name_validator.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_render_settings_validator.png b/website/docs/assets/maya-admin_render_settings_validator.png deleted file mode 100644 index 8ee11f16f6..0000000000 Binary files a/website/docs/assets/maya-admin_render_settings_validator.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_scriptsmenu.png b/website/docs/assets/maya-admin_scriptsmenu.png deleted file mode 100644 index ecfe7e42a7..0000000000 Binary files a/website/docs/assets/maya-admin_scriptsmenu.png and /dev/null differ diff --git a/website/docs/assets/maya-admin_submit_maya_job_to_deadline.png b/website/docs/assets/maya-admin_submit_maya_job_to_deadline.png deleted file mode 100644 index 56b720dc5d..0000000000 Binary files a/website/docs/assets/maya-admin_submit_maya_job_to_deadline.png and /dev/null differ diff --git a/website/docs/assets/maya-arnold_scene_source.png b/website/docs/assets/maya-arnold_scene_source.png deleted file mode 100644 index 4150b78aac..0000000000 Binary files a/website/docs/assets/maya-arnold_scene_source.png and /dev/null differ diff --git a/website/docs/assets/maya-arnold_standin.png b/website/docs/assets/maya-arnold_standin.png deleted file mode 100644 index 74571a86fa..0000000000 Binary files a/website/docs/assets/maya-arnold_standin.png and /dev/null differ diff --git a/website/docs/assets/maya-build_workfile_from_template.png b/website/docs/assets/maya-build_workfile_from_template.png deleted file mode 100644 index 7ef87861fe..0000000000 Binary files a/website/docs/assets/maya-build_workfile_from_template.png and /dev/null differ diff --git a/website/docs/assets/maya-create_placeholder.png b/website/docs/assets/maya-create_placeholder.png deleted file mode 100644 index 3f49fe2e2b..0000000000 Binary files a/website/docs/assets/maya-create_placeholder.png and /dev/null differ diff --git a/website/docs/assets/maya-create_rs_proxy.jpg b/website/docs/assets/maya-create_rs_proxy.jpg deleted file mode 100644 index 37680e6707..0000000000 Binary files a/website/docs/assets/maya-create_rs_proxy.jpg and /dev/null differ diff --git a/website/docs/assets/maya-inventory_action_recreate_animation_instance.png b/website/docs/assets/maya-inventory_action_recreate_animation_instance.png deleted file mode 100644 index 42a6f26964..0000000000 Binary files a/website/docs/assets/maya-inventory_action_recreate_animation_instance.png and /dev/null differ diff --git a/website/docs/assets/maya-look_dev-look_manager.jpg b/website/docs/assets/maya-look_dev-look_manager.jpg deleted file mode 100644 index 54dbf3f667..0000000000 Binary files a/website/docs/assets/maya-look_dev-look_manager.jpg and /dev/null differ diff --git a/website/docs/assets/maya-look_dev-red_buddha.jpg b/website/docs/assets/maya-look_dev-red_buddha.jpg deleted file mode 100644 index e003a4ca55..0000000000 Binary files a/website/docs/assets/maya-look_dev-red_buddha.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_create_instance.jpg b/website/docs/assets/maya-model_create_instance.jpg deleted file mode 100644 index 0f32f0cb05..0000000000 Binary files a/website/docs/assets/maya-model_create_instance.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_freeze_error_details.jpg b/website/docs/assets/maya-model_freeze_error_details.jpg deleted file mode 100644 index 77b3cab005..0000000000 Binary files a/website/docs/assets/maya-model_freeze_error_details.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_hierarchy_example.jpg b/website/docs/assets/maya-model_hierarchy_example.jpg deleted file mode 100644 index 661722960c..0000000000 Binary files a/website/docs/assets/maya-model_hierarchy_example.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_loading.jpg b/website/docs/assets/maya-model_loading.jpg deleted file mode 100644 index 7a7d911c06..0000000000 Binary files a/website/docs/assets/maya-model_loading.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_pre_publish.jpg b/website/docs/assets/maya-model_pre_publish.jpg deleted file mode 100644 index b5827bdb5e..0000000000 Binary files a/website/docs/assets/maya-model_pre_publish.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_publish_error.jpg b/website/docs/assets/maya-model_publish_error.jpg deleted file mode 100644 index efe2aff9ba..0000000000 Binary files a/website/docs/assets/maya-model_publish_error.jpg and /dev/null differ diff --git a/website/docs/assets/maya-model_review_setup.jpg b/website/docs/assets/maya-model_review_setup.jpg deleted file mode 100644 index 16576894b1..0000000000 Binary files a/website/docs/assets/maya-model_review_setup.jpg and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_openpype_asset_creator.png b/website/docs/assets/maya-multiverse_openpype_asset_creator.png deleted file mode 100644 index 0426e9f823..0000000000 Binary files a/website/docs/assets/maya-multiverse_openpype_asset_creator.png and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_openpype_composition_creator.png b/website/docs/assets/maya-multiverse_openpype_composition_creator.png deleted file mode 100644 index eb0e5e3348..0000000000 Binary files a/website/docs/assets/maya-multiverse_openpype_composition_creator.png and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_openpype_loader.png b/website/docs/assets/maya-multiverse_openpype_loader.png deleted file mode 100644 index 0579e0dcde..0000000000 Binary files a/website/docs/assets/maya-multiverse_openpype_loader.png and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_openpype_look_creator.png b/website/docs/assets/maya-multiverse_openpype_look_creator.png deleted file mode 100644 index fd27d5fd1a..0000000000 Binary files a/website/docs/assets/maya-multiverse_openpype_look_creator.png and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_openpype_override_creator.png b/website/docs/assets/maya-multiverse_openpype_override_creator.png deleted file mode 100644 index d7b1299ba6..0000000000 Binary files a/website/docs/assets/maya-multiverse_openpype_override_creator.png and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_openpype_publishers.png b/website/docs/assets/maya-multiverse_openpype_publishers.png deleted file mode 100644 index bee6c79fe9..0000000000 Binary files a/website/docs/assets/maya-multiverse_openpype_publishers.png and /dev/null differ diff --git a/website/docs/assets/maya-multiverse_setup.png b/website/docs/assets/maya-multiverse_setup.png deleted file mode 100644 index 72bdb0d379..0000000000 Binary files a/website/docs/assets/maya-multiverse_setup.png and /dev/null differ diff --git a/website/docs/assets/maya-placeholder_new.png b/website/docs/assets/maya-placeholder_new.png deleted file mode 100644 index 106a5275cd..0000000000 Binary files a/website/docs/assets/maya-placeholder_new.png and /dev/null differ diff --git a/website/docs/assets/maya-pointcache_loaded.png b/website/docs/assets/maya-pointcache_loaded.png deleted file mode 100644 index 398ef5b7ac..0000000000 Binary files a/website/docs/assets/maya-pointcache_loaded.png and /dev/null differ diff --git a/website/docs/assets/maya-pointcache_setup.png b/website/docs/assets/maya-pointcache_setup.png deleted file mode 100644 index b2dc126901..0000000000 Binary files a/website/docs/assets/maya-pointcache_setup.png and /dev/null differ diff --git a/website/docs/assets/maya-render_publish_detail1.jpg b/website/docs/assets/maya-render_publish_detail1.jpg deleted file mode 100644 index bfb00ca98a..0000000000 Binary files a/website/docs/assets/maya-render_publish_detail1.jpg and /dev/null differ diff --git a/website/docs/assets/maya-render_setup.jpg b/website/docs/assets/maya-render_setup.jpg deleted file mode 100644 index 4b1c52a593..0000000000 Binary files a/website/docs/assets/maya-render_setup.jpg and /dev/null differ diff --git a/website/docs/assets/maya-render_setup_window.jpg b/website/docs/assets/maya-render_setup_window.jpg deleted file mode 100644 index 9f4dce1ca9..0000000000 Binary files a/website/docs/assets/maya-render_setup_window.jpg and /dev/null differ diff --git a/website/docs/assets/maya-renderglobals.jpg b/website/docs/assets/maya-renderglobals.jpg deleted file mode 100644 index 8b4253f23b..0000000000 Binary files a/website/docs/assets/maya-renderglobals.jpg and /dev/null differ diff --git a/website/docs/assets/maya-rig_hierarchy_example.jpg b/website/docs/assets/maya-rig_hierarchy_example.jpg deleted file mode 100644 index 5405005768..0000000000 Binary files a/website/docs/assets/maya-rig_hierarchy_example.jpg and /dev/null differ diff --git a/website/docs/assets/maya-rig_model_setup.jpg b/website/docs/assets/maya-rig_model_setup.jpg deleted file mode 100644 index 55450e225a..0000000000 Binary files a/website/docs/assets/maya-rig_model_setup.jpg and /dev/null differ diff --git a/website/docs/assets/maya-shortcut_buttons.jpg b/website/docs/assets/maya-shortcut_buttons.jpg deleted file mode 100644 index ead3b17b99..0000000000 Binary files a/website/docs/assets/maya-shortcut_buttons.jpg and /dev/null differ diff --git a/website/docs/assets/maya-vray_proxy-loader.jpg b/website/docs/assets/maya-vray_proxy-loader.jpg deleted file mode 100644 index 29632796ea..0000000000 Binary files a/website/docs/assets/maya-vray_proxy-loader.jpg and /dev/null differ diff --git a/website/docs/assets/maya-vray_proxy.jpg b/website/docs/assets/maya-vray_proxy.jpg deleted file mode 100644 index 181b77db89..0000000000 Binary files a/website/docs/assets/maya-vray_proxy.jpg and /dev/null differ diff --git a/website/docs/assets/maya-workfile-outliner.png b/website/docs/assets/maya-workfile-outliner.png deleted file mode 100644 index fbd1bbd03b..0000000000 Binary files a/website/docs/assets/maya-workfile-outliner.png and /dev/null differ diff --git a/website/docs/assets/maya-yeti_basic_setup.jpg b/website/docs/assets/maya-yeti_basic_setup.jpg deleted file mode 100644 index bdb0408757..0000000000 Binary files a/website/docs/assets/maya-yeti_basic_setup.jpg and /dev/null differ diff --git a/website/docs/assets/maya-yeti_basic_setup_outline.jpg b/website/docs/assets/maya-yeti_basic_setup_outline.jpg deleted file mode 100644 index 9b6dc18af1..0000000000 Binary files a/website/docs/assets/maya-yeti_basic_setup_outline.jpg and /dev/null differ diff --git a/website/docs/assets/maya-yeti_cache_attributes.jpg b/website/docs/assets/maya-yeti_cache_attributes.jpg deleted file mode 100644 index 5d5048bf9d..0000000000 Binary files a/website/docs/assets/maya-yeti_cache_attributes.jpg and /dev/null differ diff --git a/website/docs/assets/maya-yeti_hair_setup.png b/website/docs/assets/maya-yeti_hair_setup.png deleted file mode 100644 index 8cd7f5f97a..0000000000 Binary files a/website/docs/assets/maya-yeti_hair_setup.png and /dev/null differ diff --git a/website/docs/assets/maya-yeti_load_connections.png b/website/docs/assets/maya-yeti_load_connections.png deleted file mode 100644 index 4e96fdc0b3..0000000000 Binary files a/website/docs/assets/maya-yeti_load_connections.png and /dev/null differ diff --git a/website/docs/assets/maya-yeti_publish_setup.png b/website/docs/assets/maya-yeti_publish_setup.png deleted file mode 100644 index f376f47cc1..0000000000 Binary files a/website/docs/assets/maya-yeti_publish_setup.png and /dev/null differ diff --git a/website/docs/assets/maya-yeti_rig_setup.png b/website/docs/assets/maya-yeti_rig_setup.png deleted file mode 100644 index 876ecba0a2..0000000000 Binary files a/website/docs/assets/maya-yeti_rig_setup.png and /dev/null differ diff --git a/website/docs/assets/maya-yeti_simple_rig.png b/website/docs/assets/maya-yeti_simple_rig.png deleted file mode 100644 index 31a60ac40b..0000000000 Binary files a/website/docs/assets/maya-yeti_simple_rig.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/1_add_handles_end.png b/website/docs/assets/nks_icons/1_add_handles_end.png deleted file mode 100644 index 4561745d66..0000000000 Binary files a/website/docs/assets/nks_icons/1_add_handles_end.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/2_add_handles.png b/website/docs/assets/nks_icons/2_add_handles.png deleted file mode 100644 index bb4c1802aa..0000000000 Binary files a/website/docs/assets/nks_icons/2_add_handles.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/3_add_handles_start.png b/website/docs/assets/nks_icons/3_add_handles_start.png deleted file mode 100644 index c98e4f74f1..0000000000 Binary files a/website/docs/assets/nks_icons/3_add_handles_start.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/frame_start.png b/website/docs/assets/nks_icons/frame_start.png deleted file mode 100644 index af68df4722..0000000000 Binary files a/website/docs/assets/nks_icons/frame_start.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/hierarchy.png b/website/docs/assets/nks_icons/hierarchy.png deleted file mode 100644 index 6acf39ced5..0000000000 Binary files a/website/docs/assets/nks_icons/hierarchy.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/lense.png b/website/docs/assets/nks_icons/lense.png deleted file mode 100644 index 255b1753ed..0000000000 Binary files a/website/docs/assets/nks_icons/lense.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/lense1.png b/website/docs/assets/nks_icons/lense1.png deleted file mode 100644 index 1ad1264807..0000000000 Binary files a/website/docs/assets/nks_icons/lense1.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/reference.png b/website/docs/assets/nks_icons/reference.png deleted file mode 100644 index 7517bd4105..0000000000 Binary files a/website/docs/assets/nks_icons/reference.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/resolution.png b/website/docs/assets/nks_icons/resolution.png deleted file mode 100644 index 83803fc36d..0000000000 Binary files a/website/docs/assets/nks_icons/resolution.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/retiming.png b/website/docs/assets/nks_icons/retiming.png deleted file mode 100644 index 1c6f22e02c..0000000000 Binary files a/website/docs/assets/nks_icons/retiming.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/review.png b/website/docs/assets/nks_icons/review.png deleted file mode 100644 index 0d894b6987..0000000000 Binary files a/website/docs/assets/nks_icons/review.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/z_layer_bg.png b/website/docs/assets/nks_icons/z_layer_bg.png deleted file mode 100644 index 51742b5df2..0000000000 Binary files a/website/docs/assets/nks_icons/z_layer_bg.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/z_layer_fg.png b/website/docs/assets/nks_icons/z_layer_fg.png deleted file mode 100644 index 01e5f4f816..0000000000 Binary files a/website/docs/assets/nks_icons/z_layer_fg.png and /dev/null differ diff --git a/website/docs/assets/nks_icons/z_layer_main.png b/website/docs/assets/nks_icons/z_layer_main.png deleted file mode 100644 index 0ffb939a7f..0000000000 Binary files a/website/docs/assets/nks_icons/z_layer_main.png and /dev/null differ diff --git a/website/docs/assets/nuke-admin_gizmomenu.png b/website/docs/assets/nuke-admin_gizmomenu.png deleted file mode 100644 index 81e63b2041..0000000000 Binary files a/website/docs/assets/nuke-admin_gizmomenu.png and /dev/null differ diff --git a/website/docs/assets/nuke-admin_scriptsmenu.png b/website/docs/assets/nuke-admin_scriptsmenu.png deleted file mode 100644 index cad2a4411d..0000000000 Binary files a/website/docs/assets/nuke-admin_scriptsmenu.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_errorVersionCheck.png b/website/docs/assets/nuke_Create_errorVersionCheck.png deleted file mode 100644 index 85bcc26108..0000000000 Binary files a/website/docs/assets/nuke_Create_errorVersionCheck.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_prerenderCustomNode.png b/website/docs/assets/nuke_Create_prerenderCustomNode.png deleted file mode 100644 index e44985ac1c..0000000000 Binary files a/website/docs/assets/nuke_Create_prerenderCustomNode.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_renderNodeDifferencesColor.png b/website/docs/assets/nuke_Create_renderNodeDifferencesColor.png deleted file mode 100644 index 410455b6cb..0000000000 Binary files a/website/docs/assets/nuke_Create_renderNodeDifferencesColor.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_renderNodeDifferencesProperities.png b/website/docs/assets/nuke_Create_renderNodeDifferencesProperities.png deleted file mode 100644 index a37867b1b7..0000000000 Binary files a/website/docs/assets/nuke_Create_renderNodeDifferencesProperities.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_renderNodeProperity.png b/website/docs/assets/nuke_Create_renderNodeProperity.png deleted file mode 100644 index 2795b91ac8..0000000000 Binary files a/website/docs/assets/nuke_Create_renderNodeProperity.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_renderNodeProperitySettings.png b/website/docs/assets/nuke_Create_renderNodeProperitySettings.png deleted file mode 100644 index ee98885216..0000000000 Binary files a/website/docs/assets/nuke_Create_renderNodeProperitySettings.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_writeCustomPreRender.png b/website/docs/assets/nuke_Create_writeCustomPreRender.png deleted file mode 100644 index 2345351f98..0000000000 Binary files a/website/docs/assets/nuke_Create_writeCustomPreRender.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_writeMainPreRender.png b/website/docs/assets/nuke_Create_writeMainPreRender.png deleted file mode 100644 index e966444efe..0000000000 Binary files a/website/docs/assets/nuke_Create_writeMainPreRender.png and /dev/null differ diff --git a/website/docs/assets/nuke_Create_writeMainRender.png b/website/docs/assets/nuke_Create_writeMainRender.png deleted file mode 100644 index 8827e5630b..0000000000 Binary files a/website/docs/assets/nuke_Create_writeMainRender.png and /dev/null differ diff --git a/website/docs/assets/nuke_Load_ReadProperities.png b/website/docs/assets/nuke_Load_ReadProperities.png deleted file mode 100644 index 239ee89f25..0000000000 Binary files a/website/docs/assets/nuke_Load_ReadProperities.png and /dev/null differ diff --git a/website/docs/assets/nuke_Load_ReadProperities1.png b/website/docs/assets/nuke_Load_ReadProperities1.png deleted file mode 100644 index 76da12ef63..0000000000 Binary files a/website/docs/assets/nuke_Load_ReadProperities1.png and /dev/null differ diff --git a/website/docs/assets/nuke_Load_subsetBrowser.png b/website/docs/assets/nuke_Load_subsetBrowser.png deleted file mode 100644 index 5bfb5bd3eb..0000000000 Binary files a/website/docs/assets/nuke_Load_subsetBrowser.png and /dev/null differ diff --git a/website/docs/assets/nuke_Load_subsetBrowserSubmenu.png b/website/docs/assets/nuke_Load_subsetBrowserSubmenu.png deleted file mode 100644 index 1a157008ee..0000000000 Binary files a/website/docs/assets/nuke_Load_subsetBrowserSubmenu.png and /dev/null differ diff --git a/website/docs/assets/nuke_ManageInventory_read.png b/website/docs/assets/nuke_ManageInventory_read.png deleted file mode 100644 index 8234f27379..0000000000 Binary files a/website/docs/assets/nuke_ManageInventory_read.png and /dev/null differ diff --git a/website/docs/assets/nuke_ManageInventory_read_latest.png b/website/docs/assets/nuke_ManageInventory_read_latest.png deleted file mode 100644 index db094c4a26..0000000000 Binary files a/website/docs/assets/nuke_ManageInventory_read_latest.png and /dev/null differ diff --git a/website/docs/assets/nuke_ManageInventory_read_multipleInstances.png b/website/docs/assets/nuke_ManageInventory_read_multipleInstances.png deleted file mode 100644 index b5497c010e..0000000000 Binary files a/website/docs/assets/nuke_ManageInventory_read_multipleInstances.png and /dev/null differ diff --git a/website/docs/assets/nuke_ManageInventory_read_outdated.png b/website/docs/assets/nuke_ManageInventory_read_outdated.png deleted file mode 100644 index 87531d1b4d..0000000000 Binary files a/website/docs/assets/nuke_ManageInventory_read_outdated.png and /dev/null differ diff --git a/website/docs/assets/nuke_Publish_prerender.png b/website/docs/assets/nuke_Publish_prerender.png deleted file mode 100644 index 2ab3983db9..0000000000 Binary files a/website/docs/assets/nuke_Publish_prerender.png and /dev/null differ diff --git a/website/docs/assets/nuke_Workfiles_saveAs.png b/website/docs/assets/nuke_Workfiles_saveAs.png deleted file mode 100644 index f9562628f2..0000000000 Binary files a/website/docs/assets/nuke_Workfiles_saveAs.png and /dev/null differ diff --git a/website/docs/assets/nuke_Workfiles_selectLastFile.png b/website/docs/assets/nuke_Workfiles_selectLastFile.png deleted file mode 100644 index 0f98cee0af..0000000000 Binary files a/website/docs/assets/nuke_Workfiles_selectLastFile.png and /dev/null differ diff --git a/website/docs/assets/nuke_addProfile.png b/website/docs/assets/nuke_addProfile.png deleted file mode 100644 index 37578df7f5..0000000000 Binary files a/website/docs/assets/nuke_addProfile.png and /dev/null differ diff --git a/website/docs/assets/nuke_applyAllSettings.png b/website/docs/assets/nuke_applyAllSettings.png deleted file mode 100644 index 913140fed1..0000000000 Binary files a/website/docs/assets/nuke_applyAllSettings.png and /dev/null differ diff --git a/website/docs/assets/nuke_autoBuild.png b/website/docs/assets/nuke_autoBuild.png deleted file mode 100644 index 5effdd594d..0000000000 Binary files a/website/docs/assets/nuke_autoBuild.png and /dev/null differ diff --git a/website/docs/assets/nuke_buildFirstWorkfile.png b/website/docs/assets/nuke_buildFirstWorkfile.png deleted file mode 100644 index eab8f21a4a..0000000000 Binary files a/website/docs/assets/nuke_buildFirstWorkfile.png and /dev/null differ diff --git a/website/docs/assets/nuke_buildWorfileFromTemplate.png b/website/docs/assets/nuke_buildWorfileFromTemplate.png deleted file mode 100644 index 77d2de2ff8..0000000000 Binary files a/website/docs/assets/nuke_buildWorfileFromTemplate.png and /dev/null differ diff --git a/website/docs/assets/nuke_buildworkfile.png b/website/docs/assets/nuke_buildworkfile.png deleted file mode 100644 index e3d8d07f7c..0000000000 Binary files a/website/docs/assets/nuke_buildworkfile.png and /dev/null differ diff --git a/website/docs/assets/nuke_createPlaceHolder.png b/website/docs/assets/nuke_createPlaceHolder.png deleted file mode 100644 index 93fb4de9d0..0000000000 Binary files a/website/docs/assets/nuke_createPlaceHolder.png and /dev/null differ diff --git a/website/docs/assets/nuke_fillingExtraAttributes.png b/website/docs/assets/nuke_fillingExtraAttributes.png deleted file mode 100644 index 146c4d9db6..0000000000 Binary files a/website/docs/assets/nuke_fillingExtraAttributes.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_ApplyAll.png b/website/docs/assets/nuke_menu_ApplyAll.png deleted file mode 100644 index c9e82b129e..0000000000 Binary files a/website/docs/assets/nuke_menu_ApplyAll.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_Create.png b/website/docs/assets/nuke_menu_Create.png deleted file mode 100644 index 3823c7d870..0000000000 Binary files a/website/docs/assets/nuke_menu_Create.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_Load.png b/website/docs/assets/nuke_menu_Load.png deleted file mode 100644 index c2ded15e53..0000000000 Binary files a/website/docs/assets/nuke_menu_Load.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_Manage.png b/website/docs/assets/nuke_menu_Manage.png deleted file mode 100644 index 71b7abd700..0000000000 Binary files a/website/docs/assets/nuke_menu_Manage.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_Publish.png b/website/docs/assets/nuke_menu_Publish.png deleted file mode 100644 index 38be1698b7..0000000000 Binary files a/website/docs/assets/nuke_menu_Publish.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_SetContext.png b/website/docs/assets/nuke_menu_SetContext.png deleted file mode 100644 index 83a31f7c7e..0000000000 Binary files a/website/docs/assets/nuke_menu_SetContext.png and /dev/null differ diff --git a/website/docs/assets/nuke_menu_Workfiles.png b/website/docs/assets/nuke_menu_Workfiles.png deleted file mode 100644 index 030ce1b583..0000000000 Binary files a/website/docs/assets/nuke_menu_Workfiles.png and /dev/null differ diff --git a/website/docs/assets/nuke_placeHolderNode.png b/website/docs/assets/nuke_placeHolderNode.png deleted file mode 100644 index ac9e83b9d6..0000000000 Binary files a/website/docs/assets/nuke_placeHolderNode.png and /dev/null differ diff --git a/website/docs/assets/nuke_placeholder.png b/website/docs/assets/nuke_placeholder.png deleted file mode 100644 index d899ff742c..0000000000 Binary files a/website/docs/assets/nuke_placeholder.png and /dev/null differ diff --git a/website/docs/assets/nuke_publish_renderMain.png b/website/docs/assets/nuke_publish_renderMain.png deleted file mode 100644 index bb499fb613..0000000000 Binary files a/website/docs/assets/nuke_publish_renderMain.png and /dev/null differ diff --git a/website/docs/assets/nuke_publishedinstance.png b/website/docs/assets/nuke_publishedinstance.png deleted file mode 100644 index 494b9e40a4..0000000000 Binary files a/website/docs/assets/nuke_publishedinstance.png and /dev/null differ diff --git a/website/docs/assets/nuke_setColorspace.png b/website/docs/assets/nuke_setColorspace.png deleted file mode 100644 index 8895c30594..0000000000 Binary files a/website/docs/assets/nuke_setColorspace.png and /dev/null differ diff --git a/website/docs/assets/nuke_setContext.png b/website/docs/assets/nuke_setContext.png deleted file mode 100644 index b9a6c79f29..0000000000 Binary files a/website/docs/assets/nuke_setContext.png and /dev/null differ diff --git a/website/docs/assets/nuke_setFrameRanges.png b/website/docs/assets/nuke_setFrameRanges.png deleted file mode 100644 index 0289fc4dba..0000000000 Binary files a/website/docs/assets/nuke_setFrameRanges.png and /dev/null differ diff --git a/website/docs/assets/nuke_setFrameRanges_timeline.png b/website/docs/assets/nuke_setFrameRanges_timeline.png deleted file mode 100644 index 8e6b65c7ca..0000000000 Binary files a/website/docs/assets/nuke_setFrameRanges_timeline.png and /dev/null differ diff --git a/website/docs/assets/nuke_setResolution.png b/website/docs/assets/nuke_setResolution.png deleted file mode 100644 index 3e40619884..0000000000 Binary files a/website/docs/assets/nuke_setResolution.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_AnatomyAppsVersions.png b/website/docs/assets/nuke_tut/nuke_AnatomyAppsVersions.png deleted file mode 100644 index 92e1b4dad7..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_AnatomyAppsVersions.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_AssetLoadOutOfDate.png b/website/docs/assets/nuke_tut/nuke_AssetLoadOutOfDate.png deleted file mode 100644 index f7f807a94f..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_AssetLoadOutOfDate.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_AssetLoader.png b/website/docs/assets/nuke_tut/nuke_AssetLoader.png deleted file mode 100644 index e52abdc428..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_AssetLoader.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_Context.png b/website/docs/assets/nuke_tut/nuke_Context.png deleted file mode 100644 index 65bb288764..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_Context.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_Create.png b/website/docs/assets/nuke_tut/nuke_Create.png deleted file mode 100644 index 2c843c05df..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_Create.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_Creator.png b/website/docs/assets/nuke_tut/nuke_Creator.png deleted file mode 100644 index 454777574a..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_Creator.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_Load.png b/website/docs/assets/nuke_tut/nuke_Load.png deleted file mode 100644 index 2a345dc69f..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_Load.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_ManageVersion.png b/website/docs/assets/nuke_tut/nuke_ManageVersion.png deleted file mode 100644 index c9f2091347..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_ManageVersion.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_NukeColor.png b/website/docs/assets/nuke_tut/nuke_NukeColor.png deleted file mode 100644 index 5c4f9a15e0..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_NukeColor.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_Publish.png b/website/docs/assets/nuke_tut/nuke_Publish.png deleted file mode 100644 index b53b6cc06c..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_Publish.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_PyblishCheckBox.png b/website/docs/assets/nuke_tut/nuke_PyblishCheckBox.png deleted file mode 100644 index 2c5d59c9d5..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_PyblishCheckBox.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_PyblishDialogNuke.png b/website/docs/assets/nuke_tut/nuke_PyblishDialogNuke.png deleted file mode 100644 index e98a4b9553..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_PyblishDialogNuke.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_PyblishDialogNukeNoteIntent.png b/website/docs/assets/nuke_tut/nuke_PyblishDialogNukeNoteIntent.png deleted file mode 100644 index 3519ecc22d..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_PyblishDialogNukeNoteIntent.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_RenderLocalFarm.png b/website/docs/assets/nuke_tut/nuke_RenderLocalFarm.png deleted file mode 100644 index 4c4c8977a0..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_RenderLocalFarm.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_RunNukeFtrackAction.png b/website/docs/assets/nuke_tut/nuke_RunNukeFtrackAction.png deleted file mode 100644 index 75faaec572..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_RunNukeFtrackAction.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_RunNukeFtrackAction_p3.png b/website/docs/assets/nuke_tut/nuke_RunNukeFtrackAction_p3.png deleted file mode 100644 index 27fec32ae4..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_RunNukeFtrackAction_p3.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_RunNukeLauncher.png b/website/docs/assets/nuke_tut/nuke_RunNukeLauncher.png deleted file mode 100644 index a42ee6d7b9..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_RunNukeLauncher.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_RunNukeLauncher_p2.png b/website/docs/assets/nuke_tut/nuke_RunNukeLauncher_p2.png deleted file mode 100644 index 2a36cad380..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_RunNukeLauncher_p2.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_ValidateContainers.png b/website/docs/assets/nuke_tut/nuke_ValidateContainers.png deleted file mode 100644 index 78e0f2edd7..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_ValidateContainers.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WorkFileNamingAnatomy.png b/website/docs/assets/nuke_tut/nuke_WorkFileNamingAnatomy.png deleted file mode 100644 index 115a321285..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WorkFileNamingAnatomy.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WorkFileSaveAs.png b/website/docs/assets/nuke_tut/nuke_WorkFileSaveAs.png deleted file mode 100644 index 661f44632a..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WorkFileSaveAs.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WorkfileOnStartup.png b/website/docs/assets/nuke_tut/nuke_WorkfileOnStartup.png deleted file mode 100644 index 450589ee3a..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WorkfileOnStartup.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WriteNode.png b/website/docs/assets/nuke_tut/nuke_WriteNode.png deleted file mode 100644 index 5ce3e81aab..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WriteNode.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WriteNodeCreated.png b/website/docs/assets/nuke_tut/nuke_WriteNodeCreated.png deleted file mode 100644 index b283593d6a..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WriteNodeCreated.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WriteNodeReview.png b/website/docs/assets/nuke_tut/nuke_WriteNodeReview.png deleted file mode 100644 index 68651cdd6c..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WriteNodeReview.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_WriteSettings.png b/website/docs/assets/nuke_tut/nuke_WriteSettings.png deleted file mode 100644 index cf00adbee6..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_WriteSettings.png and /dev/null differ diff --git a/website/docs/assets/nuke_tut/nuke_versionless.png b/website/docs/assets/nuke_tut/nuke_versionless.png deleted file mode 100644 index fbb98c55e2..0000000000 Binary files a/website/docs/assets/nuke_tut/nuke_versionless.png and /dev/null differ diff --git a/website/docs/assets/nuke_updatePlaceHolder.png b/website/docs/assets/nuke_updatePlaceHolder.png deleted file mode 100644 index 58fac2a7e4..0000000000 Binary files a/website/docs/assets/nuke_updatePlaceHolder.png and /dev/null differ diff --git a/website/docs/assets/nuke_updateWorkfile.png b/website/docs/assets/nuke_updateWorkfile.png deleted file mode 100644 index aeeebb123f..0000000000 Binary files a/website/docs/assets/nuke_updateWorkfile.png and /dev/null differ diff --git a/website/docs/assets/photoshop_creator.png b/website/docs/assets/photoshop_creator.png deleted file mode 100644 index e72fe2f447..0000000000 Binary files a/website/docs/assets/photoshop_creator.png and /dev/null differ diff --git a/website/docs/assets/photoshop_extension.png b/website/docs/assets/photoshop_extension.png deleted file mode 100644 index 1f5c1792e1..0000000000 Binary files a/website/docs/assets/photoshop_extension.png and /dev/null differ diff --git a/website/docs/assets/photoshop_loader.png b/website/docs/assets/photoshop_loader.png deleted file mode 100644 index 36eeadf084..0000000000 Binary files a/website/docs/assets/photoshop_loader.png and /dev/null differ diff --git a/website/docs/assets/photoshop_loader_load.gif b/website/docs/assets/photoshop_loader_load.gif deleted file mode 100644 index efe051857b..0000000000 Binary files a/website/docs/assets/photoshop_loader_load.gif and /dev/null differ diff --git a/website/docs/assets/photoshop_manage.png b/website/docs/assets/photoshop_manage.png deleted file mode 100644 index 64c424d94f..0000000000 Binary files a/website/docs/assets/photoshop_manage.png and /dev/null differ diff --git a/website/docs/assets/photoshop_manage_switch.gif b/website/docs/assets/photoshop_manage_switch.gif deleted file mode 100644 index de11b77e5c..0000000000 Binary files a/website/docs/assets/photoshop_manage_switch.gif and /dev/null differ diff --git a/website/docs/assets/photoshop_manage_update.gif b/website/docs/assets/photoshop_manage_update.gif deleted file mode 100644 index 2c5d681cd3..0000000000 Binary files a/website/docs/assets/photoshop_manage_update.gif and /dev/null differ diff --git a/website/docs/assets/photoshop_publish.png b/website/docs/assets/photoshop_publish.png deleted file mode 100644 index 23b61cc609..0000000000 Binary files a/website/docs/assets/photoshop_publish.png and /dev/null differ diff --git a/website/docs/assets/photoshop_publish_failed.png b/website/docs/assets/photoshop_publish_failed.png deleted file mode 100644 index 5aaafcbda2..0000000000 Binary files a/website/docs/assets/photoshop_publish_failed.png and /dev/null differ diff --git a/website/docs/assets/photoshop_publish_images.png b/website/docs/assets/photoshop_publish_images.png deleted file mode 100644 index 34f0b4755c..0000000000 Binary files a/website/docs/assets/photoshop_publish_images.png and /dev/null differ diff --git a/website/docs/assets/photoshop_publish_validations.png b/website/docs/assets/photoshop_publish_validations.png deleted file mode 100644 index 2260c8d50b..0000000000 Binary files a/website/docs/assets/photoshop_publish_validations.png and /dev/null differ diff --git a/website/docs/assets/presets_plugins_extract_burnin_01.png b/website/docs/assets/presets_plugins_extract_burnin_01.png deleted file mode 100644 index 03169c1c88..0000000000 Binary files a/website/docs/assets/presets_plugins_extract_burnin_01.png and /dev/null differ diff --git a/website/docs/assets/publisher_card_view.png b/website/docs/assets/publisher_card_view.png deleted file mode 100644 index 57b012cb6d..0000000000 Binary files a/website/docs/assets/publisher_card_view.png and /dev/null differ diff --git a/website/docs/assets/publisher_create_dialog.png b/website/docs/assets/publisher_create_dialog.png deleted file mode 100644 index 6e9275062d..0000000000 Binary files a/website/docs/assets/publisher_create_dialog.png and /dev/null differ diff --git a/website/docs/assets/publisher_list_view.png b/website/docs/assets/publisher_list_view.png deleted file mode 100644 index e9dc8a607a..0000000000 Binary files a/website/docs/assets/publisher_list_view.png and /dev/null differ diff --git a/website/docs/assets/resolve_clip_instances_pink_with_marker_in_middle.png b/website/docs/assets/resolve_clip_instances_pink_with_marker_in_middle.png deleted file mode 100644 index 403f6e9433..0000000000 Binary files a/website/docs/assets/resolve_clip_instances_pink_with_marker_in_middle.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_audio_resolution.png b/website/docs/assets/resolve_create_audio_resolution.png deleted file mode 100644 index af22c7467e..0000000000 Binary files a/website/docs/assets/resolve_create_audio_resolution.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_clips.png b/website/docs/assets/resolve_create_clips.png deleted file mode 100644 index b589bfb61e..0000000000 Binary files a/website/docs/assets/resolve_create_clips.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_object_naming_convention.png b/website/docs/assets/resolve_create_object_naming_convention.png deleted file mode 100644 index 13de366ef6..0000000000 Binary files a/website/docs/assets/resolve_create_object_naming_convention.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_renaming_clips.png b/website/docs/assets/resolve_create_renaming_clips.png deleted file mode 100644 index 20c303e50a..0000000000 Binary files a/website/docs/assets/resolve_create_renaming_clips.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_single_track_rename_hero_track.png b/website/docs/assets/resolve_create_single_track_rename_hero_track.png deleted file mode 100644 index 5f68258d1d..0000000000 Binary files a/website/docs/assets/resolve_create_single_track_rename_hero_track.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_subset_name_review_track.png b/website/docs/assets/resolve_create_subset_name_review_track.png deleted file mode 100644 index 4efbff8409..0000000000 Binary files a/website/docs/assets/resolve_create_subset_name_review_track.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_template_filling.png b/website/docs/assets/resolve_create_template_filling.png deleted file mode 100644 index faa8c51ee3..0000000000 Binary files a/website/docs/assets/resolve_create_template_filling.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_vertical_rename_creator_ui.png b/website/docs/assets/resolve_create_vertical_rename_creator_ui.png deleted file mode 100644 index e163844993..0000000000 Binary files a/website/docs/assets/resolve_create_vertical_rename_creator_ui.png and /dev/null differ diff --git a/website/docs/assets/resolve_create_vertical_rename_timeline.png b/website/docs/assets/resolve_create_vertical_rename_timeline.png deleted file mode 100644 index 3e57db4119..0000000000 Binary files a/website/docs/assets/resolve_create_vertical_rename_timeline.png and /dev/null differ diff --git a/website/docs/assets/resolve_creator_clip_marker_do_not_change.png b/website/docs/assets/resolve_creator_clip_marker_do_not_change.png deleted file mode 100644 index 11cc5c4618..0000000000 Binary files a/website/docs/assets/resolve_creator_clip_marker_do_not_change.png and /dev/null differ diff --git a/website/docs/assets/resolve_creator_framestart_handles.png b/website/docs/assets/resolve_creator_framestart_handles.png deleted file mode 100644 index 65328fe041..0000000000 Binary files a/website/docs/assets/resolve_creator_framestart_handles.png and /dev/null differ diff --git a/website/docs/assets/resolve_creator_subset_name.png b/website/docs/assets/resolve_creator_subset_name.png deleted file mode 100644 index 4a42c5af2c..0000000000 Binary files a/website/docs/assets/resolve_creator_subset_name.png and /dev/null differ diff --git a/website/docs/assets/resolve_fusion_menu.png b/website/docs/assets/resolve_fusion_menu.png deleted file mode 100644 index ae1939690c..0000000000 Binary files a/website/docs/assets/resolve_fusion_menu.png and /dev/null differ diff --git a/website/docs/assets/resolve_fusion_script_settings.png b/website/docs/assets/resolve_fusion_script_settings.png deleted file mode 100644 index 6d903b3ef4..0000000000 Binary files a/website/docs/assets/resolve_fusion_script_settings.png and /dev/null differ diff --git a/website/docs/assets/resolve_fusion_tab.png b/website/docs/assets/resolve_fusion_tab.png deleted file mode 100644 index 657d53cb16..0000000000 Binary files a/website/docs/assets/resolve_fusion_tab.png and /dev/null differ diff --git a/website/docs/assets/resolve_menu_openpype.png b/website/docs/assets/resolve_menu_openpype.png deleted file mode 100644 index 9812858072..0000000000 Binary files a/website/docs/assets/resolve_menu_openpype.png and /dev/null differ diff --git a/website/docs/assets/resolve_menu_openpype_opened.png b/website/docs/assets/resolve_menu_openpype_opened.png deleted file mode 100644 index 9b0e35569b..0000000000 Binary files a/website/docs/assets/resolve_menu_openpype_opened.png and /dev/null differ diff --git a/website/docs/assets/resolve_publish_instance_other_plateSubsets.png b/website/docs/assets/resolve_publish_instance_other_plateSubsets.png deleted file mode 100644 index fd5f857da5..0000000000 Binary files a/website/docs/assets/resolve_publish_instance_other_plateSubsets.png and /dev/null differ diff --git a/website/docs/assets/resolve_publish_instance_review_main.png b/website/docs/assets/resolve_publish_instance_review_main.png deleted file mode 100644 index 0cf5ed3b99..0000000000 Binary files a/website/docs/assets/resolve_publish_instance_review_main.png and /dev/null differ diff --git a/website/docs/assets/resolve_remame_track_names.png b/website/docs/assets/resolve_remame_track_names.png deleted file mode 100644 index 01174ea644..0000000000 Binary files a/website/docs/assets/resolve_remame_track_names.png and /dev/null differ diff --git a/website/docs/assets/resolve_select_clips_timeline_chocolate.png b/website/docs/assets/resolve_select_clips_timeline_chocolate.png deleted file mode 100644 index b4a682e83a..0000000000 Binary files a/website/docs/assets/resolve_select_clips_timeline_chocolate.png and /dev/null differ diff --git a/website/docs/assets/settings/Screenshot_1.png b/website/docs/assets/settings/Screenshot_1.png deleted file mode 100644 index 12c34e8f05..0000000000 Binary files a/website/docs/assets/settings/Screenshot_1.png and /dev/null differ diff --git a/website/docs/assets/settings/anatomy_01.png b/website/docs/assets/settings/anatomy_01.png deleted file mode 100644 index 92b7e880d6..0000000000 Binary files a/website/docs/assets/settings/anatomy_01.png and /dev/null differ diff --git a/website/docs/assets/settings/anatomy_attributes.png b/website/docs/assets/settings/anatomy_attributes.png deleted file mode 100644 index 777b1c36ac..0000000000 Binary files a/website/docs/assets/settings/anatomy_attributes.png and /dev/null differ diff --git a/website/docs/assets/settings/anatomy_roots01.png b/website/docs/assets/settings/anatomy_roots01.png deleted file mode 100644 index 56cda7345b..0000000000 Binary files a/website/docs/assets/settings/anatomy_roots01.png and /dev/null differ diff --git a/website/docs/assets/settings/anatomy_roots02.png b/website/docs/assets/settings/anatomy_roots02.png deleted file mode 100644 index e55793118f..0000000000 Binary files a/website/docs/assets/settings/anatomy_roots02.png and /dev/null differ diff --git a/website/docs/assets/settings/anatomy_roots03.png b/website/docs/assets/settings/anatomy_roots03.png deleted file mode 100644 index 9c47a189fe..0000000000 Binary files a/website/docs/assets/settings/anatomy_roots03.png and /dev/null differ diff --git a/website/docs/assets/settings/anatomy_tasks.png b/website/docs/assets/settings/anatomy_tasks.png deleted file mode 100644 index 16265cf8eb..0000000000 Binary files a/website/docs/assets/settings/anatomy_tasks.png and /dev/null differ diff --git a/website/docs/assets/settings/applications_01.png b/website/docs/assets/settings/applications_01.png deleted file mode 100644 index c82a9e0d0f..0000000000 Binary files a/website/docs/assets/settings/applications_01.png and /dev/null differ diff --git a/website/docs/assets/settings/colours_01.png b/website/docs/assets/settings/colours_01.png deleted file mode 100644 index 927c6e0a2b..0000000000 Binary files a/website/docs/assets/settings/colours_01.png and /dev/null differ diff --git a/website/docs/assets/settings/colours_02.png b/website/docs/assets/settings/colours_02.png deleted file mode 100644 index b304fa35f3..0000000000 Binary files a/website/docs/assets/settings/colours_02.png and /dev/null differ diff --git a/website/docs/assets/settings/override_breadcrumbs.png b/website/docs/assets/settings/override_breadcrumbs.png deleted file mode 100644 index 03eea756ef..0000000000 Binary files a/website/docs/assets/settings/override_breadcrumbs.png and /dev/null differ diff --git a/website/docs/assets/settings/settings_addapplication.gif b/website/docs/assets/settings/settings_addapplication.gif deleted file mode 100644 index fa617c7c27..0000000000 Binary files a/website/docs/assets/settings/settings_addapplication.gif and /dev/null differ diff --git a/website/docs/assets/settings/settings_addappversion.gif b/website/docs/assets/settings/settings_addappversion.gif deleted file mode 100644 index 573dd407b3..0000000000 Binary files a/website/docs/assets/settings/settings_addappversion.gif and /dev/null differ diff --git a/website/docs/assets/settings/settings_colour_coding.png b/website/docs/assets/settings/settings_colour_coding.png deleted file mode 100644 index 8388cf7c67..0000000000 Binary files a/website/docs/assets/settings/settings_colour_coding.png and /dev/null differ diff --git a/website/docs/assets/settings/settings_local.png b/website/docs/assets/settings/settings_local.png deleted file mode 100644 index 725c332747..0000000000 Binary files a/website/docs/assets/settings/settings_local.png and /dev/null differ diff --git a/website/docs/assets/settings/settings_system_general.png b/website/docs/assets/settings/settings_system_general.png deleted file mode 100644 index a2a684caea..0000000000 Binary files a/website/docs/assets/settings/settings_system_general.png and /dev/null differ diff --git a/website/docs/assets/settings/settings_system_version_downgrade.png b/website/docs/assets/settings/settings_system_version_downgrade.png deleted file mode 100644 index e3a5d7f499..0000000000 Binary files a/website/docs/assets/settings/settings_system_version_downgrade.png and /dev/null differ diff --git a/website/docs/assets/settings/settings_system_version_update.png b/website/docs/assets/settings/settings_system_version_update.png deleted file mode 100644 index 50adbab173..0000000000 Binary files a/website/docs/assets/settings/settings_system_version_update.png and /dev/null differ diff --git a/website/docs/assets/settings/studio_defaults.gif b/website/docs/assets/settings/studio_defaults.gif deleted file mode 100644 index 4825e60501..0000000000 Binary files a/website/docs/assets/settings/studio_defaults.gif and /dev/null differ diff --git a/website/docs/assets/settings/studio_defaults_remove.gif b/website/docs/assets/settings/studio_defaults_remove.gif deleted file mode 100644 index cedd9803d4..0000000000 Binary files a/website/docs/assets/settings/studio_defaults_remove.gif and /dev/null differ diff --git a/website/docs/assets/settings/template_build_workfile.png b/website/docs/assets/settings/template_build_workfile.png deleted file mode 100644 index 1bea5b01f5..0000000000 Binary files a/website/docs/assets/settings/template_build_workfile.png and /dev/null differ diff --git a/website/docs/assets/settings/tools_01.png b/website/docs/assets/settings/tools_01.png deleted file mode 100644 index 9837309994..0000000000 Binary files a/website/docs/assets/settings/tools_01.png and /dev/null differ diff --git a/website/docs/assets/settings_dev.png b/website/docs/assets/settings_dev.png deleted file mode 100644 index 4d0359461e..0000000000 Binary files a/website/docs/assets/settings_dev.png and /dev/null differ diff --git a/website/docs/assets/site_sync_always_on.png b/website/docs/assets/site_sync_always_on.png deleted file mode 100644 index 712adf173b..0000000000 Binary files a/website/docs/assets/site_sync_always_on.png and /dev/null differ diff --git a/website/docs/assets/site_sync_gdrive_user.png b/website/docs/assets/site_sync_gdrive_user.png deleted file mode 100644 index cfffcc644c..0000000000 Binary files a/website/docs/assets/site_sync_gdrive_user.png and /dev/null differ diff --git a/website/docs/assets/site_sync_loader.png b/website/docs/assets/site_sync_loader.png deleted file mode 100644 index 8792f6c9d9..0000000000 Binary files a/website/docs/assets/site_sync_loader.png and /dev/null differ diff --git a/website/docs/assets/site_sync_local_setting.png b/website/docs/assets/site_sync_local_setting.png deleted file mode 100644 index 6af1b8aaca..0000000000 Binary files a/website/docs/assets/site_sync_local_setting.png and /dev/null differ diff --git a/website/docs/assets/site_sync_project_settings.png b/website/docs/assets/site_sync_project_settings.png deleted file mode 100644 index 3b31566616..0000000000 Binary files a/website/docs/assets/site_sync_project_settings.png and /dev/null differ diff --git a/website/docs/assets/site_sync_project_sftp_settings.png b/website/docs/assets/site_sync_project_sftp_settings.png deleted file mode 100644 index 79267ba1d7..0000000000 Binary files a/website/docs/assets/site_sync_project_sftp_settings.png and /dev/null differ diff --git a/website/docs/assets/site_sync_sftp_project_setting_not_forced.png b/website/docs/assets/site_sync_sftp_project_setting_not_forced.png deleted file mode 100644 index 7bd735b46c..0000000000 Binary files a/website/docs/assets/site_sync_sftp_project_setting_not_forced.png and /dev/null differ diff --git a/website/docs/assets/site_sync_sftp_settings_local.png b/website/docs/assets/site_sync_sftp_settings_local.png deleted file mode 100644 index 45125da1a8..0000000000 Binary files a/website/docs/assets/site_sync_sftp_settings_local.png and /dev/null differ diff --git a/website/docs/assets/site_sync_sftp_system.png b/website/docs/assets/site_sync_sftp_system.png deleted file mode 100644 index 6e8e125f95..0000000000 Binary files a/website/docs/assets/site_sync_sftp_system.png and /dev/null differ diff --git a/website/docs/assets/site_sync_sync_queue.png b/website/docs/assets/site_sync_sync_queue.png deleted file mode 100644 index 0fc7d0491d..0000000000 Binary files a/website/docs/assets/site_sync_sync_queue.png and /dev/null differ diff --git a/website/docs/assets/site_sync_system.png b/website/docs/assets/site_sync_system.png deleted file mode 100644 index 0c455eca37..0000000000 Binary files a/website/docs/assets/site_sync_system.png and /dev/null differ diff --git a/website/docs/assets/site_sync_system_sites.png b/website/docs/assets/site_sync_system_sites.png deleted file mode 100644 index e9f895c743..0000000000 Binary files a/website/docs/assets/site_sync_system_sites.png and /dev/null differ diff --git a/website/docs/assets/slack_project.png b/website/docs/assets/slack_project.png deleted file mode 100644 index 417cdab2de..0000000000 Binary files a/website/docs/assets/slack_project.png and /dev/null differ diff --git a/website/docs/assets/slack_system.png b/website/docs/assets/slack_system.png deleted file mode 100644 index 31183206c9..0000000000 Binary files a/website/docs/assets/slack_system.png and /dev/null differ diff --git a/website/docs/assets/slack_token.png b/website/docs/assets/slack_token.png deleted file mode 100644 index b88b35deb3..0000000000 Binary files a/website/docs/assets/slack_token.png and /dev/null differ diff --git a/website/docs/assets/substancepainter_pbrmetallicroughness_export_preset.png b/website/docs/assets/substancepainter_pbrmetallicroughness_export_preset.png deleted file mode 100644 index 35a4545f83..0000000000 Binary files a/website/docs/assets/substancepainter_pbrmetallicroughness_export_preset.png and /dev/null differ diff --git a/website/docs/assets/substancepainter_pbrmetallicroughness_published.png b/website/docs/assets/substancepainter_pbrmetallicroughness_published.png deleted file mode 100644 index 15b0e5b876..0000000000 Binary files a/website/docs/assets/substancepainter_pbrmetallicroughness_published.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_delivery_loader.png b/website/docs/assets/tools/tools_delivery_loader.png deleted file mode 100644 index 511cd24fbb..0000000000 Binary files a/website/docs/assets/tools/tools_delivery_loader.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_library_1-small.png b/website/docs/assets/tools/tools_library_1-small.png deleted file mode 100644 index 557b432950..0000000000 Binary files a/website/docs/assets/tools/tools_library_1-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_library_2-small.png b/website/docs/assets/tools/tools_library_2-small.png deleted file mode 100644 index cf1c6728b0..0000000000 Binary files a/website/docs/assets/tools/tools_library_2-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_1.png b/website/docs/assets/tools/tools_loader_1.png deleted file mode 100644 index 5ec062884d..0000000000 Binary files a/website/docs/assets/tools/tools_loader_1.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_20.png b/website/docs/assets/tools/tools_loader_20.png deleted file mode 100644 index 7bf032d1f9..0000000000 Binary files a/website/docs/assets/tools/tools_loader_20.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_21.png b/website/docs/assets/tools/tools_loader_21.png deleted file mode 100644 index b27b2e65b8..0000000000 Binary files a/website/docs/assets/tools/tools_loader_21.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_22.png b/website/docs/assets/tools/tools_loader_22.png deleted file mode 100644 index d855568bd8..0000000000 Binary files a/website/docs/assets/tools/tools_loader_22.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_30-small.png b/website/docs/assets/tools/tools_loader_30-small.png deleted file mode 100644 index b71add78f1..0000000000 Binary files a/website/docs/assets/tools/tools_loader_30-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_30.png b/website/docs/assets/tools/tools_loader_30.png deleted file mode 100644 index 56f9f89061..0000000000 Binary files a/website/docs/assets/tools/tools_loader_30.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_4-small.png b/website/docs/assets/tools/tools_loader_4-small.png deleted file mode 100644 index 933da125e4..0000000000 Binary files a/website/docs/assets/tools/tools_loader_4-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_4.png b/website/docs/assets/tools/tools_loader_4.png deleted file mode 100644 index 47f221c4cc..0000000000 Binary files a/website/docs/assets/tools/tools_loader_4.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_40-small.png b/website/docs/assets/tools/tools_loader_40-small.png deleted file mode 100644 index a352dbf78a..0000000000 Binary files a/website/docs/assets/tools/tools_loader_40-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_40.png b/website/docs/assets/tools/tools_loader_40.png deleted file mode 100644 index b3ad681ce4..0000000000 Binary files a/website/docs/assets/tools/tools_loader_40.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_41-small.png b/website/docs/assets/tools/tools_loader_41-small.png deleted file mode 100644 index 8f8a27c649..0000000000 Binary files a/website/docs/assets/tools/tools_loader_41-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_41.png b/website/docs/assets/tools/tools_loader_41.png deleted file mode 100644 index 332634fffc..0000000000 Binary files a/website/docs/assets/tools/tools_loader_41.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_5-small.png b/website/docs/assets/tools/tools_loader_5-small.png deleted file mode 100644 index f2c5d53de1..0000000000 Binary files a/website/docs/assets/tools/tools_loader_5-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_5.png b/website/docs/assets/tools/tools_loader_5.png deleted file mode 100644 index 12eb38a806..0000000000 Binary files a/website/docs/assets/tools/tools_loader_5.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_loader_50.png b/website/docs/assets/tools/tools_loader_50.png deleted file mode 100644 index 625adbc0a1..0000000000 Binary files a/website/docs/assets/tools/tools_loader_50.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_10-small.png b/website/docs/assets/tools/tools_scene_inventory_10-small.png deleted file mode 100644 index 52830b21e4..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_10-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_20.png b/website/docs/assets/tools/tools_scene_inventory_20.png deleted file mode 100644 index ec92c4bd69..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_20.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_30.png b/website/docs/assets/tools/tools_scene_inventory_30.png deleted file mode 100644 index 27c1b05ffa..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_30.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_40.png b/website/docs/assets/tools/tools_scene_inventory_40.png deleted file mode 100644 index c835a0bc42..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_40.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_50.png b/website/docs/assets/tools/tools_scene_inventory_50.png deleted file mode 100644 index 282d5267f4..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_50.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_54.png b/website/docs/assets/tools/tools_scene_inventory_54.png deleted file mode 100644 index bf9a034efd..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_54.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_55.png b/website/docs/assets/tools/tools_scene_inventory_55.png deleted file mode 100644 index d99dd6eace..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_55.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_60-small.png b/website/docs/assets/tools/tools_scene_inventory_60-small.png deleted file mode 100644 index a2ae8f138b..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_60-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_60.png b/website/docs/assets/tools/tools_scene_inventory_60.png deleted file mode 100644 index 6dfd495ed9..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_60.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_61-small.png b/website/docs/assets/tools/tools_scene_inventory_61-small.png deleted file mode 100644 index 6edb1da148..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_61-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_61.png b/website/docs/assets/tools/tools_scene_inventory_61.png deleted file mode 100644 index b270db3fca..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_61.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_62-small.png b/website/docs/assets/tools/tools_scene_inventory_62-small.png deleted file mode 100644 index 8623a7c40e..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_62-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_62.png b/website/docs/assets/tools/tools_scene_inventory_62.png deleted file mode 100644 index 122c3a9e25..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_62.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_63-small.png b/website/docs/assets/tools/tools_scene_inventory_63-small.png deleted file mode 100644 index 58c8bb4fae..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_63-small.png and /dev/null differ diff --git a/website/docs/assets/tools/tools_scene_inventory_63.png b/website/docs/assets/tools/tools_scene_inventory_63.png deleted file mode 100644 index 5be8c8f70e..0000000000 Binary files a/website/docs/assets/tools/tools_scene_inventory_63.png and /dev/null differ diff --git a/website/docs/assets/tools_context_manager.png b/website/docs/assets/tools_context_manager.png deleted file mode 100644 index badf7b00bf..0000000000 Binary files a/website/docs/assets/tools_context_manager.png and /dev/null differ diff --git a/website/docs/assets/tools_subset_manager.png b/website/docs/assets/tools_subset_manager.png deleted file mode 100644 index 6a1e48dbd5..0000000000 Binary files a/website/docs/assets/tools_subset_manager.png and /dev/null differ diff --git a/website/docs/assets/tvp_asset_loader_actions.png b/website/docs/assets/tvp_asset_loader_actions.png deleted file mode 100644 index dbc3734e10..0000000000 Binary files a/website/docs/assets/tvp_asset_loader_actions.png and /dev/null differ diff --git a/website/docs/assets/tvp_asset_loader_version.png b/website/docs/assets/tvp_asset_loader_version.png deleted file mode 100644 index b8052f3c84..0000000000 Binary files a/website/docs/assets/tvp_asset_loader_version.png and /dev/null differ diff --git a/website/docs/assets/tvp_color_groups.png b/website/docs/assets/tvp_color_groups.png deleted file mode 100644 index 558ff687c6..0000000000 Binary files a/website/docs/assets/tvp_color_groups.png and /dev/null differ diff --git a/website/docs/assets/tvp_color_groups2.png b/website/docs/assets/tvp_color_groups2.png deleted file mode 100644 index 7ab6775769..0000000000 Binary files a/website/docs/assets/tvp_color_groups2.png and /dev/null differ diff --git a/website/docs/assets/tvp_create_layer.png b/website/docs/assets/tvp_create_layer.png deleted file mode 100644 index 25081bdf46..0000000000 Binary files a/website/docs/assets/tvp_create_layer.png and /dev/null differ diff --git a/website/docs/assets/tvp_create_pass.png b/website/docs/assets/tvp_create_pass.png deleted file mode 100644 index 6c8e600af2..0000000000 Binary files a/website/docs/assets/tvp_create_pass.png and /dev/null differ diff --git a/website/docs/assets/tvp_hidden_window.gif b/website/docs/assets/tvp_hidden_window.gif deleted file mode 100644 index b1adaa75b8..0000000000 Binary files a/website/docs/assets/tvp_hidden_window.gif and /dev/null differ diff --git a/website/docs/assets/tvp_library.gif b/website/docs/assets/tvp_library.gif deleted file mode 100644 index 14de86cdb5..0000000000 Binary files a/website/docs/assets/tvp_library.gif and /dev/null differ diff --git a/website/docs/assets/tvp_loader.gif b/website/docs/assets/tvp_loader.gif deleted file mode 100644 index 5775460372..0000000000 Binary files a/website/docs/assets/tvp_loader.gif and /dev/null differ diff --git a/website/docs/assets/tvp_openpype_menu.png b/website/docs/assets/tvp_openpype_menu.png deleted file mode 100644 index 23eaf33fc3..0000000000 Binary files a/website/docs/assets/tvp_openpype_menu.png and /dev/null differ diff --git a/website/docs/assets/tvp_permission.png b/website/docs/assets/tvp_permission.png deleted file mode 100644 index e47d9841b6..0000000000 Binary files a/website/docs/assets/tvp_permission.png and /dev/null differ diff --git a/website/docs/assets/tvp_permission2.png b/website/docs/assets/tvp_permission2.png deleted file mode 100644 index 827e85db39..0000000000 Binary files a/website/docs/assets/tvp_permission2.png and /dev/null differ diff --git a/website/docs/assets/tvp_publisher.png b/website/docs/assets/tvp_publisher.png deleted file mode 100644 index e5b1f936df..0000000000 Binary files a/website/docs/assets/tvp_publisher.png and /dev/null differ diff --git a/website/docs/assets/tvp_pyblish.png b/website/docs/assets/tvp_pyblish.png deleted file mode 100644 index 88423a3c75..0000000000 Binary files a/website/docs/assets/tvp_pyblish.png and /dev/null differ diff --git a/website/docs/assets/tvp_pyblish_render.png b/website/docs/assets/tvp_pyblish_render.png deleted file mode 100644 index 7d279c3aa0..0000000000 Binary files a/website/docs/assets/tvp_pyblish_render.png and /dev/null differ diff --git a/website/docs/assets/tvp_render_pass.png b/website/docs/assets/tvp_render_pass.png deleted file mode 100644 index 07790af7b2..0000000000 Binary files a/website/docs/assets/tvp_render_pass.png and /dev/null differ diff --git a/website/docs/assets/tvp_scene_inventory.png b/website/docs/assets/tvp_scene_inventory.png deleted file mode 100644 index 25c717b331..0000000000 Binary files a/website/docs/assets/tvp_scene_inventory.png and /dev/null differ diff --git a/website/docs/assets/tvp_subset_manager.png b/website/docs/assets/tvp_subset_manager.png deleted file mode 100644 index 1ffbead4ba..0000000000 Binary files a/website/docs/assets/tvp_subset_manager.png and /dev/null differ diff --git a/website/docs/assets/tvp_timeline_color.png b/website/docs/assets/tvp_timeline_color.png deleted file mode 100644 index 6d00d4c8af..0000000000 Binary files a/website/docs/assets/tvp_timeline_color.png and /dev/null differ diff --git a/website/docs/assets/tvp_timeline_color2.png b/website/docs/assets/tvp_timeline_color2.png deleted file mode 100644 index e20e190471..0000000000 Binary files a/website/docs/assets/tvp_timeline_color2.png and /dev/null differ diff --git a/website/docs/assets/tvp_write_file.png b/website/docs/assets/tvp_write_file.png deleted file mode 100644 index 109e6badc9..0000000000 Binary files a/website/docs/assets/tvp_write_file.png and /dev/null differ diff --git a/website/docs/assets/unreal_add_level.png b/website/docs/assets/unreal_add_level.png deleted file mode 100644 index caeef03d10..0000000000 Binary files a/website/docs/assets/unreal_add_level.png and /dev/null differ diff --git a/website/docs/assets/unreal_container.jpg b/website/docs/assets/unreal_container.jpg deleted file mode 100644 index 0fda640b00..0000000000 Binary files a/website/docs/assets/unreal_container.jpg and /dev/null differ diff --git a/website/docs/assets/unreal_create_render.png b/website/docs/assets/unreal_create_render.png deleted file mode 100644 index 2e3ef20b35..0000000000 Binary files a/website/docs/assets/unreal_create_render.png and /dev/null differ diff --git a/website/docs/assets/unreal_layout_loading_no_sequence.png b/website/docs/assets/unreal_layout_loading_no_sequence.png deleted file mode 100644 index ed05d77f53..0000000000 Binary files a/website/docs/assets/unreal_layout_loading_no_sequence.png and /dev/null differ diff --git a/website/docs/assets/unreal_layout_loading_result.png b/website/docs/assets/unreal_layout_loading_result.png deleted file mode 100644 index 55b329110b..0000000000 Binary files a/website/docs/assets/unreal_layout_loading_result.png and /dev/null differ diff --git a/website/docs/assets/unreal_level_list.png b/website/docs/assets/unreal_level_list.png deleted file mode 100644 index 2fc0c1bfc7..0000000000 Binary files a/website/docs/assets/unreal_level_list.png and /dev/null differ diff --git a/website/docs/assets/unreal_level_list_no_sequences.png b/website/docs/assets/unreal_level_list_no_sequences.png deleted file mode 100644 index 7ed912b68b..0000000000 Binary files a/website/docs/assets/unreal_level_list_no_sequences.png and /dev/null differ diff --git a/website/docs/assets/unreal_level_streaming_method.png b/website/docs/assets/unreal_level_streaming_method.png deleted file mode 100644 index 8f817abd2e..0000000000 Binary files a/website/docs/assets/unreal_level_streaming_method.png and /dev/null differ diff --git a/website/docs/assets/unreal_level_streaming_method_no_sequences.png b/website/docs/assets/unreal_level_streaming_method_no_sequences.png deleted file mode 100644 index 77a2754ded..0000000000 Binary files a/website/docs/assets/unreal_level_streaming_method_no_sequences.png and /dev/null differ diff --git a/website/docs/assets/unreal_load_layout.png b/website/docs/assets/unreal_load_layout.png deleted file mode 100644 index ffad60ae9b..0000000000 Binary files a/website/docs/assets/unreal_load_layout.png and /dev/null differ diff --git a/website/docs/assets/unreal_load_layout_batch.png b/website/docs/assets/unreal_load_layout_batch.png deleted file mode 100644 index dd2f2f3e8f..0000000000 Binary files a/website/docs/assets/unreal_load_layout_batch.png and /dev/null differ diff --git a/website/docs/assets/unreal_openpype_tools.png b/website/docs/assets/unreal_openpype_tools.png deleted file mode 100644 index bf7d850ab2..0000000000 Binary files a/website/docs/assets/unreal_openpype_tools.png and /dev/null differ diff --git a/website/docs/assets/unreal_openpype_tools_create.png b/website/docs/assets/unreal_openpype_tools_create.png deleted file mode 100644 index 9cfb95f2a1..0000000000 Binary files a/website/docs/assets/unreal_openpype_tools_create.png and /dev/null differ diff --git a/website/docs/assets/unreal_openpype_tools_load.png b/website/docs/assets/unreal_openpype_tools_load.png deleted file mode 100644 index 4909feac3b..0000000000 Binary files a/website/docs/assets/unreal_openpype_tools_load.png and /dev/null differ diff --git a/website/docs/assets/unreal_openpype_tools_manage.png b/website/docs/assets/unreal_openpype_tools_manage.png deleted file mode 100644 index af7b182842..0000000000 Binary files a/website/docs/assets/unreal_openpype_tools_manage.png and /dev/null differ diff --git a/website/docs/assets/unreal_openpype_tools_publish.png b/website/docs/assets/unreal_openpype_tools_publish.png deleted file mode 100644 index ab4c10c4ca..0000000000 Binary files a/website/docs/assets/unreal_openpype_tools_publish.png and /dev/null differ diff --git a/website/docs/assets/unreal_openpype_tools_render.png b/website/docs/assets/unreal_openpype_tools_render.png deleted file mode 100644 index 377dc2951e..0000000000 Binary files a/website/docs/assets/unreal_openpype_tools_render.png and /dev/null differ diff --git a/website/docs/assets/unreal_publish_render.png b/website/docs/assets/unreal_publish_render.png deleted file mode 100644 index 674b0ac30e..0000000000 Binary files a/website/docs/assets/unreal_publish_render.png and /dev/null differ diff --git a/website/docs/assets/unreal_setting_level_sequence.png b/website/docs/assets/unreal_setting_level_sequence.png deleted file mode 100644 index 5a8adc6257..0000000000 Binary files a/website/docs/assets/unreal_setting_level_sequence.png and /dev/null differ diff --git a/website/docs/assets/workfiles_1.png b/website/docs/assets/workfiles_1.png deleted file mode 100644 index bcc74fb4b8..0000000000 Binary files a/website/docs/assets/workfiles_1.png and /dev/null differ diff --git a/website/docs/assets/workfiles_2.png b/website/docs/assets/workfiles_2.png deleted file mode 100644 index 1baf455587..0000000000 Binary files a/website/docs/assets/workfiles_2.png and /dev/null differ diff --git a/website/docs/dev_blender.md b/website/docs/dev_blender.md deleted file mode 100644 index bed0e4a09d..0000000000 --- a/website/docs/dev_blender.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: dev_blender -title: Blender integration -sidebar_label: Blender integration -toc_max_heading_level: 4 ---- - -## Run python script at launch -In case you need to execute a python script when Blender is started (aka [`-P`](https://docs.blender.org/manual/en/latest/advanced/command_line/arguments.html#python-options)), for example to programmatically modify a blender file for conformation, you can create an OpenPype hook as follows: - -```python -from openpype.hosts.blender.hooks import pre_add_run_python_script_arg -from openpype.lib import PreLaunchHook - - -class MyHook(PreLaunchHook): - """Add python script to be executed before Blender launch.""" - - order = pre_add_run_python_script_arg.AddPythonScriptToLaunchArgs.order - 1 - app_groups = [ - "blender", - ] - - def execute(self): - self.launch_context.data.setdefault("python_scripts", []).append( - "/path/to/my_script.py" - ) -``` - -You can write a bare python script, as you could run into the [Text Editor](https://docs.blender.org/manual/en/latest/editors/text_editor.html). - -### Python script with arguments -#### Adding arguments -In case you need to pass arguments to your script, you can append them to `self.launch_context.data["script_args"]`: - -```python -self.launch_context.data.setdefault("script_args", []).append( - "--my-arg", - "value", - ) -``` - -#### Parsing arguments -You can parse arguments in your script using [argparse](https://docs.python.org/3/library/argparse.html) as follows: - -```python -import argparse - -parser = argparse.ArgumentParser( - description="Parsing arguments for my_script.py" -) -parser.add_argument( - "--my-arg", - nargs="?", - help="My argument", -) -args, unknown = arg_parser.parse_known_args( - sys.argv[sys.argv.index("--") + 1 :] -) -print(args.my_arg) -``` diff --git a/website/docs/dev_build.md b/website/docs/dev_build.md deleted file mode 100644 index a1af8a86f7..0000000000 --- a/website/docs/dev_build.md +++ /dev/null @@ -1,421 +0,0 @@ ---- -id: dev_build -title: Build OpenPYPE from source -sidebar_label: Build ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## Introduction - -To build Pype you currently need (on all platforms): - -- **[Python 3.9](https://www.python.org/downloads/)** as we are following [vfx platform CY2022](https://vfxplatform.com). -- **[git](https://git-scm.com/downloads)** - -We use [CX_Freeze](https://cx-freeze.readthedocs.io/en/latest) to freeze the code and all dependencies and -[Poetry](https://python-poetry.org/) for virtual environment management. - -This is outline of build steps. Most of them are done automatically via scripts: -- Virtual environment is created using **Poetry** in `.venv` -- Necessary python modules outside of `.venv` are stored to `./vendor/python` (like `PySide2`) -- Necessary third-party tools (like [ffmpeg](https://www.ffmpeg.org/), [OpenImageIO](https://github.com/OpenImageIO/oiio) - and [usd libraries](https://developer.nvidia.com/usd)) are downloaded to `./vendor/bin` -- OpenPype code is frozen with **cx_freeze** to `./build` -- Modules are moved from `lib` to `dependencies` to solve some Python 2 / Python 3 clashes -- On Mac application bundle and dmg image will be created from built code. -- On Windows, you can create executable installer with `./tools/build_win_installer.ps1` - -### Clone OpenPype repository: -```powershell -git clone --recurse-submodules https://github.com/pypeclub/OpenPype.git -``` - -## Platform specific steps - - - - - -### Windows -More tools might be needed for installing some dependencies (for example for **OpenTimelineIO**) - mostly -development tools like [CMake](https://cmake.org/) and [Visual Studio](https://visualstudio.microsoft.com/cs/downloads/) - -#### Run from source - -For development purposes it is possible to run OpenPype directly from the source. We provide a simple launcher script for this. To run the powershell scripts you may have to enable unrestricted execution as administrator: - -`Set-ExecutionPolicy -ExecutionPolicy unrestricted` - -To start OpenPype from source you need to - -1. Run `.\tools\create_env.ps1` to create virtual environment in `.venv` -2. Run `.\tools\fetch_thirdparty_libs.ps1` to get **PySide2**, **ffmpeg**, **oiio** and other tools needed. -3. Run `.\tools\run_tray.ps1` if you have all required dependencies on your machine you should be greeted with OpenPype igniter window and once you give it your Mongo URL, with OpenPype icon in the system tray. - -Step 1 and 2 needs to be run only once (or when something was changed). - -#### To build OpenPype: -1. Run `.\tools\create_env.ps1` to create virtual environment in `.venv` -2. Run `.\tools\fetch_thirdparty_libs.ps1` to get **PySide2**, **ffmpeg**, **oiio** and other tools needed. -3. `.\tools\build.ps1` to build OpenPype to `.\build` - - -To create distributable OpenPype versions, run `.\tools\create_zip.ps1` - that will -create zip file with name `pype-vx.x.x.zip` parsed from current pype repository and -copy it to user data dir. You can specify `--path \path\to\zip` to force it into a different -location. This can be used to prepare new version releases for artists in the studio environment -without the need to re-build the whole package - - - - - - -### Linux - -#### Docker -You can use Docker to build OpenPype. Just run: -```shell -$ sudo ./tools/docker_build.sh -``` - -This will by default use Debian as base image. If you need to make Centos 7 compatible build, please run: - -```sh -sudo ./tools/docker_build.sh centos7 -``` - -and you should have built OpenPype in `build` directory. It is using **Centos 7** -as a base image. - -You can pull the image: - -```shell -# replace 3.0.0 tag with version you want -$ docker pull pypeclub/openpype:3.0.0 -``` -See https://hub.docker.com/r/pypeclub/openpype/tag for more. - -Beware that as Python is built against some libraries version in Centos 7 base image, -those might not be available in linux version you are using. We try to handle those we -found (libffi, libcrypto/ssl, etc.) but there might be more. - -#### Manual build - -To build OpenPype on Linux you will need: - -- **[curl](https://curl.se)** on systems that doesn't have one preinstalled. -- **bzip2**, **readline**, **sqlite3** and other libraries. - -Because some Linux distros come with older Python version pre-installed, you might -need to install **3.9** version and make use of it explicitly. -Your best bet is probably using [pyenv](https://github.com/pyenv/pyenv). - -You can use your package manager to install **git** and other packages to your build -environment. - -#### Common steps for all Distros - -Use pyenv to prepare Python version for Pype build - -```shell -$ curl https://pyenv.run | bash - -# you can add those to ~/.bashrc -$ export PATH="$HOME/.pyenv/bin:$PATH" -$ eval "$(pyenv init -)" -$ eval "$(pyenv virtualenv-init -)" - -# reload shell -$ exec $SHELL - -# install Python 3.9.6 -# python will be downloaded and build so please make sure -# you have all necessary requirements installed (see below). -$ pyenv install -v 3.9.6 - -# change path to pype 3 -$ cd /path/to/pype-3 - -# set local python version -$ pyenv local 3.9.6 -``` -:::note Install build requirements for **Ubuntu** - -```shell -sudo apt-get update; sudo apt-get install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git patchelf -``` - -In case you run in error about `xcb` when running Pype, -you'll need also additional libraries for Qt5: - -```shell -sudo apt install qt5-default -``` -::: - -:::note Install build requirements for **Centos 7** - -```shell -$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -$ sudo yum install centos-release-scl -$ sudo yum install bash which git devtoolset-7-gcc* \ - make cmake curl wget gcc zlib-devel bzip2 \ - bzip2-devel readline-devel sqlite sqlite-devel \ - openssl-devel tk-devel libffi-devel qt5-qtbase-devel \ - patchelf -``` -::: - -:::note Install build requirements for other distros - -Build process usually needs some reasonably recent versions of libraries and tools. You -can follow what's needed for Ubuntu and change it for your package manager. Centos 7 steps -have additional magic to overcame very old versions. -::: - -For more information about setting your build environment please refer to [pyenv suggested build environment](https://github.com/pyenv/pyenv/wiki#suggested-build-environment). - - -#### To build Pype: -1. Run `./tools/create_env.sh` to create virtual environment in `./venv` -2. Run `./tools/fetch_thirdparty_libs.sh` to get **PySide2**, **ffmpeg**, **oiio** and other tools needed. -3. Run `./tools/build.sh` to build pype executables in `.\build\` - - - - -### MacOS -To build pype on MacOS you will need: - -- **[Homebrew](https://brew.sh)** - easy way of installing everything necessary. -- **[CMake](https://cmake.org/)** to build some external OpenPype dependencies. -- **XCode Command Line Tools** (or some other build system) -- **[create-dmg](https://formulae.brew.sh/formula/create-dmg)** to create dmg image from application -bundle. - -1) Install **Homebrew**: -```shell -$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -``` - -2) Install **cmake**: -```shell -$ brew install cmake -``` - -3) Install [pyenv](https://github.com/pyenv/pyenv): -```shell -$ brew install pyenv -$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc -$ pyenv init -$ exec "$SHELL" -$ PATH=$(pyenv root)/shims:$PATH -``` - -4) Pull in required Python version 3.9.x -```shell -# install Python build dependences -$ brew install openssl readline sqlite3 xz zlib - -# replace with up-to-date 3.9.x version -$ pyenv install 3.9.6 -``` - -5) Set local Python version -```shell -# switch to Pype source directory -$ pyenv local 3.9.6 -``` - -6) Install `create-dmg` -```shell -$ brew install create-dmg -``` - -#### To build Pype: - -1. Run `./tools/create_env.sh` to create virtual environment in `./venv`. -2. Run `./tools/fetch_thirdparty_libs.sh` to get **ffmpeg**, **oiio** and other tools needed. -3. Run `./tools/build.sh` to build OpenPype Application bundle in `./build/`. - - - - -## Adding dependencies -### Python modules -If you are extending OpenPype and you need some new modules not included, you can add them -to `pyproject.toml` to `[tool.poetry.dependencies]` section. - -```toml title="/pyproject.toml" -[tool.poetry.dependencies] -python = "3.9.*" -aiohttp = "^3.7" -aiohttp_json_rpc = "*" # TVPaint server -acre = { git = "https://github.com/pypeclub/acre.git" } -opentimelineio = { version = "0.14.0.dev1", source = "openpype" } -#... -``` -It is useful to add comment to it so others can see why this was added and where it is used. -As you can see you can add git repositories or custom wheels (those must be -added to `[[tool.poetry.source]]` section). - -To add something only for specific platform, you can use markers like: -```toml title="Install pywin32 only on Windows" -pywin32 = { version = "300", markers = "sys_platform == 'win32'" } -``` - -For more information see [Poetry documentation](https://python-poetry.org/docs/dependency-specification/). - -### Python modules as thirdparty -There are some python modules that can be available only in OpenPype and should not be propagated to any subprocess. -Best example is **PySide2** which is required to run OpenPype but can be used only in OpenPype and should not be in PYTHONPATH for most of host applications. -We've decided to separate these breaking dependencies to be able run OpenPype from code and from build the same way. - -:::warning -**PySide2** has handled special cases related to it's build process. -### Linux -- We're fixing rpath of shared objects on linux which is modified during cx freeze processing. -### MacOS -- **QtSql** libraries are removed on MacOS because their dependencies are not available and would require to modify rpath of Postgre library. -::: - -### Binary dependencies -To add some binary tool or something that doesn't fit standard Python distribution methods, you -can use [fetch_thirdparty_libs](#fetch_thirdparty_libs) script. It will take things defined in -`pyproject.toml` under `[openpype]` section like this: - -```toml title="/pyproject.toml" -[openpype] - -[openpype.thirdparty.ffmpeg.windows] -url = "https://distribute.openpype.io/thirdparty/ffmpeg-4.4-windows.zip" -hash = "dd51ba29d64ee238e7c4c3c7301b19754c3f0ee2e2a729c20a0e2789e72db925" -# ... -``` -This defines FFMpeg for Windows. It will be downloaded from specified url, its checksum will -be validated (it's sha256) and it will be extracted to `/vendor/bin/ffmpeg/windows` (partly taken -from its section name). - -## Script tools -(replace extension with the one for your system - `ps1` for windows, `sh` for linux/macos) - -### build -This will build OpenPype to `build` directory. If virtual environment is not created yet, it will -install [Poetry](https://python-poetry.org/) and using it download and install necessary -packages needed for build. It is recommended that you run [fetch_thirdparty_libs](#fetch_thirdparty_libs) -to download FFMpeg, OpenImageIO and others that are needed by OpenPype and are copied during the build. - -#### Arguments -`--no-submodule-update` - to disable updating submodules. This allows to make custom-builds for testing -feature changes in submodules. - -### build_win_installer -This will take already existing build in `build` directory and create executable installer using -[Inno Setup](https://jrsoftware.org/isinfo.php) and definitions in `./inno_setup.iss`. You need OpenPype -build using [build script](#build), Inno Setup installed and in PATH before running this script. - -:::note -Windows only -::: - -### create_env -Script to create virtual environment for build and running OpenPype from sources. It is using -[Poetry](https://python-poetry.org/). All dependencies are defined in `pyproject.toml`, resolved by -Poetry into `poetry.lock` file and then installed. Running this script without Poetry will download -it, install it to `.poetry` and then install virtual environment from `poetry.lock` file. If you want -to update packages version, just run `poetry update` or delete lock file. - -#### Arguments -`--verbose` - to increase verbosity of Poetry. This can be useful for debugging package conflicts. - -### create_zip -Script to create packaged OpenPype version from current sources. This will strip developer stuff and -package it into zip that can be used for [auto-updates for studio wide distributions](admin_distribute.md#automatic-updates), etc. -Same as: -```shell -poetry run python ./tools/create_zip.py -``` - -### docker_build.sh *[variant]* -Script to build OpenPype on [Docker](https://www.docker.com/) enabled systems - usually Linux and Windows -with [Docker Desktop](https://docs.docker.com/docker-for-windows/install/) -and [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/about) (WSL) installed. - -It must be run with administrative privileges - `sudo ./docker_build.sh`. - -It will use latest **Debian** base image to build OpenPype. If you need to build OpenPype for -older systems like Centos 7, use `centos7` as argument. This will use another Dockerfile to build -OpenPype with **Centos 7** as base image. - -You'll see your build in `./build` folder. - -### fetch_thirdparty_libs -This script will download necessary tools for OpenPype defined in `pyproject.toml` like FFMpeg, -OpenImageIO and USD libraries and put them to `./vendor/bin`. Those are then included in build. -Running it will overwrite everything on their respective paths. -Same as: -```shell -poetry run python ./tools/fetch_thirdparty_libs.py -``` - -### make_docs -Script will run [sphinx](https://www.sphinx-doc.org/) to build api documentation in html. You -should see it then under `./docs/build/html`. - -### run_documentation -This will start up [Docusaurus](https://docusaurus.io/) to display OpenPype user documentation. -Useful for offline browsing or editing documentation itself. You will need [Node.js](https://nodejs.org/) -and [Yarn](https://yarnpkg.com/) to run this script. After executing it, you'll see new -browser window with current OpenPype documentation. -Same as: -```shell -cd ./website -yarn start -``` - -### run_mongo -Helper script to run local mongoDB server for development and testing. You will need -[mongoDB server](https://www.mongodb.com/try/download/community) installed in standard location -or in PATH (standard location works only on Windows). It will start by default on port `2707` and -it will put its db files to `../mongo_db_data` relative to OpenPype sources. - -### run_project_manager -Helper script to start OpenPype Project Manager tool. -Same as: -```shell -poetry run python start.py projectmanager -``` - -### run_settings -Helper script to open OpenPype Settings UI. -Same as: -```shell -poetry run python start.py settings --dev -``` - -### run_tests -Runs OpenPype test suite. - -### run_tray -Helper script to run OpenPype Tray. -Same as: -```shell -poetry run python start.py tray -``` - -### update_submodules -Helper script to update OpenPype git submodules. -Same as: -```shell -git submodule update --recursive --remote -``` diff --git a/website/docs/dev_colorspace.md b/website/docs/dev_colorspace.md deleted file mode 100644 index cb07cb18a0..0000000000 --- a/website/docs/dev_colorspace.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -id: dev_colorspace -title: Colorspace Management and Distribution -sidebar_label: Colorspace ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## Introduction -Defines the distribution of colors and OCIO config during publishing. Once colorspace data are captured and integrated into representation loaders could use them for loading image and video data with correct colorspace. - -:::warning Color Management (ImageIO) -Adding the `imagio` settings schema is required for any host or module which is processing pixel data. -::: - -## Data model -Published representations that are extracted with color managed data store a **colorspaceData** entry in its data: `representation_doc["data"]["colorspaceData"]`. - -It's up to the Host implementation to pre-configure the application or workfile to have the correct OCIO config applied. -It's up to the Extractors to set these values for the representation during publishing. -It's up to the Loaders to read these values and apply the correct expected color space. - -### Keys -- **colorspace** - string value used in other publish plugins and loaders -- **config** - storing two versions of path. - - **path** - is formatted and with baked platform root. It is used for possible need to find out where we were sourcing color config during publishing. - - **template** - unformatted template resolved from settings. It is used for other plugins targeted to remote publish which could be processed at different platform. - -### Example - { - "colorspace": "linear", - "config": { - "path": "/abs/path/to/config.ocio", - "template": "{project[root]}/path/to/config.ocio" - } - } - - -## How to integrate it into a host -1. The settings for a host should add the `imagio` schema. Ideally near the top of all categories in its `/settings/entities/schemas/system_scheams/host_settings/schema_{host}.json` so it matches the settings layout other hosts. -```json -{ - "key": "imageio", - "type": "dict", - "label": "Color Management (ImageIO)", - "is_group": true, - "children": [ - { - "type": "schema", - "name": "schema_imageio_config" - }, - { - "type": "schema", - "name": "schema_imageio_file_rules" - } - - ] -} -``` - -2. Set the OCIO config path for the host to the path returned from `openpype.pipeline.colorspace.get_imageio_config`, for example: - - set the `OCIO` environment variable before launching the host via a prelaunch hook - - or (if the host allows) to set the workfile OCIO config path using the host's API - -3. Each Extractor exporting pixel data (e.g. image or video) has to inherit from the mixin class `openpype.pipeline.publish.publish_plugins.ColormanagedPyblishPluginMixin` and use `self.set_representation_colorspace` on the representations to be integrated. - -The **set_representation_colorspace** method adds `colorspaceData` to the representation. If the `colorspace` passed is not `None` then it is added directly to the representation with resolved config path otherwise a color space is assumed using the configured file rules. If no file rule matches the `colorspaceData` is **not** added to the representation. - -An example implementation can be found here: `openpype\hosts\nuke\plugins\publish\extract_render_local.py` - - -4. The Loader plug-ins should take into account the `colorspaceData` in the published representation's data to allow the DCC to read in the expected color space. -```python -from openpype.pipeline.colorspace import ( - get_imageio_colorspace_from_filepath, - get_imageio_config, - get_imageio_file_rules -) - -class YourLoader(api.Loader): - def load(self, context, name=None, namespace=None, options=None): - path = self.filepath_from_context(context) - colorspace_data = context["representation"]["data"].get("colorspaceData", {}) - colorspace = ( - colorspace_data.get("colorspace") - # try to match colorspace from file rules - or self.get_colorspace_from_file_rules(path, context) - ) - - # pseudocode - load_file(path, colorspace=colorspace) - - def get_colorspace_from_file_rules(self, path, context) - project_name = context.data["projectName"] - host_name = context.data["hostName"] - anatomy_data = context.data["anatomyData"] - project_settings_ = context.data["project_settings"] - - config_data = get_imageio_config( - project_name, host_name, - project_settings=project_settings_, - anatomy_data=anatomy_data - ) - file_rules = get_imageio_file_rules( - project_name, host_name, - project_settings=project_settings_ - ) - # get matching colorspace from rules - colorspace = get_imageio_colorspace_from_filepath( - path, host_name, project_name, - config_data=config_data, - file_rules=file_rules, - project_settings=project_settings - ) -``` - -:::warning Loading -A custom OCIO config can be set per asset/shot and thus it can happen the current session you are loading into uses a different config than the original context's **colorspaceData** was published with. It's up the loader's implementation to take that into account and decide what to do if the colorspace differs and or might not exist. -::: \ No newline at end of file diff --git a/website/docs/dev_contribute.md b/website/docs/dev_contribute.md deleted file mode 100644 index c25e2f5d38..0000000000 --- a/website/docs/dev_contribute.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -id: dev_contribute -title: Contribute to openPype development -sidebar_label: Contribute ---- - -## What should you do if ... - -### You found a bug. - -1. Check in the issues and our [bug triage](https://github.com/pypeclub/pype/projects/2) to make sure it wasn't reported already. -2. Ask on our [discord](http://pype.community/chat) Often, what appears as a bug, might be the intended behavior for someone else. -3. Create a new issue. -4. Use the issue template for you PR please. - - -### You wrote a patch that fixes a bug. - -- Open a new GitHub pull request with the patch. -- Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. - - -### You intend to add a new feature or change an existing one. - -- Open a new thread in the [github discussions](https://github.com/pypeclub/pype/discussions/new) -- Do not open issue until the suggestion is discussed. We will convert accepted suggestions into backlog and point them to the relevant discussion thread to keep the context. - -### You have questions about the source code. - -Open a new question on [github discussions](https://github.com/pypeclub/pype/discussions/new) - - -## Branching Strategy - -As we move to 3.x as the primary supported version of OpenPype and only keep Pype 2.15 on bugfixes and client sponsored feature requests, we need to be very careful with merging strategy. - -These are the important branches to remember. - -### OpenPype 3.x - -**`main`** - Production branch with stable releases - -**`develop`** - Development branch where we merge all PRs during the development - -**`release/3.x.x`** - Testing branch for a release, once a release branch is created, no new features -are accepted for the given release. Bugfixes, however, are expected. Once the branch is stable it is -merged to `main` and `develop` and `main` is tagged with a new release - -**`feature/{Issue#}-{Issue_name}`** - development of new features - -**`bugfix/{Issue#}-{Issue_name}`** - bug fixes - -**`hotfix/{Issue#}-{Issue_name}`** - production critical hotfixes (always created from `main`) - -### OpenPype 2.x - -Branching is identical to 3.x development, however all the branches should be pre-pended with -`2.x/` namespace. For example `2.x/feature/1025-support_exporting_of_alembic`, -`2.x/bugfix/wrong_colourspace_in_maya` - -Main and develop for 2.x development are `2.x/main` and `2.x/develop` - - -A few important notes about 2.x and 3.x development: - -- 3.x features are not backported to 2.x unless specifically requested. -- 3.x bugs and hotfixes can be ported to 2.x if they are relevant or severe. -- 2.x features and bugs MUST be ported to 3.x at the same time. - -## Pull Requests - -- Each 2.x PR MUST have a corresponding 3.x PR in github. Without 3.x PR, 2.x features will not be merged! Luckily most of the code is compatible, albeit sometimes in a different place after the refactoring. Porting from 2.x to 3.x should be really easy. -- Please keep the corresponding 2 and 3 PR names the same so they can be easily identified from the PR list page. -- Each 2.x PR should be labeled with `2.x-dev` label. - -Inside each PR, put a link to the corresponding PR. - -Of course if you want to contribute, feel free to make a PR to only 2.x/develop or develop, based on what you are using. While reviewing the PRs, we might convert the code to corresponding PR for the other release ourselves. - -We might also change the target of you PR to and intermediate branch, rather than `develop` if we feel it requires some extra work on our end. That way, we preserve all your commits so you don't lose out on the contribution credits. - - - - -If a PR is targeted at 2.x release it must be labelled with 2x-dev label in Github. \ No newline at end of file diff --git a/website/docs/dev_deadline.md b/website/docs/dev_deadline.md deleted file mode 100644 index 310b2e0983..0000000000 --- a/website/docs/dev_deadline.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: dev_deadline -title: Deadline integration -sidebar_label: Deadline integration -toc_max_heading_level: 4 ---- - -Deadline is not host as usual, it is missing most of the host features, but it does have -its own set of publishing plugins. - -## How to test OpenPype on Deadline - -### Versions - -Since 3.14 job submitted from OpenPype is bound to OpenPype version used to submit it. So -if you submit job with 3.14.8, Deadline will try to find that particular version and use it -for rendering. This is handled by `OPENPYPE_VERSION` variable on job - you can delete it from -there and then the version set in studio Settings will be used. - -![Deadline Job Version](assets/deadline_job_version.png) - -Deadline needs to bootstrap this version so it will try to look the closest compatible -build. So to use version 3.14.8 on Deadline it is enough to have build 3.14.0 or similar - important -are the first two version numbers - major and minor. If they match, the version -is considered compatible. - -### Testing - -So to test various changes you don't need to build again an again OpenPype and putting -it to directory where Deadline is looking for versions - this needs to be done only on -minor version change. That build will then be used to bootstrap whatever is set on the -job or in the studio Settings. - -So you can either use zip version if it suits you, or better set your sources directory -so it will be find as a version - for example with symlink. - -That way you can only modify `OPENPYPE_VERSION` variable on job to point it to version -you would like to test. \ No newline at end of file diff --git a/website/docs/dev_host_implementation.md b/website/docs/dev_host_implementation.md deleted file mode 100644 index e62043723f..0000000000 --- a/website/docs/dev_host_implementation.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -id: dev_host_implementation -title: Host implementation -sidebar_label: Host implementation -toc_max_heading_level: 4 ---- - -Host is an integration of DCC but in most of cases have logic that need to be handled before DCC is launched. Then based on abilities (or purpose) of DCC the integration can support different pipeline workflows. - -## Pipeline workflows -Workflows available in OpenPype are Workfiles, Load and Create-Publish. Each of them may require some functionality available in integration (e.g. call host API to achieve certain functionality). We'll go through them later. - -## How to implement and manage host -At this moment there is not fully unified way how host should be implemented but we're working on it. Host should have a "public face" code that can be used outside of DCC and in-DCC integration code. The main reason is that in-DCC code can have specific dependencies for python modules not available out of it's process. Hosts are located in `openpype/hosts/{host name}` folder. Current code (at many places) expect that the host name has equivalent folder there. So each subfolder should be named with the name of host it represents. - -### Recommended folder structure -```python -openpype/hosts/{host name} -โ”‚ -โ”‚ # Content of DCC integration - with in-DCC imports -โ”œโ”€ api -โ”‚ โ”œโ”€ __init__.py -โ”‚ โ””โ”€ [DCC integration files] -โ”‚ -โ”‚ # Plugins related to host - dynamically imported (can contain in-DCC imports) -โ”œโ”€ plugins -โ”‚ โ”œโ”€ create -โ”‚ โ”‚ โ””โ”€ [create plugin files] -โ”‚ โ”œโ”€ load -โ”‚ โ”‚ โ””โ”€ [load plugin files] -โ”‚ โ””โ”€ publish -โ”‚ โ””โ”€ [publish plugin files] -โ”‚ -โ”‚ # Launch hooks - used to modify how application is launched -โ”œโ”€ hooks -โ”‚ โ””โ”€ [some pre/post launch hooks] -| -โ”‚ # Code initializing host integration in-DCC (DCC specific - example from Maya) -โ”œโ”€ startup -โ”‚ โ””โ”€ userSetup.py -โ”‚ -โ”‚ # Public interface -โ”œโ”€ __init__.py -โ””โ”€ [other public code] -``` - -### Launch Hooks -Launch hooks are not directly connected to host implementation, but they can be used to modify launch of process which may be crucial for the implementation. Launch hook are plugins called when DCC is launched. They are processed in sequence before and after launch. Pre launch hooks can change how process of DCC is launched, e.g. change subprocess flags, modify environments or modify launch arguments. If prelaunch hook crashes the application is not launched at all. Postlaunch hooks are triggered after launch of subprocess. They can be used to change statuses in your project tracker, start timer, etc. Crashed postlaunch hooks have no effect on rest of postlaunch hooks or launched process. They can be filtered by platform, host and application and order is defined by integer value. Hooks inside host are automatically loaded (one reason why folder name should match host name) or can be defined from modules. Hooks execution share same launch context where can be stored data used across multiple hooks (please be very specific in stored keys e.g. 'project' vs. 'project_name'). For more detailed information look into `openpype/lib/applications.py`. - -### Public interface -Public face is at this moment related to launching of the DCC. At this moment there there is only option to modify environment variables before launch by implementing function `add_implementation_envs` (must be available in `openpype/hosts/{host name}/__init__.py`). The function is called after pre launch hooks, as last step before subprocess launch, to be able set environment variables crucial for proper integration. It is also good place for functions that are used in prelaunch hooks and in-DCC integration. Future plans are to be able get workfiles extensions from here. Right now workfiles extensions are hardcoded in `openpype/pipeline/constants.py` under `HOST_WORKFILE_EXTENSIONS`, we would like to handle hosts as addons similar to OpenPype modules, and more improvements which are now hardcoded. - -### Integration -We've prepared base class `HostBase` in `openpype/host/host.py` to define minimum requirements and provide some default method implementations. The minimum requirement for a host is `name` attribute, this host would not be able to do much but is valid. To extend functionality we've prepared interfaces that helps to identify what is host capable of and if is possible to use certain tools with it. For those cases we defined interfaces for each workflow. `IWorkfileHost` interface add requirement to implement workfiles related methods which makes host usable in combination with Workfiles tool. `ILoadHost` interface add requirements to be able load, update, switch or remove referenced representations which should add support to use Loader and Scene Inventory tools. `INewPublisher` interface is required to be able use host with new OpenPype publish workflow. This is what must or can be implemented to allow certain functionality. `HostBase` will have more responsibility which will be taken from global variables in future. This process won't happen at once, but will be slow to keep backwards compatibility for some time. - -#### Example -```python -from openpype.host import HostBase, IWorkfileHost, ILoadHost - - -class MayaHost(HostBase, IWorkfileHost, ILoadHost): - def open_workfile(self, filepath): - ... - - def save_current_workfile(self, filepath=None): - ... - - def get_current_workfile(self): - ... - ... -``` - -### Install integration -We have prepared a host class, now where and how to initialize it's object? This part is DCC specific. In DCCs like Maya with embedded python and Qt we use advantage of being able to initialize object of the class directly in DCC process on start, the same happens in Nuke, Hiero and Houdini. In DCCs like Photoshop or Harmony there is launched OpenPype (python) process next to it which handles host initialization and communication with the DCC process (e.g. using sockects). Created object of host must be installed and registered to global scope of OpenPype. Which means that at this moment one process can handle only one host at a time. - -#### Install example (Maya startup file) -```python -from openpype.pipeline import install_host -from openpype.hosts.maya.api import MayaHost - - -host = MayaHost() -install_host(host) -``` - -Function `install_host` cares about installing global plugins, callbacks and register host. Host registration means that the object is kept in memory and is accessible using `get_registered_host()`. - -### Using UI tools -Most of functionality in DCCs is provided to artists by using UI tools. We're trying to keep UIs consistent so we use same set of tools in each host, all or most of them are Qt based. There is a `HostToolsHelper` in `openpype/tools/utils/host_tools.py` which unify showing of default tools, they can be showed almost at any point. Some of them are validating if host is capable of using them (Workfiles, Loader and Scene Inventory) which is related to [pipeline workflows](#pipeline-workflows). `HostToolsHelper` provides API to show tools but host integration must care about giving artists ability to show them. Most of DCCs have some extendable menu bar where is possible to add custom actions, which is preferred approach how to give ability to show the tools. diff --git a/website/docs/dev_introduction.md b/website/docs/dev_introduction.md deleted file mode 100644 index 5b48635a08..0000000000 --- a/website/docs/dev_introduction.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: dev_introduction -title: Introduction -sidebar_label: Introduction ---- - - -Here you should find additional information targeted on developers who would like to contribute or dive deeper into OpenPype platform - -Currently there are details about automatic testing, in the future this should be location for API definition and documentation diff --git a/website/docs/dev_publishing.md b/website/docs/dev_publishing.md deleted file mode 100644 index 3ef6272373..0000000000 --- a/website/docs/dev_publishing.md +++ /dev/null @@ -1,660 +0,0 @@ ---- -id: dev_publishing -title: Publishing -sidebar_label: Publishing -toc_max_heading_level: 4 ---- - -Publishing workflow consists of 2 parts: -- Creating - Mark what will be published and how. -- Publishing - Use data from Creating to go through the pyblish process. - -OpenPype is using [pyblish](https://pyblish.com/) for the publishing process. OpenPype extends and modifies its few functions a bit, mainly for reports and UI purposes. The main differences are that OpenPype's publish UI allows to enable/disable instances or plugins during Creating part instead of in the publishing part and has limited plugin actions only for failed validation plugins. - -## **Creating** - -Concept of Creating does not have to "create" anything yet, but prepare and store metadata about an "instance" (becomes a subset after the publish process). Created instance always has `family` which defines what kind of data will be published, the best example is `workfile` family. Storing of metadata is host specific and may be even a Creator plugin specific. Most hosts are storing metadata into a workfile (Maya scene, Nuke script, etc.) to an item or a node the same way as regular Pyblish instances, so consistency of host implementation is kept, but some features may require a different approach that is the reason why it is creator plugin responsibility. Storing the metadata to the workfile persists values, so the artist does not have to create and set what should be published and how over and over. - -### Created instance - -Objected representation of created instance metadata defined by class **CreatedInstance**. Has access to **CreateContext** and **BaseCreator** that initialized the object. Is a dictionary-like object with few immutable keys (marked with start `*` in table). The immutable keys are set by the creator plugin or create context on initialization and their values can't change. Instance can have more arbitrary data, for example ids of nodes in scene but keep in mind that some keys are reserved. - -| Key | Type | Description | -|---|---|---| -| *id | str | Identifier of metadata type. ATM constant **"pyblish.avalon.instance"** | -| *instance_id | str | Unique ID of instance. Set automatically on instance creation using `str(uuid.uuid4())` | -| *family | str | Instance's family representing type defined by creator plugin. | -| *creator_identifier | str | Identifier of creator that collected/created the instance. | -| *creator_attributes | dict | Dictionary of attributes that are defined by the creator plugin (`get_instance_attr_defs`). | -| *publish_attributes | dict | Dictionary of attributes that are defined by publish plugins. | -| variant | str | Variant is entered by the artist on creation and may affect **subset**. | -| subset | str | Name of instance. This name will be used as a subset name during publishing. Can be changed on context change or variant change. | -| active | bool | Is the instance active and will be published or not. | -| asset | str | Name of asset in which context was created. | -| task | str | Name of task in which context was created. Can be set to `None`. | - -:::note -Task should not be required until the subset name template expects it. -::: - -object of **CreatedInstance** has method **data_to_store** which returns a dictionary that can be parsed to a json string. This method will return all data related to the instance so it can be re-created using `CreatedInstance.from_existing(data)`. - -#### *Create context* {#category-doc-link} - -Controller and wrapper around Creating is `CreateContext` which cares about loading of plugins needed for Creating. And validates required functions in host implementation. - -Context discovers creator and publish plugins. Trigger collections of existing instances on creators and trigger Creating itself. Also it keeps in mind instance objects by their ids. - -Creator plugins can call **creator_adds_instance** or **creator_removed_instance** to add/remove instances but these methods are not meant to be called directly out of the creator. The reason is that it is the creator's responsibility to remove metadata or decide if it should remove the instance. - -During reset are re-cached Creator plugins, re-collected instances, refreshed host context and more. Object of `CreateContext` supply shared data during the reset. They can be used by creators to share same data needed during collection phase or during creation for autocreators. - -#### Required functions in host implementation -It is recommended to use `HostBase` class (`from openpype.host import HostBase`) as base for host implementation with combination of `IPublishHost` interface (`from openpype.host import IPublishHost`). These abstract classes should guide you to fill missing attributes and methods. - -To sum them and in case host implementation is inheriting `HostBase` the implementation **must** implement **get_context_data** and **update_context_data**. These two functions are needed to store metadata that are not related to any instance but are needed for Creating and publishing process. Right now only data about enabled/disabled optional publish plugins is stored there. When data is not stored and loaded properly, reset of publishing will cause that they will be set to default value. Context data also parsed to json string similarly as instance data. - -There are also few optional functions. For UI purposes it is possible to implement **get_context_title** which can return a string shown in UI as a title. Output string may contain html tags. It is recommended to return context path (it will be created function this purposes) in this order `"{project name}/{asset hierarchy}/{asset name}/{task name}"` (this is default implementation in `HostBase`). - -Another optional function is **get_current_context**. This function is handy in hosts where it is possible to open multiple workfiles in one process so using global context variables is not relevant because artists can switch between opened workfiles without being acknowledged. When a function is not implemented or won't return the right keys the global context is used. -```json -# Expected keys in output -{ - "project_name": "MyProject", - "asset_name": "sq01_sh0010", - "task_name": "Modeling" -} -``` - -### Create plugin -Main responsibility of create plugin is to create, update, collect and remove instance metadata and propagate changes to create context. Has access to **CreateContext** (`self.create_context`) that discovered the plugin so has also access to other creators and instances. Create plugins have a lot of responsibility so it is recommended to implement common code per host. - -#### *BaseCreator* -Base implementation of creator plugin. It is not recommended to use this class as base for production plugins but rather use one of **HiddenCreator**, **AutoCreator** and **Creator** variants. - -**Access to shared data** -Functions to work with "Collection shared data" can be used during reset phase of `CreateContext`. Creators can cache there data that are common for them. For example list of nodes in scene. Methods are implemented on `CreateContext` but their usage is primarily for Create plugins as nothing else should use it. Each creator can access `collection_shared_data` attribute which is a dictionary where shared data can be stored. - -**Abstractions** -- **`family`** (class attr) - Tells what kind of instance will be created. -```python -class WorkfileCreator(Creator): - family = "workfile" -``` - -- **`collect_instances`** (method) - Collect already existing instances from the workfile and add them to create context. This method is called on initialization or reset of **CreateContext**. Each creator is responsible to find its instance metadata, convert them to **CreatedInstance** object and add them to create context (`self._add_instance_to_context(instnace_obj)`). -```python -def collect_instances(self): - # Using 'pipeline.list_instances' is just example how to get existing instances from scene - # - getting existing instances is different per host implementation - for instance_data in pipeline.list_instances(): - # Process only instances that were created by this creator - creator_id = instance_data.get("creator_identifier") - if creator_id == self.identifier: - # Create instance object from existing data - instance = CreatedInstance.from_existing( - instance_data, self - ) - # Add instance to create context - self._add_instance_to_context(instance) -``` - -- **`create`** (method) - Create a new object of **CreatedInstance** store its metadata to the workfile and add the instance into the created context. Failed Creating should raise **CreatorError** if an error happens that artists can fix or give them some useful information. Triggers and implementation differs for **Creator**, **HiddenCreator** and **AutoCreator**. - -- **`update_instances`** (method) - Update data of instances. Receives tuple with **instance** and **changes**. -```python -def update_instances(self, update_list): - # Loop over changed instances - for instance, changes in update_list: - # Example possible usage of 'changes' to use different node on change - # of node id in instance data (MADE UP) - node = None - if "node_id" in changes: - old_value, new_value = changes["node_id"] - if new_value is not None: - node = pipeline.get_node_by_id(new_value) - - if node is None: - node = pipeline.get_node_by_instance_id(instance.id) - # Get node in scene that represents the instance - # Imprind data to a node - pipeline.imprint(node, instance.data_to_store()) - - -# Most implementations will probably ignore 'changes' completely -def update_instances(self, update_list): - for instance, _ in update_list: - # Get node from scene - node = pipeline.get_node_by_instance_id(instance.id) - # Imprint data to node - pipeline.imprint(node, instance.data_to_store()) -``` - -- **`remove_instances`** (method) - Remove instance metadata from workfile and from create context. -```python -# Possible way how to remove instance -def remove_instances(self, instances): - for instance in instances: - # Remove instance metadata from workflle - pipeline.remove_instance(instance.id) - # Remove instance from create context - self._remove_instance_from_context(instance) - - -# Default implementation of `AutoCreator` -def remove_instances(self, instances): - pass -``` - -:::note -When host implementation use universal way how to store and load instances you should implement host specific creator plugin base class with implemented **collect_instances**, **update_instances** and **remove_instances**. -::: - -**Optional implementations** - -- **`enabled`** (attr) - Boolean if the creator plugin is enabled and used. -- **`identifier`** (class attr) - Consistent unique string identifier of the creator plugin. Is used to identify source plugin of existing instances. There can't be 2 creator plugins with the same identifier. Default implementation returns `family` attribute. -```python -class RenderLayerCreator(Creator): - family = "render" - identifier = "render_layer" - - -class RenderPassCreator(Creator): - family = "render" - identifier = "render_pass" -``` - -- **`label`** (attr) - String label of creator plugin which will show up in UI, `identifier` is used when not set. It should be possible to use html tags. -```python -class RenderLayerCreator(Creator): - label = "Render Layer" -``` - -- **`get_icon`** (attr) - Icon of creator and its instances. Value can be a path to an image file, full name of qtawesome icon, `QPixmap` or `QIcon`. For complex cases or cases when `Qt` objects are returned it is recommended to override `get_icon` method and handle the logic or import `Qt` inside the method to not break headless usage of creator plugin. For list of qtawesome icons check qtawesome github repository (look for the used version in pyproject.toml). Default implementation return **icon** attribute. -- **`icon`** (method) - Attribute for default implementation of **get_icon**. -```python -class RenderLayerCreator(Creator): - # Use font awesome 5 icon - icon = "fa5.building" -``` - -- **`get_instance_attr_defs`** (method) - Attribute definitions of instance. Creator can define attribute values with default values for each instance. These attributes may affect how instances will be instance processed during publishing. Attribute defiitions can be used from `openpype.lib.attribute_definitions`. Attribute definitions define basic types of values for different cases e.g. boolean, number, string, enumerator, etc. Default implementation returns **instance_attr_defs**. -- **`instance_attr_defs`** (attr) - Attribute for default implementation of **get_instance_attr_defs**. - -```python -from openpype.lib import attribute_definitions - - -class RenderLayerCreator(Creator): - def get_instance_attr_defs(self): - # Return empty list if '_allow_farm_render' is not enabled (can be set during initialization) - if not self._allow_farm_render: - return [] - # Give artist option to change if should be rendered on farm or locally - return [ - attribute_definitions.BoolDef( - "render_farm", - default=False, - label="Render on Farm" - ) - ] -``` - -- **`get_subset_name`** (method) - Calculate subset name based on passed data. Data can be extended using the `get_dynamic_data` method. Default implementation is using `get_subset_name` from `openpype.lib` which is recommended. - -- **`get_dynamic_data`** (method) - Can be used to extend data for subset templates which may be required in some cases. - -Methods are used before instance creation and on instance subset name update. Update may require to have access to existing instance because dynamic data should be filled from there. Because of that is instance passed to `get_subset_name` and `get_dynamic_data` so the creator can handle that cases. - -This is one example where subset name template may contain `"{layer}"` which is filled during creation because the value is taken from selection. In that case `get_dynamic_data` returns value for `"layer"` -> `"{layer}"` so it can be filled in creation. But when subset name of already existing instance is updated it should return already existing value. Note: Creator must make sure the value is available on instance. - -```python -from openpype.lib import prepare_template_data -from my_host import get_selected_layer - - -class SomeCreator(Creator): - def get_dynamic_data( - self, variant, task_name, asset_doc, project_name, host_name, instance - ): - # Before instance is created return unfilled key - # - the key will be filled during creation - if instance is None: - return {"layer": "{layer}"} - # Take value from existing instance - # - creator must know where to look for the value - return {"layer": instance.data["layer"]} - - def create(self, subset_name, instance_data, pre_create_data): - # Fill the layer name in - layer = get_selected_layer() - layer_name = layer["name"] - layer_fill_data = prepare_template_data({"layer": layer_name}) - subset_name = subset_name.format(**layer_fill_data) - instance_data["layer"] = layer_name - ... -``` - - -#### *HiddenCreator* -Creator which is not showed in UI so artist can't trigger it directly but is available for other creators. This creator is primarily meant for cases when creation should create different types of instances. For example during editorial publishing where input is single edl file but should create 2 or more kind of instances each with different family, attributes and abilities. Arguments for creation were limited to `instance_data` and `source_data`. Data of `instance_data` should follow what is sent to other creators and `source_data` can be used to send custom data defined by main creator. It is expected that `HiddenCreator` has specific main or "parent" creator. - -```python -def create(self, instance_data, source_data): - variant = instance_data["variant"] - task_name = instance_data["task"] - asset_name = instance_data["asset"] - asset_doc = get_asset_by_name(self.project_name, asset_name) - self.get_subset_name( - variant, task_name, asset_doc, self.project_name, self.host_name) -``` - - -#### *AutoCreator* -Creator that is triggered on reset of create context. Can be used for families that are expected to be created automatically without artist interaction (e.g. **workfile**). Method `create` is triggered after collecting all creators. - -:::important -**AutoCreator** has implemented **remove_instances** to do nothing as removing of auto created instances would lead to creating new instance immediately or on refresh. -::: - -```python -def __init__( - self, create_context, system_settings, project_settings, *args, **kwargs -): - super(MyCreator, self).__init__( - create_context, system_settings, project_settings, *args, **kwargs - ) - # Get variant value from settings - variant_name = ( - project_settings["my_host"][self.identifier]["variant"] - ).strip() - if not variant_name: - variant_name = "Main" - self._variant_name = variant_name - -# Create does not expect any arguments -def create(self): - # Look for existing instance in create context - existing_instance = None - for instance in self.create_context.instances: - if instance.creator_identifier == self.identifier: - existing_instance = instance - break - - # Collect current context information - # - variant can be filled from settings - variant = self._variant_name - # Only place where we can look for current context - project_name = self.project_name - asset_name = legacy_io.Session["AVALON_ASSET"] - task_name = legacy_io.Session["AVALON_TASK"] - host_name = legacy_io.Session["AVALON_APP"] - - # Create new instance if does not exist yet - if existing_instance is None: - asset_doc = get_asset_by_name(project_name, asset_name) - subset_name = self.get_subset_name( - variant, task_name, asset_doc, project_name, host_name - ) - data = { - "asset": asset_name, - "task": task_name, - "variant": variant - } - data.update(self.get_dynamic_data( - variant, task_name, asset_doc, project_name, host_name - )) - - new_instance = CreatedInstance( - self.family, subset_name, data, self - ) - self._add_instance_to_context(new_instance) - - # Update instance context if is not the same - elif ( - existing_instance["asset"] != asset_name - or existing_instance["task"] != task_name - ): - asset_doc = get_asset_by_name(project_name, asset_name) - subset_name = self.get_subset_name( - variant, task_name, asset_doc, project_name, host_name - ) - existing_instance["asset"] = asset_name - existing_instance["task"] = task_name -``` - -#### *Creator* -Implementation of creator plugin that is triggered manually by the artist in UI (or by code). Has extended options for UI purposes than **AutoCreator** and **create** method expect more arguments. - -**Optional implementations** -- **`create_allow_context_change`** (class attr) - Allow to set context in UI before Creating. Some creators may not allow it or their logic would not use the context selection (e.g. bulk creators). Is set to `True` but default. -```python -class BulkRenderCreator(Creator): - create_allow_context_change = False -``` -- **`get_default_variants`** (method) - Returns list of default variants that are listed in create dialog for user. Returns **default_variants** attribute by default. -- **`default_variants`** (attr) - Attribute for default implementation of **get_default_variants**. - -- **`get_default_variant`** (method) - Returns default variant that is prefilled in UI (value does not have to be in default variants). By default returns **default_variant** attribute. If returns `None` then UI logic will take first item from **get_default_variants** if there is any otherwise **"Main"** is used. -- **`default_variant`** (attr) - Attribute for default implementation of **get_default_variant**. - -- **`get_description`** (method) - Returns a short string description of the creator. Returns **description** attribute by default. -- **`description`** (attr) - Attribute for default implementation of **get_description**. - -- **`get_detailed_description`** (method) - Returns detailed string description of creator. Can contain markdown. Returns **detailed_description** attribute by default. -- **`detailed_description`** (attr) - Attribute for default implementation of **get_detailed_description**. - -- **`get_pre_create_attr_defs`** (method) - Similar to **get_instance_attr_defs** returns attribute definitions but they are filled before creation. When creation is called from UI the values are passed to **create** method. Returns **pre_create_attr_defs** attribute by default. -- **`pre_create_attr_defs`** (attr) - Attribute for default implementation of **get_pre_create_attr_defs**. - -```python -from openpype.lib import attribute_definitions -from openpype.pipeline.create import Creator - - -class CreateRender(Creator): - family = "render" - label = "Render" - icon = "fa.eye" - description = "Render scene viewport" - - def __init__( - self, context, system_settings, project_settings, *args, **kwargs - ): - super(CreateRender, self).__init__( - context, system_settings, project_settings, *args, **kwargs - ) - plugin_settings = ( - project_settings["my_host"]["create"][self.__class__.__name__] - ) - # Get information if studio has enabled farm publishing - self._allow_farm_render = plugin_settings["allow_farm_render"] - # Get default variants from settings - self.default_variants = plugin_settings["variants"] - - def get_instance_attr_defs(self): - # Return empty list if '_allow_farm_render' is not enabled (can be set during initialization) - if not self._allow_farm_render: - return [] - # Give artist option to change if should be rendered on farm or locally - return [ - attribute_definitions.BoolDef( - "render_farm", - default=False, - label="Render on Farm" - ) - ] - - def get_pre_create_attr_defs(self): - # Give user option to use selection or not - attrs = [ - attribute_definitions.BoolDef( - "use_selection", - default=False, - label="Use selection" - ) - ] - if self._allow_farm_render: - # Set to render on farm in creator dialog - # - this value is not automatically passed to instance attributes - # creator must do that during creation - attrs.append( - attribute_definitions.BoolDef( - "render_farm", - default=False, - label="Render on Farm" - ) - ) - return attrs - - def create(self, subset_name, instance_data, pre_create_data): - # ARGS: - # - 'subset_name' - precalculated subset name - # - 'instance_data' - context data - # - 'asset' - asset name - # - 'task' - task name - # - 'variant' - variant - # - 'family' - instance family - - # Check if should use selection or not - if pre_create_data.get("use_selection"): - items = pipeline.get_selection() - else: - items = [pipeline.create_write()] - - # Validations related to selection - if len(items) > 1: - raise CreatorError("Please select only single item at time.") - - elif not items: - raise CreatorError("Nothing to create. Select at least one item.") - - # Create instence object - new_instance = CreatedInstance(self.family, subset_name, data, self) - # Pass value from pre create attribute to instance - # - use them only when pre create date contain the data - if "render_farm" in pre_create_data: - use_farm = pre_create_data["render_farm"] - new_instance.creator_attributes["render_farm"] = use_farm - - # Store metadata to workfile - pipeline.imprint(new_instance.id, new_instance.data_to_store()) - - # Add instance to context - self._add_instance_to_context(new_instance) -``` - -## **Publish** -### Exceptions -OpenPype define few specific exceptions that should be used in publish plugins. - -#### *Validation exception* -Validation plugins should raise `PublishValidationError` to show to an artist what's wrong and give him actions to fix it. The exception says that errors in the plugin can be fixed by the artist himself (with or without action on plugin). Any other errors will stop publishing immediately. The exception `PublishValidationError` raised after validation order has the same effect as any other exception. - -Exception `PublishValidationError` expects 4 arguments: -- **message** Which is not used in UI but for headless publishing. -- **title** Short description of error (2-5 words). Title is used for grouping of exceptions per plugin. -- **description** Detailed description of the issue where markdown and html can be used. -- **detail** Is optional to give even more detailed information for advanced users. At this moment the detail is shown directly under description but it is in plan to have detail in a collapsible widget. - -Extended version is `PublishXmlValidationError` which uses xml files with stored descriptions. This helps to avoid having huge markdown texts inside code. The exception has 4 arguments: -- **plugin** The plugin object which raises the exception to find its related xml file. -- **message** Exception message for publishing without UI or different pyblish UI. -- **key** Optional argument says which error from xml is used as a validation plugin may raise error with different messages based on the current errors. Default is **"main"**. -- **formatting_data** Optional dictionary to format data in the error. This is used to fill detailed description with data from the publishing so artist can get more precise information. - -**Where and how to create xml file** - -Xml files for `PublishXmlValidationError` must be located in **./help** subfolder next to the plugin and the filename must match the filename of the plugin. -``` -# File location related to plugin file -โ”” publish - โ”œ help - โ”‚ โ”œ validate_scene.xml - โ”‚ โ”” ... - โ”œ validate_scene.py - โ”” ... -``` - -Xml file content has **<root>** node which may contain any amount of **<error>** nodes, but each of them must have **id** attribute with unique value. That is then used for **key**. Each error must have **<title>** and **<description>** and **<detail>**. Text content may contain python formatting keys that can be filled when an exception is raised. -```xml - - - - Subset context - ## Invalid subset context - -Context of the given subset doesn't match your current scene. - -### How to repair? - -You can fix this with the "Repair" button on the right. This will use '{expected_asset}' asset name and overwrite '{found_asset}' asset name in scene metadata. - -After that restart publishing with Reload button. - - -### How could this happen? - -The subset was created in different scene with different context -or the scene file was copy pasted from different context. - - - -``` - -#### *Known errors* -When there is a known error that can't be fixed by the user (e.g. can't connect to deadline service, etc.) `KnownPublishError` should be raised. The only difference is that its message is shown in UI to the artist otherwise a neutral message without context is shown. - -### Plugins -Plugin is a single processing unit that can work with publish context and instances. - -#### Plugin types -There are 2 types of plugins - `InstancePlugin` and `ContextPlugin`. Be aware that inheritance of plugin from `InstancePlugin` or `ContextPlugin` actually does not affect if plugin is instance or context plugin, that is affected by argument name in `process` method. - -```python -import pyblish.api - - -# Context plugin -class MyContextPlugin(pyblish.api.ContextPlugin): - def process(self, context): - ... - -# Instance plugin -class MyInstancePlugin(pyblish.api.InstancePlugin): - def process(self, instance): - ... - -# Still an instance plugin -class MyOtherInstancePlugin(pyblish.api.ContextPlugin): - def process(self, instance): - ... -``` - -#### Plugin filtering -By pyblish logic, plugins have predefined filtering class attributes `hosts`, `targets` and `families`. Filter by `hosts` and `targets` are filters that are applied for current publishing process. Both filters are registered in `pyblish` module, `hosts` filtering may not match OpenPype host name (e.g. farm publishing uses `shell` in pyblish). Filter `families` works only on instance plugins and is dynamic during publish process by changing families of an instance. - -All filters are list of a strings `families = ["image"]`. Empty list is invalid filter and plugin will be skipped, to allow plugin for all values use a start `families = ["*"]`. For more detailed filtering options check [pyblish documentation](https://api.pyblish.com/pluginsystem). - -Each plugin must have order, there are 4 order milestones - Collect, Validate, Extract, Integration. Any plugin below collection order won't be processed. for more details check [pyblish documentation](https://api.pyblish.com/ordering). - -#### Plugin settings -Pyblish plugins may have settings. There are 2 ways how settings are applied, first is automated, and it's logic is based on function `filter_pyblish_plugins` in `./openpype/pipeline/publish/lib.py`, second is explicit by implementing class method `apply_settings` on a plugin. - - -Automated logic is expecting specific structure of project settings `project_settings[{category}]["plugins"]["publish"][{plugin class name}]`. The category is a key in root of project settings. There are currently 3 ways how the category key is received. -1. Use `settings_category` class attribute value from plugin. If `settings_category` is not `None` there is not any fallback to other way. -2. Use currently registered pyblish host. This will be probably deprecated soon. -3. Use 3rd folder name from a plugin filepath. From path `./maya/plugins/publish/collect_render.py` is used `maya` as the key. - -For any other use-case is recommended to use explicit approach by implementing `apply_settings` method. Must use `@classmethod` decorator and expect arguments for project settings and system settings. We're planning to support single argument with only project settings. -```python -import pyblish.api - - -class MyPlugin(pyblish.api.InstancePlugin): - profiles = [] - - @classmethod - def apply_settings(cls, project_settings, system_settings): - cls.profiles = ( - project_settings - ["addon"] - ["plugins"] - ["publish"] - ["vfx_profiles"] - ) -``` - -### Plugin extension -Publish plugins can be extended by additional logic when inheriting from `OpenPypePyblishPluginMixin` which can be used as mixin (additional inheritance of class). Publish plugins that inherit from this mixin can define attributes that will be shown in **CreatedInstance**. One of the most important usages is to be able turn on/off optional plugins. - -Attributes are defined by the return value of `get_attribute_defs` method. Attribute definitions are for families defined in plugin's `families` attribute if it's instance plugin or for whole context if it's context plugin. To convert existing values (or to remove legacy values) can be re-implemented `convert_attribute_values`. Default implementation just converts the values to right types. - -:::Important -Values of publish attributes from created instance are never removed automatically so implementing this method is the best way to remove legacy data or convert them to new data structure. -::: - -Possible attribute definitions can be found in `openpype/pipeline/lib/attribute_definitions.py`. - -
-Example plugin -

- -```python -import pyblish.api -from openpype.lib import attribute_definitions -from openpype.pipeline import OpenPypePyblishPluginMixin - - -# Example context plugin -class MyExtendedPlugin( - pyblish.api.ContextPlugin, OpenPypePyblishPluginMixin -): - optional = True - active = True - - @classmethod - def get_attribute_defs(cls): - return [ - attribute_definitions.BoolDef( - # Key under which it will be stored - "process", - # Use 'active' as default value - default=cls.active, - # Use plugin label as label for attribute - label=cls.label - ) - ] - - def process_plugin(self, context): - # First check if plugin is optional - if not self.optional: - return True - - # Attribute values are stored by class names - # - for those purposes was implemented 'get_attr_values_from_data' - # to help with accessing it - attribute_values = self.get_attr_values_from_data(context.data) - # Get 'process' key - process_value = attribute_values.get("process") - if process_value is None or process_value: - return True - return False - - def process(self, context): - if not self.process_plugin(context): - return - # Do plugin logic - ... -``` -

-
- -## **UI examples** -### Main publish window -Main window of publisher shows instances and their values, collected by creators. - -**Card view** -![Publisher UI - Card view](assets/publisher_card_view.png) -**List view** -![Publisher UI - List view](assets/publisher_list_view.png) - -#### *Instances views* -List of instances always contains an `Options` item which is used to show attributes of context plugins. Values from the item are saved and loaded using [host implementation](#required-functions-in-host-implementation) **get_context_data** and **update_context_data**. Instances are grouped by family and can be shown in card view (single selection) or list view (multi selection). - -Instance view has at the bottom 3 buttons. Plus sign opens [create dialog](#create-dialog), bin removes selected instances and stripes swap card and list view. - -#### *Context options* -It is possible to change variant or asset and task context of instances at the top part but all changes there must be confirmed. Confirmation will trigger recalculation of subset names and all new data are stored to instances. - -#### *Create attributes* -Instance attributes display all created attributes of all selected instances. All attributes that have the same definition are grouped into one input and are visually indicated if values are not the same for selected instances. In most cases have **< Multiselection >** placeholder. - -#### *Publish attributes* -Publish attributes work the same way as create attributes but the source of attribute definitions are pyblish plugins. Attributes are filtered based on families of selected instances and families defined in the pyblish plugin. - -### Create dialog -![Publisher UI - Create dialog](assets/publisher_create_dialog.png) -Create dialog is used by artist to create new instances in a context. The context selection can be enabled/disabled by changing `create_allow_context_change` on [creator plugin](#creator). In the middle part the artist selects what will be created and what variant it is. On the right side is information about the selected creator and its pre-create attributes. There is also a question mark button which extends the window and displays more detailed information about the creator. diff --git a/website/docs/dev_requirements.md b/website/docs/dev_requirements.md deleted file mode 100644 index f8b796d997..0000000000 --- a/website/docs/dev_requirements.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -id: dev_requirements -title: Requirements -sidebar_label: Requirements ---- - - -We aim to closely follow [**VFX Reference Platform**](https://vfxplatform.com/) - -OpenPype is written in Python 3 with specific elements still running in Python2 until all DCCs are fully updated. To see the list of those, that are not quite there yet, go to [VFX Python3 tracker](https://vfxpy.com/) - -The main things you will need to run and build pype are: - -- **Terminal** in your OS - - PowerShell 5.0+ (Windows) - - Bash (Linux) -- [**Python 3.9.x**](#python) -- [**MongoDB**](#database) - - -## OS - -It can be built and ran on all common platforms. We develop and test on the following: - -- **Windows** 10 -- **Linux** - - **Ubuntu** 20.04 LTS - - **Centos** 7 -- **Mac OSX** - - **10.15** Catalina - - **11.1** Big Sur (using Rosetta2) - - -## Database - -Database version should be at least **MongoDB 4.4**. - -Pype needs site-wide installation of **MongoDB**. It should be installed on -reliable server, that all workstations (and possibly render nodes) can connect. This -server holds **Avalon** database that is at the core of everything - -Depending on project size and number of artists working, connection speed and -latency influence performance experienced by artists. If remote working is required, this mongodb -server must be accessible from Internet or cloud solution can be used. Reasonable backup plan -or high availability options are recommended. *Replication* feature of MongoDB should be considered. This is beyond the -scope of this documentation, please refer to [MongoDB Documentation](https://docs.mongodb.com/manual/replication/). - -Pype can run its own instance of mongodb, mostly for testing and development purposes. -For that it uses locally installed MongoDB. - -Download it from [mognoDB website](https://www.mongodb.com/download-center/community), install it and -add to the `PATH`. On Windows, Pype tries to find it in standard installation destination or using `PATH`. - -To run mongoDB on server, use your server distribution tools to set it up (on Linux). - -## Python - -**Python 3.9.x** is the recommended version to use (as per [VFX platform CY2022](https://vfxplatform.com/)). -**Note**: We do not support 3.9.0 because of [this bug](https://github.com/python/cpython/pull/22670). Please, use higher versions of 3.9.x. - -If you're planning to run openPYPE on workstations from built executables (highly recommended), you will only need python for building and development, however, if you'd like to run from source centrally, every user will need python installed. - -## Hardware - -openPYPE should be installed on all workstations that need to use it, the same as any other application. - -There are no specific requirements for the hardware. If the workstation can run -the major DCCs, it most probably can run openPYPE. - -Installed, it takes around 400MB of space, depending on the platform - - -For a well functioning ftrack event server, we recommend a linux virtual server with Ubuntu or CentOS. CPU and RAM allocation needs differ based on the studio size, but a 2GB of ram, with a dual core CPU and around 4GB of storage should suffice - - -## Deployment - -For pushing pipeline updates to the artists, you will need to create a shared folder that -will be accessible with at least Read permission to every OpenPype user in the studio. -This can also be hosted on the cloud in fully distributed deployments. - - - -## Dependencies - -### Key projects we depend on - -- [**Avalon**](https://github.com/getavalon) -- [**Pyblish**](https://github.com/pyblish) -- [**OpenTimelineIO**](https://github.com/PixarAnimationStudios/OpenTimelineIO) -- [**OpenImageIO**](https://github.com/OpenImageIO/oiio) [^centos7] -- [**FFmpeg**](https://github.com/FFmpeg/FFmpeg) - -[^centos7]: On Centos 7 you need to install additional libraries to support OIIO there - mainly boost -and libraw (`sudo yum install boost-1.53.0` and `sudo yum install LibRaw`) - -### Python modules we use and their licenses - -| Package | License | -|-------------------------------------|--------------------------------------------------------------| -| acre 1.0.0 | GNU Lesser General Public License v3 (LGPLv3) | -| aiohttp 3.7.3 | Apache 2 | -| aiohttp-json-rpc 0.13.3 | Apache 2.0 | -| appdirs 1.4.4 | MIT | -| blessed 1.17.12 | MIT | -| click 7.1.2 | BSD-3-Clause | -| clique 1.5.0 | Apache License (2.0) | -| coverage 5.3.1 | Apache 2.0 | -| cx-Freeze 6.5.1 | Python Software Foundation License | -| docutils 0.16 | public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt) | -| flake8 3.8.4 | MIT | -| ftrack-python-api 2.0.0 | Apache License (2.0) | -| jinxed 1.0.1 | MPLv2.0 -| log4mongo 1.7.0 | BSD | -| OpenTimelineIO 0.14.0.dev1 | Modified Apache 2.0 License | -| Pillow 8.1.0 | HPND | -| pyblish-base 1.8.8 | LGPL | -| pycodestyle 2.6.0 | Expat license | -| pydocstyle 5.1.1 | MIT | -| pylint 2.6.0 | GPL | -| pymongo 3.11.2 | Apache License, Version 2.0 | -| pynput 1.7.2 | LGPLv3 | -| PyQt5 5.15.2 | GPL v3 | -| pytest 6.2.1 | MIT | -| pytest-cov 2.11.0 | MIT | -| pytest-print 0.2.1 | MIT | -| pywin32-ctypes 0.2.0 | BSD | -| Qt.py 1.3.2 | MIT | -| six 1.15.0 | MIT | -| speedcopy 2.1.0 | UNKNOWN | -| Sphinx 3.4.3 | BSD | -| sphinx-qt-documentation 0.3 | BSD-3-Clause | -| sphinxcontrib-websupport 1.2.4 | BSD | -| tqdm 4.56.0 | MPLv2.0, MIT Licences | -| wheel 0.36.2 | MIT | -| wsrpc-aiohttp 3.1.1 | Apache Software License | diff --git a/website/docs/dev_settings.md b/website/docs/dev_settings.md deleted file mode 100644 index 831536c460..0000000000 --- a/website/docs/dev_settings.md +++ /dev/null @@ -1,899 +0,0 @@ ---- -id: dev_settings -title: Settings -sidebar_label: Settings ---- - -Settings give the ability to change how OpenPype behaves in certain situations. Settings are split into 3 categories **system settings**, **project anatomy** and **project settings**. Project anatomy and project settings are grouped into a single category but there is a technical difference (explained later). Only difference in system and project settings is that system settings can't be technically handled on a project level or their values must be available no matter in which project the values are received. Settings have headless entities or settings UI. - -There is one more category **local settings** but they don't have ability to be changed or defined easily. Local settings can change how settings work per machine, can affect both system and project settings but they're hardcoded for predefined values at this moment. - -## Settings schemas -System and project settings are defined by settings schemas. Schema defines the structure of output value, what value types output will contain, how settings are stored and how its UI input will look. - -## Settings values -Output of settings is a json serializable value. There are 3 possible types of value **default values**, **studio overrides** and **project overrides**. Default values must be always available for all settings schemas, their values are stored to code. Default values are what everyone who just installed OpenPype will use as default values. It is good practice to set example values but they should be actually relevant. - -Setting overrides is what makes settings a powerful tool. Overrides contain only a part of settings with additional metadata that describe which parts of settings values should be replaced from overrides values. Using overrides gives the ability to save only specific values and use default values for rest. It is super useful in project settings which have up to 2 levels of overrides. In project settings are used **default values** as base on which are applied **studio overrides** and then **project overrides**. In practice it is possible to save only studio overrides which affect all projects. Changes in studio overrides are then propagated to all projects without project overrides. But values can be locked on project level so studio overrides are not used. - -## Settings storage -As was mentioned default values are stored into repository files. Overrides are stored in the Mongo database. The value in mongo contain only overrides with metadata so their content on it's own is useless and must be used with combination of default values. System settings and project settings are stored into special collection. Single document represents one set of overrides with OpenPype version for which is stored. Settings are versioned and are loaded in specific order - current OpenPype version overrides or first lower available. If there are any overrides with the same or lower version then the first higher version is used. If there are any overrides then no overrides are applied. - -Project anatomy is stored into a project document thus is not versioned and its values are always overridden. Any changes in anatomy schema may have a drastic effect on production and OpenPype updates. - -## Settings schema items -As was mentioned schema items define output type of values, how they are stored and how they look in UI. -- schemas are (by default) defined by json files -- OpenPype core system settings schemas are stored in `~/openpype/settings/entities/schemas/system_schema/` and project settings in `~/openpype/settings/entities/schemas/projects_schema/` - - both contain `schema_main.json` which are entry points -- OpenPype modules/addons can define their settings schemas using `BaseModuleSettingsDef` in that case some functionality may be slightly modified -- single schema item is represented by dictionary (object) in json which has `"type"` key. - - **type** is only common key which is required for all schema items -- each item may have "input modifiers" (other keys in dictionary) and they may be required or optional based on the type -- there are special keys across all items - - `"is_file"` - this key is used when defaults values are stored in the file. Its value matches the filename where values are stored - - key is validated, must be unique in hierarchy otherwise it won't be possible to store default values - - make sense to fill it only if it's value if `true` - - - `"is_group"` - define that all values under a key in settings hierarchy will be overridden if any value is modified - - this key is not allowed for all inputs as they may not have technical ability to handle it - - key is validated, must be unique in hierarchy and is automatically filled on last possible item if is not defined in schemas - - make sense to fill it only if it's value if `true` -- all entities can have set `"tooltip"` key with description which will be shown in UI on hover - -### Inner schema -Settings schemas are big json files which would become unmanageable if they were in a single file. To be able to split them into multiple files to help organize them special types `schema` and `template` were added. Both types are related to a different file by filename. If a json file contains a dictionary it is considered as `schema` if it contains a list it is considered as a `template`. - -#### schema -Schema item is replaced by content of entered schema name. It is recommended that the schema file is used only once in settings hierarchy. Templates are meant for reusing. -- schema must have `"name"` key which is name of schema that should be used - -```javascript -{ - "type": "schema", - "name": "my_schema_name" -} -``` - -#### template -Templates are almost the same as schema items but can contain one or more items which can be formatted with additional data or some keys can be skipped if needed. Templates are meant for reusing the same schemas with ability to modify content. - -- legacy name is `schema_template` (still usable) -- template must have `"name"` key which is name of template file that should be used -- to fill formatting keys use `"template_data"` -- all items in template, except `__default_values__`, will replace `template` item in original schema -- template may contain other templates - -```javascript -// Example template json file content -[ - { - // Define default values for formatting values - // - gives ability to set the value but have default value - "__default_values__": { - "multipath_executables": true - } - }, { - "type": "raw-json", - "label": "{host_label} Environments", - "key": "{host_name}_environments" - }, { - "type": "path", - "key": "{host_name}_executables", - "label": "{host_label} - Full paths to executables", - "multiplatform": "{multipath_executables}", - "multipath": true - } -] -``` -```javascript -// Example usage of the template in schema -{ - "type": "dict", - "key": "template_examples", - "label": "Schema template examples", - "children": [ - { - "type": "template", - "name": "example_template", - "template_data": [ - { - "host_label": "Maya 2019", - "host_name": "maya_2019", - "multipath_executables": false - }, - { - "host_label": "Maya 2020", - "host_name": "maya_2020" - }, - { - "host_label": "Maya 2021", - "host_name": "maya_2021" - } - ] - } - ] -} -``` -```javascript -// The same schema defined without templates -{ - "type": "dict", - "key": "template_examples", - "label": "Schema template examples", - "children": [ - { - "type": "raw-json", - "label": "Maya 2019 Environments", - "key": "maya_2019_environments" - }, { - "type": "path", - "key": "maya_2019_executables", - "label": "Maya 2019 - Full paths to executables", - "multiplatform": false, - "multipath": true - }, { - "type": "raw-json", - "label": "Maya 2020 Environments", - "key": "maya_2020_environments" - }, { - "type": "path", - "key": "maya_2020_executables", - "label": "Maya 2020 - Full paths to executables", - "multiplatform": true, - "multipath": true - }, { - "type": "raw-json", - "label": "Maya 2021 Environments", - "key": "maya_2021_environments" - }, { - "type": "path", - "key": "maya_2021_executables", - "label": "Maya 2021 - Full paths to executables", - "multiplatform": true, - "multipath": true - } - ] -} -``` - -Template data can be used only to fill templates in values but not in keys. It is also possible to define default values for unfilled fields to do so one of the items in the list must be a dictionary with key "__default_values__"` and value as dictionary with default key: values (as in example above). -```javascript -{ - ... - // Allowed - "key": "{to_fill}" - ... - // Not allowed - "{to_fill}": "value" - ... -} -``` - -Because formatting values can be only string it is possible to use formatting values which are replaced with different types. -```javascript -// Template data -{ - "template_data": { - "executable_multiplatform": { - "type": "schema", - "name": "my_multiplatform_schema" - } - } -} -// Template content -{ - ... - // Allowed - value is replaced with dictionary - "multiplatform": "{executable_multiplatform}" - ... - // Not allowed - there is no way how it could be replaced - "multiplatform": "{executable_multiplatform}_enhanced_string" - ... -} -``` - -#### dynamic_schema -Dynamic schema item marks a place in settings schema where schemas defined by `BaseModuleSettingsDef` can be placed. -- example: -```javascript -{ - "type": "dynamic_schema", - "name": "project_settings/global" -} -``` -- `BaseModuleSettingsDef` with implemented `get_settings_schemas` can return a dictionary where key defines a dynamic schema name and value schemas that will be put there -- dynamic schemas work almost the same way as templates - - one item can be replaced by multiple items (or by 0 items) -- goal is to dynamically load settings of OpenPype modules without having their schemas or default values in core repository - - values of these schemas are saved using the `BaseModuleSettingsDef` methods -- we recommend to use `JsonFilesSettingsDef` which has full implementation of storing default values to json files - - requires only to implement method `get_settings_root_path` which should return path to root directory where settings schema can be found and default values will be saved - -### Basic Dictionary inputs -These inputs wraps another inputs into {key: value} relation - -#### dict -- this is dictionary type wrapping more inputs with keys defined in schema -- may be used as dynamic children (e.g. in [list](#list) or [dict-modifiable](#dict-modifiable)) - - in that case the only key modifier is `children` which is a list of its keys - - USAGE: e.g. List of dictionaries where each dictionary has the same structure. -- if is not used as dynamic children then must have defined `"key"` under which are it's values stored -- may be with or without `"label"` (only for GUI) - - `"label"` must be set to be able to mark item as group with `"is_group"` key set to True -- item with label can visually wrap its children - - this option is enabled by default to turn off set `"use_label_wrap"` to `False` - - label wrap is by default collapsible - - that can be set with key `"collapsible"` to `True`/`False` - - with key `"collapsed"` as `True`/`False` can be set that is collapsed when GUI is opened (Default: `False`) - - it is possible to add lighter background with `"highlight_content"` (Default: `False`) - - lighter background has limits of maximum applies after 3-4 nested highlighted items there is not much difference in the color - - output is dictionary `{the "key": children values}` -```javascript -// Example -{ - "key": "applications", - "type": "dict", - "label": "Applications", - "collapsible": true, - "highlight_content": true, - "is_group": true, - "is_file": true, - "children": [ - ...ITEMS... - ] -} - -// Without label -{ - "type": "dict", - "key": "global", - "children": [ - ...ITEMS... - ] -} - -// When used as widget -{ - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - } - ... - ] - } -} -``` - -#### dict-roots -- entity can be used only in Project settings -- keys of dictionary are based on current project roots -- they are not updated "live" it is required to save root changes and then - modify values on this entity - # TODO do live updates -```javascript -{ - "type": "dict-roots", - "key": "roots", - "label": "Roots", - "object_type": { - "type": "path", - "multiplatform": true, - "multipath": false - } -} -``` - -#### dict-conditional -- is similar to `dict` but has always available one enum entity - - the enum entity has single selection and it's value define other children entities -- each value of enumerator have defined children that will be used - - there is no way how to have shared entities across multiple enum items -- value from enumerator is also stored next to other values - - to define the key under which will be enum value stored use `enum_key` - - `enum_key` must match key regex and any enum item can't have children with same key - - `enum_label` is label of the entity for UI purposes -- enum items are define with `enum_children` - - it's a list where each item represents single item for the enum - - all items in `enum_children` must have at least `key` key which represents value stored under `enum_key` - - enum items can define `label` for UI purposes - - most important part is that item can define `children` key where are definitions of it's children (`children` value works the same way as in `dict`) -- to set default value for `enum_key` set it with `enum_default` -- entity must have defined `"label"` if is not used as widget -- is set as group if any parent is not group (can't have children as group) -- may be with or without `"label"` (only for GUI) - - `"label"` must be set to be able to mark item as group with `"is_group"` key set to True -- item with label can visually wrap its children - - this option is enabled by default to turn off set `"use_label_wrap"` to `False` - - label wrap is by default collapsible - - that can be set with key `"collapsible"` to `True`/`False` - - with key `"collapsed"` as `True`/`False` can be set that is collapsed when GUI is opened (Default: `False`) - - it is possible to add lighter background with `"highlight_content"` (Default: `False`) - - lighter background has limits of maximum applies after 3-4 nested highlighted items there is not much difference in the color -- for UI purposes was added `enum_is_horizontal` which will make combobox appear next to children inputs instead of on top of them (Default: `False`) - - this has extended ability of `enum_on_right` which will move combobox to right side next to children widgets (Default: `False`) -- output is dictionary `{the "key": children values}` -- using this type as template item for list type can be used to create infinite hierarchies - -```javascript -// Example -{ - "type": "dict-conditional", - "key": "my_key", - "label": "My Key", - "enum_key": "type", - "enum_label": "label", - "enum_children": [ - // Each item must be a dictionary with 'key' - { - "key": "action", - "label": "Action", - "children": [ - { - "type": "text", - "key": "key", - "label": "Key" - }, - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "type": "text", - "key": "command", - "label": "Command" - } - ] - }, - { - "key": "menu", - "label": "Menu", - "children": [ - { - "key": "children", - "label": "Children", - "type": "list", - "object_type": "text" - } - ] - }, - { - // Separator does not have children as "separator" value is enough - "key": "separator", - "label": "Separator" - } - ] -} -``` - -How output of the schema could look like on save: -```javascript -{ - "type": "separator" -} - -{ - "type": "action", - "key": "action_1", - "label": "Action 1", - "command": "run command -arg" -} - -{ - "type": "menu", - "children": [ - "child_1", - "child_2" - ] -} -``` - -### Inputs for setting any kind of value (`Pure` inputs) -- all inputs must have defined `"key"` if are not used as dynamic item - - they can also have defined `"label"` - -#### boolean -- simple checkbox, nothing more to set -```javascript -{ - "type": "boolean", - "key": "my_boolean_key", - "label": "Do you want to use Pype?" -} -``` - -#### number -- number input, can be used for both integer and float - - key `"decimal"` defines how many decimal places will be used, 0 is for integer input (Default: `0`) - - key `"minimum"` as minimum allowed number to enter (Default: `-99999`) - - key `"maximum"` as maximum allowed number to enter (Default: `99999`) -- key `"steps"` will change single step value of UI inputs (using arrows and wheel scroll) -- for UI it is possible to show slider to enable this option set `show_slider` to `true` -```javascript -{ - "type": "number", - "key": "fps", - "label": "Frame rate (FPS)" - "decimal": 2, - "minimum": 1, - "maximum": 300000 -} -``` - -```javascript -{ - "type": "number", - "key": "ratio", - "label": "Ratio" - "decimal": 3, - "minimum": 0, - "maximum": 1, - "show_slider": true -} -``` - -#### text -- simple text input - - key `"multiline"` allows to enter multiple lines of text (Default: `False`) - - key `"placeholder"` allows to show text inside input when is empty (Default: `None`) - -```javascript -{ - "type": "text", - "key": "deadline_pool", - "label": "Deadline pool" -} -``` - -#### path-input -- Do not use this input in schema please (use `path` instead) -- this input is implemented to add additional features to text input -- this is meant to be used in proxy input `path` - -#### raw-json -- a little bit enhanced text input for raw json -- can store dictionary (`{}`) or list (`[]`) but not both - - by default stores dictionary to change it to list set `is_list` to `True` -- has validations of json format -- output can be stored as string - - this is to allow any keys in dictionary - - set key `store_as_string` to `true` - - code using that setting must expected that value is string and use json module to convert it to python types - -```javascript -{ - "type": "raw-json", - "key": "profiles", - "label": "Extract Review profiles", - "is_list": true -} -``` - -#### enum -- enumeration of values that are predefined in schema -- multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`) -- values are defined under value of key `"enum_items"` as list - - each item in list is simple dictionary where value is label and key is value which will be stored - - should be possible to enter single dictionary if order of items doesn't matter -- it is possible to set default selected value/s with `default` attribute - - it is recommended to use this option only in single selection mode - - at the end this option is used only when defying default settings value or in dynamic items - -```javascript -{ - "key": "tags", - "label": "Tags", - "type": "enum", - "multiselection": true, - "enum_items": [ - {"burnin": "Add burnins"}, - {"ftrackreview": "Add to Ftrack"}, - {"delete": "Delete output"}, - {"slate-frame": "Add slate frame"}, - {"no-handles": "Skip handle frames"} - ] -} -``` - -#### anatomy-templates-enum -- enumeration of all available anatomy template keys -- have only single selection mode -- it is possible to define default value `default` - - `"work"` is used if default value is not specified -- enum values are not updated on the fly it is required to save templates and - reset settings to recache values -```javascript -{ - "key": "host", - "label": "Host name", - "type": "anatomy-templates-enum", - "default": "publish" -} -``` - -#### hosts-enum -- enumeration of available hosts -- multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`) -- it is possible to add empty value (represented with empty string) with setting `"use_empty_value"` to `True` (Default: `False`) -- it is possible to set `"custom_labels"` for host names where key `""` is empty value (Default: `{}`) -- to filter host names it is required to define `"hosts_filter"` which is list of host names that will be available - - do not pass empty string if `use_empty_value` is enabled - - ignoring host names would be more dangerous in some cases -```javascript -{ - "key": "host", - "label": "Host name", - "type": "hosts-enum", - "multiselection": false, - "use_empty_value": true, - "custom_labels": { - "": "N/A", - "nuke": "Nuke" - }, - "hosts_filter": [ - "nuke" - ] -} -``` - -#### apps-enum -- enumeration of available application and their variants from system settings - - applications without host name are excluded -- can be used only in project settings -- has only `multiselection` -- used only in project anatomy -```javascript -{ - "type": "apps-enum", - "key": "applications", - "label": "Applications" -} -``` - -#### tools-enum -- enumeration of available tools and their variants from system settings -- can be used only in project settings -- has only `multiselection` -- used only in project anatomy -```javascript -{ - "type": "tools-enum", - "key": "tools_env", - "label": "Tools" -} -``` - -#### task-types-enum -- enumeration of task types from current project -- enum values are not updated on the fly and modifications of task types on project require save and reset to be propagated to this enum -- has set `multiselection` to `True` but can be changed to `False` in schema - -#### deadline_url-enum -- deadline module specific enumerator using deadline system settings to fill it's values -- TODO: move this type to deadline module - -### Inputs for setting value using Pure inputs -- these inputs also have required `"key"` -- attribute `"label"` is required in few conditions - - when item is marked `as_group` or when `use_label_wrap` -- they use Pure inputs "as widgets" - -#### list -- output is list -- items can be added and removed -- items in list must be the same type -- to wrap item in collapsible widget with label on top set `use_label_wrap` to `True` - - when this is used `collapsible` and `collapsed` can be set (same as `dict` item does) -- type of items is defined with key `"object_type"` -- there are 2 possible ways how to set the type: - 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) - 2.) item type name as string without modifiers (e.g. [text](#text)) - 3.) enhancement of 1.) there is also support of `template` type but be careful about endless loop of templates - - goal of using `template` is to easily change same item definitions in multiple lists - -1.) with item modifiers -```javascript -{ - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": { - "type": "number", # number item type - "minimum": 1, # minimum modifier - "maximum": 65535 # maximum modifier - } -} -``` - -2.) without modifiers -```javascript -{ - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": "text" -} -``` - -3.) with template definition -```javascript -// Schema of list item where template is used -{ - "type": "list", - "key": "menu_items", - "label": "Menu Items", - "object_type": { - "type": "template", - "name": "template_object_example" - } -} - -// WARNING: -// In this example the template use itself inside which will work in `list` -// but may cause an issue in other entity types (e.g. `dict`). - -'template_object_example.json' : -[ - { - "type": "dict-conditional", - "use_label_wrap": true, - "collapsible": true, - "key": "menu_items", - "label": "Menu items", - "enum_key": "type", - "enum_label": "Type", - "enum_children": [ - { - "key": "action", - "label": "Action", - "children": [ - { - "type": "text", - "key": "key", - "label": "Key" - } - ] - }, { - "key": "menu", - "label": "Menu", - "children": [ - { - "key": "children", - "label": "Children", - "type": "list", - "object_type": { - "type": "template", - "name": "template_object_example" - } - } - ] - } - ] - } -] -``` - -#### dict-modifiable -- one of dictionary inputs, this is only used as value input -- items in this input can be removed and added same way as in `list` input -- value items in dictionary must be the same type -- required keys may be defined under `"required_keys"` - - required keys must be defined as a list (e.g. `["key_1"]`) and are moved to the top - - these keys can't be removed or edited (it is possible to edit label if item is collapsible) -- type of items is defined with key `"object_type"` - - there are 2 possible ways how to set the object type (Examples below): - 1. just a type name as string without modifiers (e.g. `"text"`) - 2. full types with modifiers as dictionary(`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` -- this input can be collapsible - - `"use_label_wrap"` must be set to `True` (Default behavior) - - that can be set with key `"collapsible"` as `True`/`False` (Default: `True`) - - with key `"collapsed"` as `True`/`False` can be set that is collapsed when GUI is opened (Default: `False`) - -1. **Object type** without modifiers -```javascript -{ - "type": "dict-modifiable", - "object_type": "text", - "is_group": true, - "key": "templates_mapping", - "label": "Deadline - Templates mapping", - "is_file": true -} -``` - -2. **Object type** with item modifiers -```javascript -{ - "type": "dict-modifiable", - "object_type": { - "type": "number", - "minimum": 0, - "maximum": 300 - }, - "is_group": true, - "key": "templates_mapping", - "label": "Deadline - Templates mapping", - "is_file": true -} -``` - -#### path -- input for paths, use `path-input` internally -- has 2 input modifiers `"multiplatform"` and `"multipath"` - - `"multiplatform"` - adds `"windows"`, `"linux"` and `"darwin"` path inputs (result is dictionary) - - `"multipath"` - it is possible to enter multiple paths - - if both are enabled result is dictionary with lists - -```javascript -{ - "type": "path", - "key": "ffmpeg_path", - "label": "FFmpeg path", - "multiplatform": true, - "multipath": true -} -``` - -#### list-strict -- input for strict number of items in list -- each child item can be different type with different possible modifiers -- it is possible to display them in horizontal or vertical layout - - key `"horizontal"` as `True`/`False` (Default: `True`) -- each child may have defined `"label"` which is shown next to input - - label does not reflect modifications or overrides (TODO) -- children item are defined under key `"object_types"` which is list of dictionaries - - key `"children"` is not used because is used for hierarchy validations in schema -- USAGE: For colors, transformations, etc. Custom number and different modifiers - give ability to define if color is HUE or RGB, 0-255, 0-1, 0-100 etc. - -```javascript -{ - "type": "list-strict", - "key": "color", - "label": "Color", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] -} -``` - -#### color -- pre implemented entity to store and load color values -- entity store and expect list of 4 integers in range 0-255 - - integers represents rgba [Red, Green, Blue, Alpha] -- has modifier `"use_alpha"` which can be `True`/`False` - - alpha is always `255` if set to `True` and alpha slider is not visible in UI - -```javascript -{ - "type": "color", - "key": "bg_color", - "label": "Background Color" -} -``` - -### Anatomy -Anatomy represents data stored on project document. Item cares about **Project Anatomy**. - -#### anatomy -- entity is just enhanced [dict](#dict) item -- anatomy has always all keys overridden with overrides - -### Noninteractive items -Items used only for UI purposes. - -#### label -- add label with note or explanations -- it is possible to use html tags inside the label -- set `work_wrap` to `true`/`false` if you want to enable word wrapping in UI (default: `false`) - -```javascript -{ - "type": "label", - "label": "RED LABEL: Normal label" -} -``` - -#### separator -- legacy name is `splitter` (still usable) -- visual separator of items (more divider than separator) - -```javascript -{ - "type": "separator" -} -``` - -### Proxy wrappers -- should wrap multiple inputs only visually -- these do not have `"key"` key and do not allow to have `"is_file"` or `"is_group"` modifiers enabled -- can't be used as a widget (first item in e.g. `list`, `dict-modifiable`, etc.) - -#### form -- wraps inputs into form look layout -- should be used only for Pure inputs - -```javascript -{ - "type": "dict-form", - "children": [ - { - "type": "text", - "key": "deadline_department", - "label": "Deadline apartment" - }, { - "type": "number", - "key": "deadline_priority", - "label": "Deadline priority" - }, { - ... - } - ] -} -``` - - -#### collapsible-wrap -- wraps inputs into collapsible widget - - looks like `dict` but does not hold `"key"` -- should be used only for Pure inputs - -```javascript -{ - "type": "collapsible-wrap", - "label": "Collapsible example" - "children": [ - { - "type": "text", - "key": "_example_input_collapsible", - "label": "Example input in collapsible wrapper" - }, { - ... - } - ] -} -``` - - -## How to add new settings -Always start with modifying or adding a new schema and don't worry about values. When you think schema is ready to use launch OpenPype settings in development mode using `poetry run python ./start.py settings --dev` or prepared script in `~/openpype/tools/run_settings(.sh|.ps1)`. Settings opened in development mode have the checkbox `Modify defaults` available in the bottom left corner. When checked default values are modified and saved on `Save`. This is a recommended approach on how default settings should be created instead of direct modification of files. - -![Modify default settings](assets/settings_dev.png) diff --git a/website/docs/dev_testing.md b/website/docs/dev_testing.md deleted file mode 100644 index 434c1ca9ff..0000000000 --- a/website/docs/dev_testing.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -id: dev_testing -title: Testing in OpenPype -sidebar_label: Testing ---- - -## Introduction -As OpenPype is growing there also grows need for automatic testing. There are already bunch of tests present in root folder of OpenPype directory. -But many tests should yet be created! - -### How to run (integration) tests - -#### Requirements -- installed DCC you want to test -- `mongorestore` on a PATH - -You could check that `mongorestore` is available by running this in console (or cmd), it shouldn't fail and you should see version of utility: -```commandline -mongorestore --version -``` - -If you would like just to experiment with provided integration tests, and have particular DCC installed on your machine, you could run test for this host by: - -- From source: -``` -- use Openpype command 'runtests' from command line (`.venv` in ${OPENPYPE_ROOT} must be activated to use configured Python!) -- `python ${OPENPYPE_ROOT}/start.py runtests ../tests/integration/hosts/nuke` -``` -- From build: -``` -- ${OPENPYPE_BUILD}/openpype_console runtests {ABSOLUTE_PATH_OPENPYPE_ROOT}/tests/integration/hosts/nuke` -``` -Modify tests path argument to limit which tests should be run (`../tests/integration` will run all implemented integration tests). - -### Content of tests folder - -Main tests folder contains hierarchy of folders with tests and supporting lib files. It is intended that tests in each folder of the hierarchy could be run separately. - -Main folders in the structure: -- `integration` - end to end tests in host applications, mimicking regular publishing process -- `lib` - helper classes -- `resources` - test data skeletons etc. -- `unit` - unit test covering methods and functions in OP - - -### lib folder - -This location should contain library of helpers and miscellaneous classes used for integration or unit tests. - -Content: -- `assert_classes.py` - helpers for easier use of assert expressions -- `db_handler.py` - class for creation of DB dumps/restore/purge -- `file_hanlder.py` - class for preparation/cleanup of test data -- `testing_classes.py` - base classes for testing of publish in various DCCs - -### integration folder - -Contains end to end testing in a DCC. Currently it is setup to start DCC application with prepared worfkile, run publish process and compare results in DB and file system automatically. -This approach is implemented as it should work in any DCC application and should cover most common use cases. Not all hosts allow "real headless" publishing, but all hosts should allow to trigger -publish process programmatically when UI of host is actually running. - -There will be eventually also possibility to build workfile and publish it programmatically, this would work only in DCCs that support it (Maya, Nuke). - -It is expected that each test class should work with single worfkile with supporting resources (as a dump of project DB, all necessary environment variables, expected published files etc.) - -There are currently implemented basic publish tests for `Maya`, `Nuke`, `AfterEffects` and `Photoshop`. Additional hosts will be added. - -Each `test_` class should contain single test class based on `tests.lib.testing_classes.PublishTest`. This base class handles all necessary -functionality for testing in a host application. - -#### Steps of publish test - -Each publish test consists of areas: -- preparation -- launch of host application -- publish -- comparison of results in DB and file system -- cleanup - -##### Preparation - -Each test publish case expects zip file with this structure: -- `expected` - published files after workfile is published (in same structure as in regular manual publish) -- `input` - - `dumps` - database dumps (check `tests.lib.db_handler` for implemented functionality) - - `openpype` - settings - - `test_db` - skeleton of test project (contains project document, asset document etc.) - - `env_vars` - `env_var.json` file with a dictionary of all required environment variables - - `json` - json files with human readable content of databases - - `startup` - any required initialization scripts (for example Nuke requires one `init.py` file) - - `workfile` - contains single workfile - -These folders needs to be zipped (in zip's root must be this structure directly!), currently zip files for all prepared tests are stored in OpenPype GDrive folder. - -Each test then goes in steps (by default): -- download test data zip -- create temporary folder and unzip there data zip file -- purge test DB if exists, import dump files from unzipped folder -- sets environment variables from `env_vars` folder -- launches host application and trigger publish process -- waits until publish process finishes, application closes (or timeouts) -- compares results in DB with expected values -- compares published files structure with expected values -- cleans up temporary test DB and folder - -##### Launch of application and publish - -Integration tests are using same approach as OpenPype process regarding launching of host applications (eg. `ApplicationManager().launch`). -Each host application is in charge of triggering of publish process and closing itself. Different hosts handle this differently, Adobe products are handling this via injected "HEADLESS_PUBLISH" environment variable, -Maya and Nuke must contain this in theirs startup files. - -Base `PublishTest` class contains configurable timeout in case of publish process is not working, or taking too long. - -##### Comparison of results - -Each test class requires re-iplemented `PublishTest.test_db_asserts` fixture. This method is triggered after publish is finished and should -compare current results in DB (each test has its own database which gets filled with dump data first, cleaned up after test finishing) with expected results. - -`tests.lib.assert_classes.py` contains prepared method `count_of_types` which makes easier to write assert expression. This method also produces formatted error message. - -Basic use case: -```DBAssert.count_of_types(dbcon, "version", 2)``` >> It is expected that DB contains only 2 documents of `type==version` - -If zip file contains file structure in `expected` folder, `PublishTest.test_folder_structure_same` implements comparison of expected and published file structure, -eg. if test case published all expected files. - -##### Cleanup - -By default, each test case pulls data from GDrive, unzips them in temporary folder, runs publish, compares results and then -purges created temporary test database and temporary folder. This could be changed by setting of `PublishTest.PERSIST`. If set to True, DB and published folder are kept intact -until next run of any test. - -In case you want to modify test data, use `PublishTest.TEST_DATA_FOLDER` to point test to specific location where test folder is already unzipped. - -Both options are mostly useful for debugging during implementation of new test cases. - -#### Test configuration - -Each test case could be configured from command line with: -- `test_data_folder` - use specific folder with extracted test zip file -- `persist` - keep content of temporary folder and database after test finishes -- `app_variant` - run test for specific version of host app, matches app variants in Settings, eg. `2021` for Photoshop, `12-2` for Nuke -- `timeout` - override default time (in seconds) - -### unit folder - -Here should be located unit tests for classes, methods of OpenPype etc. As most classes expect to be triggered in OpenPype context, best option is to -start these tests in similar fashion as `integration` tests (eg. via `runtests`). \ No newline at end of file diff --git a/website/docs/features.md b/website/docs/features.md deleted file mode 100644 index 43fd522346..0000000000 --- a/website/docs/features.md +++ /dev/null @@ -1,255 +0,0 @@ -## Pype tray - -Ftrack - -Login - -reset Action server - -Launcher: Launch applications without the need of going through ftrack website - -Library: Browse through all the published assets across the projects. You can also launch actions. - -Standalone Publisher - -Services - -Idle manager - -Timers manager - -Statistics server - -## System Admin - -Manage environments per project/shot/tasks - -Centralized pipeline installation - -Localized Python environment (for speed purposes) - -Automatic user environment updates (online/offline) - -Ability to run completely offline for TPN and MPAA certified sites - -Git controlled deployment - -Separated development and production installation for safety and testing - -Per project pipeline configuration overrides - -Linux, Windows, Mac support - -MongoDB backbone - -## Ftrack - -Launch applications - -Custom actions - -Create base project structure - -Create Folders - -Sync to Avalon - -Propagate Thumbnails - -Create required custom attributes - -launch version in RV / DJVview - -Delete assets and subsets - -Sort Client Review - -Kill old Ftrack jobs - -Event server (automatically triggered actions) - -Sync to Avalon - -Update status on the next task - -Propagate Thumbnails from version to tasks and assets/shots - -Propagate statuses between versions and tasks - -Avalon <-> Ftrack sync - -## Maya - -### Tools - -Creator - -Publisher - -Loader - -Scene Inventory - -Look assigner - -Workfiles - -### Families - -Model - -Look - -Rig - -Animation - -Cache - -Camera - -Assembly - -MayaAscii (generic scene) - -Setdress - -RenderSetup - -Review - -arnoldStandin - -vrayProxy - -vrayScene - -yetiCache - -yetiRig - -## Houdini - -### Tools - -Creator - -Publisher - -Loader - -Scene Inventory - -Look assigner - -Workfiles - -### Families - -Model - -Animation - -Cache - -Camera - -Review - -## Nuke - -Tools - -Publisher - -Loader - -Scene Inventory - -Workfiles - -Families - -Model (load only) - -Camera (load only) - -Render - -Review - -Plate - -Prerender - -## NukeStudio - -Create Shots in Ftrack and Avalon - -handles - -frame ranges - -edit in and edit out - -Publish Plates - -Any number of plate - -colorspace managed - -Attach preview quicktimes to Ftrack versions - -## Fusion - -Tools - -Publisher - -Loader - -Scene Inventory - -Workfiles - -Families - -Model (load only) - -Camera (load only) - -Render - -Review - -Plate - -Prerender - -## Deadline - -Publish to deadline from - -Maya - -Nuke - -Create preview quicktimes from rendered frames - -publish rendered outputs to Avalon and Ftrack - -## Royal Render -Publish to Royal Render from -Maya -Nuke - - -## Clockify - -Automatic timer start and stop in sync with Ftrack. - -## Arnold - -## Vray - -## Redshift diff --git a/website/docs/manager_ftrack.md b/website/docs/manager_ftrack.md deleted file mode 100644 index 836d84405e..0000000000 --- a/website/docs/manager_ftrack.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: manager_ftrack -title: Ftrack -sidebar_label: Project Manager ---- - -Ftrack is currently the main project management option for OpenPype. This documentation assumes that you are familiar with Ftrack and its basic principles. If you're new to Ftrack, we recommend having a thorough look at [Ftrack Official Documentation](https://help.ftrack.com/en/). - -## Project management -Setting project attributes is the key to properly working pipeline. - -### New Project -The best practice for creating a new project ready for OpenPype. -1. First of all you must [create a project](http://ftrack.rtd.ftrack.com/en/stable/using/managing_projects/creating_a_new_project.html) in Ftrack. -2. All the required attributes need to be populated. The easiest way to do it is by using [Prepare Project](manager_ftrack_actions.md#prepare-project) action. - -:::tip -Do not forget to set up `applications` and `tools`, otherwise users won't be able to launch applications. -::: - -3. Now you can create Project hierarchy with shots, assets, tasks and others, which has [specific rules](#synchronization-rules). [Create Project Structure](manager_ftrack_actions.md#create-project-structure) action may help you with this step. -4. Last step is to [synchronize](#synchronization-to-avalon-database) project to Avalon database. - -:::tip -Turn on `auto-sync` attribute on your project in ftrack. That way you'll only need to synchronise the project once and all further changes will be propagated automatically. -::: - -## Synchronization to Avalon database -This process describes how data from Ftrack will get into Avalon database. - -### How to synchronize -You can trigger synchronization manually using [Sync To Avalon](manager_ftrack_actions.md#sync-to-avalon) action. - -Synchronization can also be automated with OpenPype's [event server](#event-server) and synchronization events. If your Ftrack is [prepared for OpenPype](module_ftrack.md#prepare-ftrack-for-openpype), the project should have custom attribute `Avalon auto-sync`. Check the custom attribute to allow auto-updates with event server. - -:::tip -Always use `Sync To Avalon` action before you enable `Avalon auto-sync`! -::: - -:::important -Synchronization actions and events can show you interface with information when something goes differently than expected. Just read carefully what happened messages should guide you. -::: - -### Synchronization rules -Required: -- entity can only contain **letters**, **numbers** and **underscore** symbols. *(In technical terms: all names must match regex: `^[a-zA-Z0-9_.]*$`)`* - -Not allowed: -- duplicated entity names within project (there can be only one shot with name "sh0010" in whole project for example) -- have any **Tasks** directly on the *Project* level - -### Managing Entities - -There are certain situations that are very hard, or even impossible to handle automatically and will have be resolved by your TD. These include - -- Deleting shots and assets after some data has already been published in them. -- Re-structuring the project hierarchy when work is already being done. -- Renaming the Project - -If you need to move entity or change its name it is possible only in the acse when no-one has worked on it yet. Once work is in progreess, you must archive the old one and create new. - -To archive entities you should use [Archive Asset/Subset](manager_ftrack_actions.md#delete-asset/subset) action. This will remove the selected entity from ftrack and avalon database in mostly non-destructive way, so it can be recovered later. To completely delete all traces of this such entity you'll need to go to OpenPype archive and delete them from there. diff --git a/website/docs/manager_ftrack_actions.md b/website/docs/manager_ftrack_actions.md deleted file mode 100644 index 4cd3b80d57..0000000000 --- a/website/docs/manager_ftrack_actions.md +++ /dev/null @@ -1,316 +0,0 @@ ---- -id: manager_ftrack_actions -title: Ftrack Actions -sidebar_label: Ftrack actions ---- - -Actions are small useful tools that help artists, managers and administrators. -To avoid overfilled action menu some actions are filtered by entity types and some of them by user roles permissions. - -In most cases actions filtered by entity type: -- Project -- Typed Context - - Folder - - Episode - - Sequence - - Shot - - Library - - Asset Build - - Asset Variant - - Epic - - Milestone -- Task -- Asset Version -- Component -- Review Session - -*Typed Context* is global Ftrack entity for hierarchical types representing all of them. Hierarchical types can be used for filtering too, but because they are dynamic *(you can add, modify and remove them)*, *Typed Context* is used to be more general. - -So if you do not see action you need to use check if action is available for selected *entity type* or ask *administrator* to check if you have permissions to use it. - -:::note -Actions can be heavily customised by your studio, so this guide might not fit 100 %. -::: - -:::important -Filtering can be more complicated for example a lot of actions can be shown only when one particular entity is selected. -::: - ---- -## Applications - -### Launch applications -* Entity types: Task -* User roles: All - -These actions *launch application with OpenPype * and *start timer* for the selected Task. We recommend you to launch application this way. - -:::important -Project Manager or Supervisor must set project's applications during project preparation otherwise you won't see them. Applications can be added even if the project is in progress. -::: - ---- -
-
- -## OpenPype Admin - -
-
- -![pype_admin-icon](assets/ftrack/ftrack-pype_admin-icon.png) - -
-
- - -#### A group of actions that are used for OpenPype Administration. - -### Sync to Avalon -* Entity types: Project, Typed Context -* User roles: Pypeclub, Administrator, Project manager - -Synchronization to Avalon is key process to keep OpenPype data updated. Action updates selected entities (Project, Shot, Sequence, etc.) and all nested entities to Avalon database. If action is successfully finished [Sync Hier Attrs](#sync-hier-attrs) action is triggered. - -There are 2 versions of **Sync to Avalon**, first labeled as **server** second as **local**. -* **server** version will be processed with [event server](module_ftrack.md#event-server) -* **local** version will be processed with user's OpenPype tray application - -It is recommended to use **local** version if possible to avoid unnecessary deceleration of event server. - -### Sync Hier Attrs -* Entity types: Project, Typed Context -* User roles: Pypeclub, Administrator, Project manager - -Synchronization to Avalon of Ftrack's hierarchical Custom attributes is a bit complicated so we decided to split synchronization process into 2 actions. This action updates hierarchical Custom attributes of selected entities (Project, Shot, Sequence, etc.) and all their nested entities to pipeline database. This action is also triggered automatically after successfully finished [Sync To Avalon](#sync-to-avalon) action. - -There are 2 versions of **Sync Hier Attrs** first labeled as **server** second as **local**. -* **server** version will be processed with [event server](module_ftrack.md#event-server) -* **local** version will be processed with user's OpenPype application - -It is recommended to use **local** version if possible to avoid unnecessary deceleration of event server. - -### Job Killer -* Entity types: All -* User roles: Pypeclub, Administrator - -Custom Jobs in Ftrack help to track process and status of triggered actions but sometimes unexpected failure of action may happen *(Please let us know when happens)*. The failure will cause that job's status will remain set to **Running** which may cause issues in future. - -This action gives ability to *stop running jobs*. When action is triggered, an interface with all running jobs with checkbox next to each is shown. Status of checked jobs will be set to **Failure** on submit. - -### Delete Assets by Name -* Entity types: Typed Context, Task -* User roles: Pypeclub, Administrator - -With this action it's possible to delete up to 15 entities at once from active project in pipeline database. Entered names must match exactly the names stored in database. These entities also must not have children entities *(Sequence must not have Shots but Task is not entity)*. - ---- -
-
- -## Prepare Project - -
-
- -![prepare_project-icon](assets/ftrack/ftrack-prepare_project-icon.png) - -
-
- -* Entity types: Project -* User roles: Pypeclub, Administrator, Project manager - -Allows project managers and coordinator to *set basic project attributes* needed for OpenPype to operate, *Create project folders* if you want and especially prepare project specific [settings](admin_settings_project). - -:::tip -It is possible to use this action during the lifetime of a project but we recommend using it only once at the start of the project. -::: - -![prepare_project_1](assets/ftrack/ftrack-prepare_project_1-small.png) - ---- -
-
- -## Multiple Notes - -
-
- -![multiple_notes-icon](assets/ftrack/ftrack-multiple_notes-icon.png) - -
-
- -* Entity types: Asset Version -* User roles: All - -You can add same note to multiple Asset Versions at once with this action. -![multiple_notes_1](assets/ftrack/ftrack-multiple_notes_1-small.png) - ---- -
-
- -## Delete Asset/Subset - -
-
- -![delete_asset-icon](assets/ftrack/ftrack-delete_asset-icon.png) - -
-
- -* Entity types: Typed Context, Task -* User roles: Pypeclub, Administrator - -Action deletes Entities and Asset Versions from Ftrack and Avalon database. - -You should use this action if you need to delete Entities or Asset Versions otherwise deletion will not take effect in Avalon database. Currently the action allows to only delete one entity at the time. Entity also must not have any children. - ---- -
-
- -## Create Project Structure - -
-
- -![create_project_folders-icon](assets/ftrack/ftrack-create_project_folders-icon.png) - -
-
- -* Entity types: Project -* User roles: Pypeclub, Administrator - -*Create Project Structure* helps to create basic folder structure and may create the main ftrack entities for the project. - -Structure is loaded from settings *(OpenPype Settings โ†’ Project โ†’ Global โ†’ Project Folder Structure)*. You should examine these settings to see how it works. Settings may contain dictionaries of nested dictionaries where each key represents a folder name. Key and all it's parents will be also created in Ftrack if the key ends with `[ftrack]`. Default Ftrack entity type is *Folder* but entity type can be specified using `[ftrack.{entity type}]`. To create *Sequence* with name *Seq_001* key should look like `Seq_001[ftrack.Sequence]`. - -:::note -Please keep in mind this action is meant to make your project setup faster at the very beginning, but it does not create folders for each shot and asset. For creating asset folder refer to `Create Folders` Action -::: - ---- -
-
- -## Delivery - -
-
- -![ftrack-delivery-icon](assets/ftrack/ftrack-delivery-icon.png) - -
-
- -* Entity types: Task -* User roles: Pypeclub, Project manager, Administrator - -Collects approved hires files and copy them into a folder. It takes any components of any versions and copies and renames them correctly. - - ---- -
-
- -## Create Folders - -
-
- -![create_folders-icon](assets/ftrack/ftrack-create_folders-icon.png) - -
-
- -* Entity types: Typed Context, Task -* User roles: All - -It is usually not necessary to launch this action because folders are created automatically every time you start working on a task. However it can be handy if you need to create folders before any work begins or you want to use applications that don't have pipeline implementation. - ---- -
-
- -## Thumbnail - -
-
- -![thumbnail-icon](assets/ftrack/ftrack-thumbnail-icon.png) - -
-
- -A group of actions for thumbnail management. - -### Thumbnail to Parent -Propagates the thumbnail of the selected entity to its parent. - -### Thumbnail to Children -Propagates the thumbnail of the selected entity to its first direct children entities. - ---- -## RV -* Entity types: All -* User roles: All - -You can launch RV player with playable components from selected entities. You can choose which components will be played. - -:::important -You must have RV player installed and licensed and have correct RV environments set to be able use this action. -::: - ---- -## DJV View -* Entity types: Task, Asset Version -* User roles: All - -You can launch DJV View with one playable component from selected entities. You can choose which component will be played. - -:::important -You must have DJV View installed and configured in studio-config to be able use this action. -::: - ---- -
-
- -## Open File - -
-
- -![component_open-icon](assets/ftrack/ftrack-component_open-icon.png) - -
-
- -* Entity types: File Component -* User roles: All - -This action will open folder of selected *Component* on *Asset Version*. - -:::warning -Does not work for components uploaded to Ftrack Web server. -::: -![component_open_1](assets/ftrack/ftrack-component_open_1-small.png) - -:::warning -Component's path must be accessible by current OS. -::: - ---- -## Sort Review -* Entity types: Review Session -* User roles: All - -Helps you sort *Asset Versions* in *Client Review Session*. - -Asset Versions are sorted by *Version number*, *Task name* and *Version name*. diff --git a/website/docs/module_clockify.md b/website/docs/module_clockify.md deleted file mode 100644 index f1020ab818..0000000000 --- a/website/docs/module_clockify.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: module_clockify -title: Clockify Administration -sidebar_label: Clockify ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - diff --git a/website/docs/module_deadline.md b/website/docs/module_deadline.md deleted file mode 100644 index bca2a83936..0000000000 --- a/website/docs/module_deadline.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -id: module_deadline -title: Deadline Administration -sidebar_label: Deadline ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -## Preparation - -For [AWS Thinkbox Deadline](https://www.awsthinkbox.com/deadline) support you need to set a few things up in both OpenPype and Deadline itself - -1. Deploy OpenPype executable to all nodes of Deadline farm. See [Install & Run](admin_use.md) - -2. Enable Deadline Module in the [OpenPype Admin Settings](admin_settings_system.md#deadline). - -3. Set up *Deadline Web API service*. For more details on how to do it, see [here](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/web-service.html). - -4. Point OpenPype to your deadline webservice URL in the [OpenPype Admin Settings](admin_settings_system.md#deadline). - -5. Install our custom plugin and scripts to your deadline repository. It should be as simple as copying content of `openpype/modules/deadline/repository/custom` to `path/to/your/deadline/repository/custom`. - -Multiple different DL webservice could be configured. First set them in point 4., then they could be configured per project in `project_settings/deadline/deadline_servers`. -Only single webservice could be a target of publish though. - - -## Configuration - -OpenPype integration for Deadline consists of two parts: - -- The `OpenPype` Deadline Plug-in -- A `GlobalJobPreLoad` Deadline Script (this gets triggered for each deadline job) - -The `GlobalJobPreLoad` handles populating render and publish jobs with proper environment variables using settings from the `OpenPype` Deadline Plug-in. - -The `OpenPype` Deadline Plug-in must be configured to point to a valid OpenPype executable location. The executable need to be installed to -destinations accessible by DL process. Check permissions (must be executable and accessible by Deadline process) - -- Enable `Tools > Super User Mode` in Deadline Monitor - -- Go to `Tools > Configure Plugins...`, find `OpenPype` in the list on the left side, find location of OpenPype -executable. It is recommended to use the `openpype_console` executable as it provides a bit more logging. - -- In case of multi OS farms, provide multiple locations, each Deadline Worker goes through the list and tries to find the first accessible - location for itself. - -![Configure plugin](assets/deadline_configure_plugin.png) - -### OpenPypeTileAssembler Plugin -To setup tile rendering copy the `OpenPypeTileAssembler` plugin to the repository; -`[OpenPype]\openpype\modules\deadline\repository\custom\plugins\OpenPypeTileAssembler` > `[DeadlineRepository]\custom\plugins\OpenPypeTileAssembler` - -### Pools - -The main pools can be configured at `project_settings/deadline/publish/CollectDeadlinePools/primary_pool`, which is applied to the rendering jobs. - -The dependent publishing job's pool uses `project_settings/deadline/publish/ProcessSubmittedJobOnFarm/deadline_pool`. If nothing is specified the pool will fallback to the primary pool above. - -:::note maya tile rendering -The logic for publishing job pool assignment applies to tiling jobs. -::: - -## Troubleshooting - -#### Publishing jobs fail directly in DCCs - -- Double check that all previously described steps were finished -- Check that `deadlinewebservice` is running on DL server -- Check that user's machine has access to deadline server on configured port - -#### Jobs are failing on DL side - -Each publishing from OpenPype consists of 2 jobs, first one is rendering, second one is the publishing job (triggered after successful finish of the rendering job). - -![Jobs in DL](assets/deadline_fail.png) - -- Jobs are failing with `OpenPype executable was not found` error - - Check if OpenPype is installed on the Worker handling this job and ensure `OpenPype` Deadline Plug-in is properly [configured](#configuration) - - -- Publishing job is failing with `ffmpeg not installed` error - - OpenPype executable has to have access to `ffmpeg` executable, check OpenPype `Setting > General` - - ![FFmpeg setting](assets/ffmpeg_path.png) - -- Both jobs finished successfully, but there is no review on Ftrack - - Make sure that you correctly set published family to be send to Ftrack. - - ![Ftrack Family](assets/ftrack/ftrack-collect-main.png) - - Example: I want send to Ftrack review of rendered images from Harmony : - - `Host names`: "harmony" - - `Families`: "render" - - `Add Ftrack Family` to "Enabled" - - Make sure that you actually configured to create review for published subset in `project_settings/ftrack/publish/CollectFtrackFamily` - - ![Ftrack Family](assets/deadline_review.png) - - Example: I want to create review for all reviewable subsets in Harmony : - - Add "harmony" as a new key an ".*" as a value. - - -- Rendering jobs are stuck in 'Queued' state or failing - - Make sure that your Deadline is not limiting specific jobs to be run only on specific machines. (Eg. only some machines have installed particular application.) - - Check `project_settings/deadline` - - ![Deadline group](assets/deadline_group.png) - - Example: I have separated machines with "Harmony" installed into "harmony" group on Deadline. I want rendering jobs published from Harmony to run only on those machines. diff --git a/website/docs/module_ftrack.md b/website/docs/module_ftrack.md deleted file mode 100644 index 9111e4658c..0000000000 --- a/website/docs/module_ftrack.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -id: module_ftrack -title: Ftrack Administration -sidebar_label: Ftrack ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -Ftrack is currently the main project management option for OpenPype. This documentation assumes that you are familiar with Ftrack and its basic principles. If you're new to Ftrack, we recommend having a thorough look at [Ftrack Official Documentation](http://ftrack.rtd.ftrack.com/en/stable/). - -## Prepare Ftrack for OpenPype - -### Server URL -If you want to connect Ftrack to OpenPype you might need to make few changes in Ftrack settings. These changes would take a long time to do manually, so we prepared a few Ftrack actions to help you out. First, you'll need to launch OpenPype settings, enable [Ftrack module](admin_settings_system.md#Ftrack), and enter the address to your Ftrack server. - -### Login -Once your server is configured, restart OpenPype and you should be prompted to enter your [Ftrack credentials](artist_ftrack.md#How-to-use-Ftrack-in-OpenPype) to be able to run our Ftrack actions. If you are already logged in to Ftrack in your browser, it is enough to press `Ftrack login` and it will connect automatically. - -For more details step by step on how to login to Ftrack in OpenPype to go [artist Ftrack login](artist_ftrack.md#How-to-use-Ftrack-in-OpenPype) documentation. - -You can only use our Ftrack Actions and publish to Ftrack if each artist is logged in. - - -### Custom Attributes -After successfully connecting OpenPype with you Ftrack, you can right click on any project in Ftrack and you should see a bunch of actions available. The most important one is called `OpenPype Admin` and contains multiple options inside. - -To prepare Ftrack for working with OpenPype you'll need to run [OpenPype Admin - Create/Update Custom Attributes](manager_ftrack_actions.md#create-update-avalon-attributes), which creates and sets the Custom Attributes necessary for OpenPype to function. - - - -## Event Server -Ftrack Event Server is the key to automation of many tasks like _status change_, _thumbnail update_, _automatic synchronization to Avalon database_ and many more. Event server should run at all times to perform the required processing as it is not possible to catch some of them retrospectively with enough certainty. - -### Running event server -There are specific launch arguments for event server. With `openpype_console module ftrack eventserver` you can launch event server but without prior preparation it will terminate immediately. The reason is that event server requires 3 pieces of information: _Ftrack server url_, _paths to events_ and _credentials (Username and API key)_. Ftrack server URL and Event path are set from OpenPype's environments by default, but the credentials must be done separatelly for security reasons. - - - -:::note There are 2 ways of passing your credentials to event server. - - - - - -- **`--ftrack-user "your.username"`** : Ftrack Username -- **`--ftrack-api-key "00000aaa-11bb-22cc-33dd-444444eeeee"`** : User's API key -- `--ftrack-url "https://yourdomain.ftrackapp.com/"` : Ftrack server URL _(it is not needed to enter if you have set `FTRACK_SERVER` in OpenPype' environments)_ - -So if you want to use OpenPype's environments then you can launch event server for first time with these arguments `openpype_console.exe module ftrack eventserver --ftrack-user "my.username" --ftrack-api-key "00000aaa-11bb-22cc-33dd-444444eeeee" --store-credentials`. Since that time, if everything was entered correctly, you can launch event server with `openpype_console.exe module ftrack eventserver`. - - - - -- `FTRACK_API_USER` - Username _("your.username")_ -- `FTRACK_API_KEY` - User's API key _("00000aaa-11bb-22cc-33dd-444444eeeee")_ -- `FTRACK_SERVER` - Ftrack server url _(")_ - - - -::: - -:::caution -We do not recommend setting your Ftrack user and api key environments in a persistent way, for security reasons. Option 1. passing them as arguments is substantially safer. -::: - -### Where to run event server - -We recommend you to run event server on stable server machine with ability to connect to OpenPype database and Ftrack web server. Best practice we recommend is to run event server as service. It can be Windows or Linux. - -:::important -Event server should **not** run more than once! It may cause major issues. -::: - -### Which user to use - -- must have at least `Administrator` role -- the same user should not be used by an artist - - -:::note How to create Eventserver service - - - - -- create file: - `sudo vi /opt/openpype/run_event_server.sh` -- add content to the file: -```sh -#!/usr/bin/env bash -export OPENPYPE_MONGO= - -pushd /mnt/path/to/openpype -./openpype_console module ftrack eventserver --ftrack-user --ftrack-api-key --debug -``` -- change file permission: - `sudo chmod 0755 /opt/openpype/run_event_server.sh` - -- create service file: - `sudo vi /etc/systemd/system/openpype-ftrack-event-server.service` -- add content to the service file - -```toml -[Unit] -Description=Run OpenPype Ftrack Event Server Service -After=network.target - -[Service] -Type=idle -ExecStart=/opt/openpype/run_event_server.sh -Restart=on-failure -RestartSec=10s - -[Install] -WantedBy=multi-user.target -``` - -- change file permission: - `sudo chmod 0755 /etc/systemd/system/openpype-ftrack-event-server.service` - -- enable service: - `sudo systemctl enable openpype-ftrack-event-server` - -- start service: - `sudo systemctl start openpype-ftrack-event-server` - - - - -- create service file: `openpype-ftrack-eventserver.bat` -- add content to the service file: -```sh -@echo off -set OPENPYPE_MONGO= - -pushd \\path\to\openpype -openpype_console.exe module ftrack eventserver --ftrack-user --ftrack-api-key --debug -``` -- download and install `nssm.cc` -- create Windows service according to nssm.cc manual -- you can also run eventserver as a standard Schedule task -- be aware of using UNC path - - - -::: - -* * * - -## Ftrack events - -Events are helpers for automation. They react to Ftrack Web Server events like change entity attribute, create of entity, etc. - -### Sync to Avalon - -Automatic [synchronization to pipeline database](manager_ftrack.md#synchronization-to-avalon-database). - -This event updates entities on their changes Ftrack. When new entity is created or existing entity is modified. Interface with listing information is shown to users when [synchronization rules](manager_ftrack.md#synchronization-rules) are not met. This event may also undo changes when they might break pipeline. Namely _change name of synchronized entity_, _move synchronized entity in hierarchy_. - -:::important -Deleting an entity by Ftrack's default is not processed for security reasons _(to delete entity use [Delete Asset/Subset action](manager_ftrack_actions.md#delete-asset-subset))_. -::: - -### Synchronize Hierarchical and Entity Attributes - -Auto-synchronization of hierarchical attributes from Ftrack entities. - -Related to [Synchronize to Avalon database](manager_ftrack.md#synchronization-to-avalon-database) event _(without it, it makes no sense to use this event)_. Hierarchical attributes must be synchronized with special way so we needed to split synchronization into 2 parts. There are [synchronization rules](manager_ftrack.md#synchronization-rules) for hierarchical attributes that must be met otherwise interface with messages about not meeting conditions is shown to user. - -### Update Hierarchy thumbnails - -Push thumbnails from version, up through multiple hierarchy levels - -### Update status on task action - -Change status of next task from `Not started` to `Ready` when previous task is approved. - -Multiple detailed rules for next task update can be configured in the settings. - -### Delete Avalon ID from new entity - -Is used to remove value from `Avalon/Mongo Id` Custom Attribute when entity is created. - -`Avalon/Mongo Id` Custom Attribute stores id of synchronized entities in pipeline database. When user _Copy โ†’ Paste_ selection of entities to create similar hierarchy entities, values from Custom Attributes are copied too. That causes issues during synchronization because there are multiple entities with same value of `Avalon/Mongo Id`. To avoid this error we preventively remove these values when entity is created. - -### Sync status from Task to Parent - -List of parent object types where this is triggered ("Shot", "Asset build", etc. Skipped if it is empty) - -### Sync status from Version to Task - -Updates Task status based on status changes on its Asset Version. - -The issue this solves is when Asset version's status is changed but the artist assigned to Task is looking at the task status, thus not noticing the review. - -This event makes sure statuses Asset Version get synced to it's task. After changing a status on version, this event first tries to set identical status to version's parent (usually task). But this behavior can be tweaked in settings. - -### Sync status on first created version - -This event handler allows setting of different status to a first created Asset Version in Ftrack. - -This is useful for example if first version publish doesn't contain any actual reviewable work, but is only used for roundtrip conform check, in which case this version could receive status `pending conform` instead of standard `pending review` - -### Update status on next task -Change status on next task by task types order when task status state changed to "Done". All tasks with the same Task mapping of next task status changes From โ†’ To. Some status can be ignored. - -## Publish plugins - -### Collect Ftrack Family - -Reviews uploads to Ftrack could be configured by combination of hosts, families and task names. -(Currently implemented only in Standalone Publisher, Maya.) - -#### Profiles - -Profiles are used to select when to add Ftrack family to the instance. One or multiple profiles could be configured, Families, Task names (regex available), Host names combination is needed. - -Eg. If I want review created and uploaded to Ftrack for render published from Maya , setting is: - -Host names: 'Maya' -Families: 'render' -Add Ftrack Family: enabled - -![Collect Ftrack Family](assets/ftrack/ftrack-collect-main.png) - -#### Advanced adding if additional families present - -In special cases adding 'ftrack' based on main family ('Families' set higher) is not enough. -(For example upload to Ftrack for 'plate' main family should only happen if 'review' is contained in instance 'families', not added in other cases. ) - -![Collect Ftrack Family](assets/ftrack/ftrack-collect-advanced.png) diff --git a/website/docs/module_kitsu.md b/website/docs/module_kitsu.md deleted file mode 100644 index 9695542723..0000000000 --- a/website/docs/module_kitsu.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -id: module_kitsu -title: Kitsu Administration -sidebar_label: Kitsu ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Kitsu is a great open source production tracker and can be used for project management instead of Ftrack. This documentation assumes that you are familiar with Kitsu and its basic principles. If you're new to Kitsu, we recommend having a thorough look at [Kitsu Official Documentation](https://kitsu.cg-wire.com/). - -## Prepare Kitsu for OpenPype - -### Server URL -If you want to connect Kitsu to OpenPype you have to set the `Server` url in Kitsu settings. And that's all! -This setting is available for all the users of the OpenPype instance. - -## Synchronize -Updating OP with Kitsu data is executed running the `sync-service`, which requires to provide your Kitsu credentials with `-l, --login` and `-p, --password` or by setting the environment variables `KITSU_LOGIN` and `KITSU_PWD`. This process will request data from Kitsu and create/delete/update OP assets. -Once this sync is done, the thread will automatically start a loop to listen to Kitsu events. -- `-prj, --project` This flag accepts multiple project name to sync specific projects, and the default to sync all projects. -- `-lo, --listen-only` This flag to run listen to Kitsu events only without any sync. - -Note: You must use one argument of `-pro` or `-lo`, because the listen only flag override syncing flag. - -```bash -// sync all projects then run listen -openpype_console module kitsu sync-service -l me@domain.ext -p my_password - -// sync specific projects then run listen -openpype_console module kitsu sync-service -l me@domain.ext -p my_password -prj project_name01 -prj project_name02 - -// start listen only for all projects -openpype_console module kitsu sync-service -l me@domain.ext -p my_password -lo -``` - -### Events listening -Listening to Kitsu events is the key to automation of many tasks like _project/episode/sequence/shot/asset/task create/update/delete_ and some more. Events listening should run at all times to perform the required processing as it is not possible to catch some of them retrospectively with strong reliability. If such timeout has been encountered, you must relaunch the `sync-service` command to run the synchronization step again. - -Connection token is refreshed every week. - -### Push to Kitsu -An utility function is provided to help update Kitsu data (a.k.a Zou database) with OpenPype data if the publishing to the production tracker hasn't been possible for some time. Running `push-to-zou` will create the data on behalf of the user. -:::caution -This functionality cannot deal with all cases and is not error proof, some intervention by a human being might be required. -::: - -```bash -openpype_console module kitsu push-to-zou -l me@domain.ext -p my_password -``` - -## Integrate Kitsu Note -Task status can be automatically set during publish thanks to `Integrate Kitsu Note`. This feature can be configured in: - -`Admin -> Studio Settings -> Project Settings -> Kitsu -> Integrate Kitsu Note`. - -There are four settings available: -- `Set status on note` -> Turns on and off this integrator. -- `Note shortname` -> Which status shortname should be set automatically (Case sensitive). -- `Status change conditions - Status conditions` -> Conditions that need to be met for kitsu status to be changed. You can add as many conditions as you like. There are two fields to each conditions: `Condition` (Whether current status should be equal or not equal to the condition status) and `Short name` (Kitsu Shortname of the condition status). -- `Status change conditions - Family requirements` -> With this option you can add requirements to which families must be pushed or not in order to have the task status set by this integrator. There are two fields for each requirements: `Condition` (Same as the above) and `Family` (name of the family concerned by this requirement). For instance, adding one item set to `Not equal` and `workfile`, would mean the task status would change if a subset from another family than workfile is published (workfile can still be included), but not if you publish the workfile subset only. - -![Integrate Kitsu Note project settings](assets/integrate_kitsu_note_settings.png) - -## Q&A -### Is it safe to rename an entity from Kitsu? -Absolutely! Entities are linked by their unique IDs between the two databases. -But renaming from the OP's Project Manager won't apply the change to Kitsu, it'll be overridden during the next synchronization. diff --git a/website/docs/module_royalrender.md b/website/docs/module_royalrender.md deleted file mode 100644 index 2b75fbefef..0000000000 --- a/website/docs/module_royalrender.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: module_royalrender -title: Royal Render Administration -sidebar_label: Royal Render ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -## Preparation - -For [Royal Render](hhttps://www.royalrender.de/) support you need to set a few things up in both OpenPype and Royal Render itself - -1. Deploy OpenPype executable to all nodes of Royal Render farm. See [Install & Run](admin_use.md) - -2. Enable Royal Render Module in the [OpenPype Admin Settings](admin_settings_system.md#royal-render). - -3. Point OpenPype to your Royal Render installation in the [OpenPype Admin Settings](admin_settings_system.md#royal-render). - -4. Install our custom plugin and scripts to your RR repository. It should be as simple as copying content of `openpype/modules/royalrender/rr_root` to `path/to/your/royalrender/repository`. - - -## Configuration - -OpenPype integration for Royal Render consists of pointing RR to location of Openpype executable. That is being done by copying `_install_paths/OpenPype.cfg` to -RR root folder. This file contains reasonable defaults. They could be changed in this file or modified Render apps in `rrControl`. - - -## Debugging - -Current implementation uses dynamically build '.xml' file which is stored in temporary folder accessible by RR. It might make sense to -use this Openpype built file and try to run it via `*__rrServerConsole` executable from command line in case of unforeseeable issues. - -## Known issues - -Currently environment values set in Openpype are not propagated into render jobs on RR. It is studio responsibility to synchronize environment variables from Openpype with all render nodes for now. diff --git a/website/docs/module_site_sync.md b/website/docs/module_site_sync.md deleted file mode 100644 index 68f56cb548..0000000000 --- a/website/docs/module_site_sync.md +++ /dev/null @@ -1,297 +0,0 @@ ---- -id: module_site_sync -title: Site Sync Administration -sidebar_label: Site Sync ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Site Sync allows users and studios to synchronize published assets between -multiple 'sites'. Site denotes a storage location, -which could be a physical disk, server, cloud storage. To be able to use site -sync, it first needs to be configured. - -The general idea is that each user acts as an individual site and can download -and upload any published project files when they are needed. that way, artist -can have access to the whole project, but only every store files that are -relevant to them on their home workstation. - -:::note -At the moment site sync is only able to deal with publishes files. No workfiles -will be synchronized unless they are published. We are working on making -workfile synchronization possible as well. -::: - -## System Settings - -To use synchronization, *Site Sync* needs to be enabled globally in **OpenPype -Settings/System/Modules/Site Sync**. - -![Configure module](assets/site_sync_system.png) - -### Sites - -By default there are two sites created for each OpenPype installation: - -- **studio** - default site - usually a centralized mounted disk accessible to - all artists. Studio site is used if Site Sync is disabled. -- **local** - each workstation or server running OpenPype Tray receives its own - with unique site name. Workstation refers to itself as "local"however all - other sites will see it under it's unique ID. - -Artists can explore their site ID by opening OpenPype Info tool by clicking on -a version number in the tray app. - -Many different sites can be created and configured on the system level, and -some or all can be assigned to each project. - -Each OpenPype Tray app works with two sites at one time. (Sites can be the -same, and no syncing is done in this setup). - -Sites could be configured differently per project basis. - -Each new site needs to be created first in `System Settings`. Most important -feature of site is its Provider, select one from already prepared Providers. - -#### Alternative sites - -This attribute is meant for special use cases only. - -One of the use cases is sftp site vendoring (exposing) same data as regular -site (studio). Each site is accessible for different audience. 'studio' for -artists in a studio via shared disk, 'sftp' for externals via sftp server with -mounted 'studio' drive. - -Change of file status on one site actually means same change on 'alternate' -site occurred too. (eg. artists publish to 'studio', 'sftp' is using -same location >> file is accessible on 'sftp' site right away, no need to sync -it anyhow.) - -##### Example - -![Configure module](assets/site_sync_system_sites.png) -Admin created new `sftp` site which is handled by `SFTP` provider. Somewhere in -the studio SFTP server is deployed on a machine that has access to `studio` -drive. - -Alternative sites work both way: - -- everything published to `studio` is accessible on a `sftp` site too -- everything published to `sftp` (most probably via artist's local disk - - artists publishes locally, representation is marked to be synced to `sftp`. - Immediately after it is synced, it is marked to be available on `studio` too - for artists in the studio to use.) - -## Project Settings - -Sites need to be made available for each project. Of course this is possible to -do on the default project as well, in which case all other projects will -inherit these settings until overridden explicitly. - -You'll find the setting in **Settings/Project/Global/Site Sync** - -The attributes that can be configured will vary between sites and their -providers. - -## Local settings - -Each user should configure root folder for their 'local' site via **Local -Settings** in OpenPype Tray. This folder will be used for all files that the -user publishes or downloads while working on a project. Artist has the option -to set the folder as "default"in which case it is used for all the projects, or -it can be set on a project level individually. - -Artists can also override which site they use as active and remote if need be. - -![Local overrides](assets/site_sync_local_setting.png) - -## Providers - -Each site implements a so called `provider` which handles most common -operations (list files, copy files etc.) and provides interface with a -particular type of storage. (disk, gdrive, aws, etc.) -Multiple configured sites could share the same provider with different -settings (multiple mounted disks - each disk can be a separate site, while -all share the same provider). - -**Currently implemented providers:** - -### Local Drive - -Handles files stored on disk storage. - -Local drive provider is the most basic one that is used for accessing all -standard hard disk storage scenarios. It will work with any storage that can be -mounted on your system in a standard way. This could correspond to a physical -external hard drive, network mounted storage, internal drive or even VPN -connected network drive. It doesn't care about how the drive is mounted, but -you must be able to point to it with a simple directory path. - -Default sites `local` and `studio` both use local drive provider. - -### Google Drive - -Handles files on Google Drive (this). GDrive is provided as a production -example for implementing other cloud providers - -Let's imagine a small globally distributed studio which wants all published -work for all their freelancers uploaded to Google Drive folder. - -For this use case admin needs to configure: - -- how many times it tries to synchronize file in case of some issue (network, - permissions) -- how often should synchronization check for new assets -- sites for synchronization - 'local' and 'gdrive' (this can be overridden in - local settings) -- user credentials -- root folder location on Google Drive side - -Configuration would look like this: - -![Configure project](assets/site_sync_project_settings.png) - -*Site Sync* for Google Drive works using its -API: https://developers.google.com/drive/api/v3/about-sdk - -To configure Google Drive side you would need to have access to Google Cloud -Platform project: https://console.cloud.google.com/ - -To get working connection to Google Drive there are some necessary steps: - -- first you need to enable GDrive - API: https://developers.google.com/drive/api/v3/enable-drive-api -- next you need to create user, choose **Service Account** (for basic - configuration no roles for account are necessary) -- add new key for created account and download .json file with credentials -- share destination folder on the Google Drive with created account (directly - in GDrive web application) -- add new site back in OpenPype Settings, name as you want, provider needs to - be 'gdrive' -- distribute credentials file via shared mounted disk location - -:::note -If you are using regular personal GDrive for testing don't forget -adding `/My Drive` as the prefix in root configuration. Business accounts and -share drives don't need this. -::: - -### SFTP - -SFTP provider is used to connect to SFTP server. Currently authentication -with `user:password` or `user:ssh key` is implemented. -Please provide only one combination, don't forget to provide password for ssh -key if ssh key was created with a passphrase. - -(SFTP connection could be a bit finicky, use FileZilla or WinSCP for testing -connection, it will be mush faster.) - -Beware that ssh key expects OpenSSH format (`.pem`) not a Putty -format (`.ppk`)! - -#### How to set SFTP site - -- Enable Site Sync module in Settings -- Add side with SFTP provider - -![Enable syncing and create site](assets/site_sync_sftp_system.png) - -- In Projects setting enable Site Sync (on default project - all project will - be synched, or on specific project) -- Configure SFTP connection and destination folder on a SFTP server (in - screenshot `/upload`) - -![SFTP connection](assets/site_sync_project_sftp_settings.png) - -- if you want to force syncing between local and sftp site for all users, use - combination `active site: local`, `remote site: NAME_OF_SFTP_SITE` -- if you want to allow only specific users to use SFTP syncing (external users, - not located in the office), use `active site: studio`, `remote site: studio`. - -![Select active and remote site on a project](assets/site_sync_sftp_project_setting_not_forced.png) - -- Each artist can decide and configure syncing from his/her local to SFTP - via `Local Settings` - -![Select active and remote site on a project](assets/site_sync_sftp_settings_local.png) - -### Custom providers - -If a studio needs to use other services for cloud storage, or want to implement -totally different storage providers, they can do so by writing their own -provider plugin. We're working on a developer documentation, however, for now -we recommend looking at `abstract_provider.py`and `gdrive.py` -inside `openpype/modules/sync_server/providers` and using it as a template. - -### Running Site Sync in background - -Site Sync server synchronizes new published files from artist machine into -configured remote location by default. - -There might be a use case where you need to synchronize between "non-artist" -sites, for example between studio site and cloud. In this case -you need to run Site Sync as a background process from a command line (via -service etc) 24/7. - -To configure all sites where all published files should be synced eventually -you need to -configure `project_settings/global/sync_server/config/always_accessible_on` -property in Settings (per project) first. - -![Set another non artist remote site](assets/site_sync_always_on.png) - -This is an example of: - -- Site Sync is enabled for a project -- default active and remote sites are set to `studio` - eg. standard process: - everyone is working in a studio, publishing to shared location etc. -- (but this also allows any of the artists to work remotely, they would change - their active site in their own Local Settings to `local` and configure local - root. - This would result in everything artist publishes is saved first onto his - local folder AND synchronized to `studio` site eventually.) -- everything exported must also be eventually uploaded to `sftp` site - -This eventual synchronization between `studio` and `sftp` sites must be -physically handled by background process. - -As current implementation relies heavily on Settings and Local Settings, -background process for a specific site ('studio' for example) must be -configured via Tray first to `syncserver` command to work. - -To do this: - -- run OP `Tray` with environment variable OPENPYPE_LOCAL_ID set to name of - active (source) site. In most use cases it would be studio (for cases of - backups of everything published to studio site to different cloud site etc.) -- start `Tray` -- check `Local ID` in information dialog after clicking on version number in - the Tray -- open `Local Settings` in the `Tray` -- configure for each project necessary active site and remote site -- close `Tray` -- run OP from a command line with `syncserver` and `--active_site` arguments - -This is an example how to trigger background syncing process where active ( -source) site is `studio`. -(It is expected that OP is installed on a machine, `openpype_console` is on -PATH. If not, add full path to executable. -) - -```shell -openpype_console syncserver --active_site studio -``` - -### Syncing of last published workfile - -Some DCC might have enabled -in `project_setting/global/tools/Workfiles/last_workfile_on_startup`, eg. open -DCC with last opened workfile. - -Flag `use_last_published_workfile` tells that last published workfile should be -used if no workfile is present locally. -This use case could happen if artists starts working on new task locally, -doesn't have any workfile present. In that case last published will be -synchronized locally and its version bumped by 1 (as workfile's version is -always +1 from published version). \ No newline at end of file diff --git a/website/docs/module_slack.md b/website/docs/module_slack.md deleted file mode 100644 index 1999912fdc..0000000000 --- a/website/docs/module_slack.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: module_slack -title: Slack Integration Administration -sidebar_label: Slack ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -This module allows configuring profiles(when to trigger, for which combination of task, host and family) -and templates(could contain {} placeholder) to send notification to Slack channel(s) -whenever configured asset type is published. - - -## App installation - -Slack application must be installed to company's Slack first. - -Please locate `openpype/modules/slack/manifest.yml` file in deployed OpenPype installation and follow instruction at -https://api.slack.com/reference/manifests#using and follow "Creating apps with manifests". - -### App icon - -If you would like to enrich bot with an icon, Slack admin must add the icon after app installation. - -Go to your Slack app home (something like https://api.slack.com/apps/XXXXXXXX/general?) > Basic information > Display Information. -You can upload any image you want, or for your convenience locate prepared OpenPype icon in your installed Openpype installation in `openpype\modules\slac\resources`. - -## System Settings - -To use notifications, *Slack Notifications* needs to be enabled globally in **OpenPype Settings/System/Modules/Slack Notifications**. - -![Configure module](assets/slack_system.png) - - -## Project Settings - -### Token -Most important for module to work is to fill authentication token -```Project settings > Slack > Publish plugins > Token``` - -This token should be available after installation of the app in the Slack dashboard. -It is possible to create multiple tokens and configure different scopes for them. - -![Get token](assets/slack_token.png) - -### Profiles -Profiles are used to select when to trigger notification. One or multiple profiles -could be configured, `Families`, `Task names` (regex available), `Host names`, `Subset names` (regex available) combination is needed. - -Eg. If I want to be notified when render is published from Maya, setting is: - -- family: 'render' -- host: 'Maya' - -### Messages to channels - -#### Channels -Multiple messages could be delivered to one or multiple channels, by default app allows Slack bot -to send messages to 'public' channels (eg. bot doesn't need to join the channel first). - -![Configure module](assets/slack_project.png) - -#### Upload thumbnail -Integration can upload 'thumbnail' file (if present in an instance), for that bot must be -manually added to target channel by Slack admin! -(In target channel write: ```/invite @OpenPypeNotifier``) - -#### Upload review -Integration can upload 'review' file (if present in an instance), for that bot must be -manually added to target channel by Slack admin! -(In target channel write: ```/invite @OpenPypeNotifier``) - -Burnin version (usually .mp4) is preferred if present. - -Please be sure that this configuration is viable for your use case. In case of uploading large reviews to Slack, -all publishes will be slowed down and you might hit a file limit on Slack pretty soon (it is 5GB for Free version of Slack, any file cannot be bigger than 1GB). -You might try to add `{review_filepath}` to message content. This link might help users to find review easier on their machines. -(It won't show a playable preview though!) - -#### Message -Message content can use Templating (see [Available template keys](admin_settings_project_anatomy.md#available-template-keys)). - -Few keys also have Capitalized and UPPERCASE format. Values will be modified accordingly ({Asset} >> "Asset", {FAMILY} >> "RENDER"). - -**Additional implemented keys:** -- review_filepath - -##### Message example -``` -{Subset} was published for {ASSET} in {task[name]} task. - -Here you can find review {review_filepath} -``` - -##### Dynamic message for artists -If artists uses host with implemented Publisher (new UI for publishing, implemented in Tray Publisher, Adobe products etc), it is possible for -them to add additional message (notification for specific users for example, artists must provide proper user id with '@'). -Additional message will be sent only if at least one profile, eg. one target channel is configured. -All available template keys (see higher) could be used here as a placeholder too. - -#### User or group notifications -Message template or dynamic data could contain user or group notification, it must be in format @artist.name, '@John Doe' or "@admin group" for display name containing space. -If value prefixed with @ is not resolved and Slack user is not found, message will contain same value (not translated by Slack into link and proper mention.) - -#### Message retention -Currently no purging of old messages is implemented in Openpype. Admins of Slack should set their own retention of messages and files per channel. -(see https://slack.com/help/articles/203457187-Customize-message-and-file-retention-policies) diff --git a/website/docs/project_settings/assets/global_extract_review_letter_box.png b/website/docs/project_settings/assets/global_extract_review_letter_box.png deleted file mode 100644 index 45c1942f24..0000000000 Binary files a/website/docs/project_settings/assets/global_extract_review_letter_box.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_extract_review_letter_box_settings.png b/website/docs/project_settings/assets/global_extract_review_letter_box_settings.png deleted file mode 100644 index 76dd9b372a..0000000000 Binary files a/website/docs/project_settings/assets/global_extract_review_letter_box_settings.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_extract_review_output_defs.png b/website/docs/project_settings/assets/global_extract_review_output_defs.png deleted file mode 100644 index f4c1661b11..0000000000 Binary files a/website/docs/project_settings/assets/global_extract_review_output_defs.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_extract_review_profiles.png b/website/docs/project_settings/assets/global_extract_review_profiles.png deleted file mode 100644 index 1b91786ff6..0000000000 Binary files a/website/docs/project_settings/assets/global_extract_review_profiles.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_integrate_new_subset_group.png b/website/docs/project_settings/assets/global_integrate_new_subset_group.png deleted file mode 100644 index 92638984cc..0000000000 Binary files a/website/docs/project_settings/assets/global_integrate_new_subset_group.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_integrate_new_template_name_profile.png b/website/docs/project_settings/assets/global_integrate_new_template_name_profile.png deleted file mode 100644 index 8529761a50..0000000000 Binary files a/website/docs/project_settings/assets/global_integrate_new_template_name_profile.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_oiio_transcode.png b/website/docs/project_settings/assets/global_oiio_transcode.png deleted file mode 100644 index d818ecfe19..0000000000 Binary files a/website/docs/project_settings/assets/global_oiio_transcode.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_oiio_transcode2.png b/website/docs/project_settings/assets/global_oiio_transcode2.png deleted file mode 100644 index 906f780830..0000000000 Binary files a/website/docs/project_settings/assets/global_oiio_transcode2.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_tools_creator_subset_template.png b/website/docs/project_settings/assets/global_tools_creator_subset_template.png deleted file mode 100644 index c4e863c4e0..0000000000 Binary files a/website/docs/project_settings/assets/global_tools_creator_subset_template.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_tools_custom_staging_dir.png b/website/docs/project_settings/assets/global_tools_custom_staging_dir.png deleted file mode 100644 index f7e8660a88..0000000000 Binary files a/website/docs/project_settings/assets/global_tools_custom_staging_dir.png and /dev/null differ diff --git a/website/docs/project_settings/assets/global_tools_workfile_open_last_version.png b/website/docs/project_settings/assets/global_tools_workfile_open_last_version.png deleted file mode 100644 index dfcac072c5..0000000000 Binary files a/website/docs/project_settings/assets/global_tools_workfile_open_last_version.png and /dev/null differ diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_create_first_workfile.png b/website/docs/project_settings/assets/nuke_workfile_builder_create_first_workfile.png deleted file mode 100644 index f138709a7f..0000000000 Binary files a/website/docs/project_settings/assets/nuke_workfile_builder_create_first_workfile.png and /dev/null differ diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_location.png b/website/docs/project_settings/assets/nuke_workfile_builder_location.png deleted file mode 100644 index 916b79755d..0000000000 Binary files a/website/docs/project_settings/assets/nuke_workfile_builder_location.png and /dev/null differ diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_profiles.png b/website/docs/project_settings/assets/nuke_workfile_builder_profiles.png deleted file mode 100644 index e4105767ef..0000000000 Binary files a/website/docs/project_settings/assets/nuke_workfile_builder_profiles.png and /dev/null differ diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_template_anatomy.png b/website/docs/project_settings/assets/nuke_workfile_builder_template_anatomy.png deleted file mode 100644 index 195e884bfb..0000000000 Binary files a/website/docs/project_settings/assets/nuke_workfile_builder_template_anatomy.png and /dev/null differ diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_template_task_type.png b/website/docs/project_settings/assets/nuke_workfile_builder_template_task_type.png deleted file mode 100644 index 4c84f37c0e..0000000000 Binary files a/website/docs/project_settings/assets/nuke_workfile_builder_template_task_type.png and /dev/null differ diff --git a/website/docs/project_settings/assets/standalone_creators.png b/website/docs/project_settings/assets/standalone_creators.png deleted file mode 100644 index cfadfa305d..0000000000 Binary files a/website/docs/project_settings/assets/standalone_creators.png and /dev/null differ diff --git a/website/docs/project_settings/settings_project_global.md b/website/docs/project_settings/settings_project_global.md deleted file mode 100644 index 27aa60a464..0000000000 --- a/website/docs/project_settings/settings_project_global.md +++ /dev/null @@ -1,363 +0,0 @@ ---- -id: settings_project_global -title: Project Global Setting -sidebar_label: Global ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Project settings can have project specific values. Each new project is using studio values defined in **default** project but these values can be modified or overridden per project. - -:::warning Default studio values -Projects always use default project values unless they have [project override](../admin_settings#project-overrides) (orange colour). Any changes in default project may affect all existing projects. -::: - -## Color Management (ImageIO) - -:::info Default OCIO config -OpenPype distributes its own OCIO configs. Those can be found in `{openpype install dir}/{version}/vendor/bin/ocioconfig/OpenColorIOConfigs`. Windows example: `C:\Program Files (x86)\OpenPype\3.14.0\vendor\bin\ocioconfig\OpenColorIOConfigs` -::: - -### Using OCIO config -Global config path is set by default to OpenPype distributed configs. At the moment there are only two - **aces_1.2** and **nuke-default**. Since this path input is not platform specific it is required to use at least an environment variable do platform specific config root directory. Order of paths matter so first path found and existing first served. - -Each OCIO config path input supports formatting using environment variables and [anatomy template keys](../admin_settings_project_anatomy#available-template-keys). The default global OCIO config path is `{OPENPYPE_ROOT}/vendor/bin/ocioconfig/OpenColorIOConfigs/aces_1.2/config.ocio`. - -If the project settings for a particular host has its own OCIO config **enabled** and set to at least one path and the path exists, it overrides the global OCIO config for that host. - -**For example** - -Project nuke-specific OCIO config: `project_settings/nuke/imageio/ocio_config` - -If config path is defined to particular shot target with following path inputs: -1. `{root[work]}/{project[name]}/{hierarchy}/{asset}/config/aces.ocio` -2. `{root[work]}/{project[name]}/{hierarchy}/config/aces.ocio` - -Procedure of resolving path (from above example) will look first into path 1st and if the path is not existing then it will try 2nd and if even that is not existing then it will fall back to global default. - -### Using File rules -File rules are inspired by [OCIO v2 configuration]((https://opencolorio.readthedocs.io/en/latest/guides/authoring/rules.html)). Each rule has a unique name which can be overridden by host-specific _File rules_ (example: `project_settings/nuke/imageio/file_rules/rules`). - -The _input pattern_ matching uses REGEX expression syntax (try [regexr.com](https://regexr.com/)). Matching rules procedure's intention is to be used during publishing or loading of representation. Since the publishing procedure is run before integrator format publish template path, make sure the pattern is working or any work render path. - -:::warning Colorspace name input -The **colorspace name** value is a raw string input and no validation is run after saving project settings. We recommend to open the specified `config.ocio` file and copy pasting the exact colorspace names. -::: - -### Extract OIIO Transcode -OIIOTools transcoder plugin with configurable output presets. Any incoming representation with `colorspaceData` is convertible to single or multiple representations with different target colorspaces or display and viewer names found in linked **config.ocio** file. - -`oiiotool` is used for transcoding, eg. `oiiotool` must be present in `vendor/bin/oiio` or environment variable `OPENPYPE_OIIO_PATHS` must be provided for custom oiio installation. - -Notable parameters: -- **`Delete Original Representation`** - keep or remove original representation. If old representation is kept, but there is new transcoded representation with 'Create review' tag, original representation loses its 'review' tag if present. -- **`Extension`** - target extension. If left empty, original extension is used. -- **`Transcoding type`** - transcoding into colorspace or into display and viewer space could be used. Cannot use both at the same time. -- **`Colorspace`** - target colorspace, which must be available in used color config. (If `Transcoding type` is `Use Colorspace` value in configuration is used OR if empty value collected on instance from DCC). -- **`Display & View`** - display and viewer colorspace. (If `Transcoding type` is `Use Display&View` values in configuration is used OR if empty values collected on instance from DCC). -- **`Arguments`** - special additional command line arguments for `oiiotool`. - - -Example here describes use case for creation of new color coded review of png image sequence. Original representation's files are kept intact, review is created from transcoded files, but these files are removed in cleanup process. -![global_oiio_transcode](assets/global_oiio_transcode.png) - -Another use case is to transcode in Maya only `beauty` render layers and use collected `Display` and `View` colorspaces from DCC. -![global_oiio_transcode_in_Maya](assets/global_oiio_transcode2.png) - -## Profile filters - -Many of the settings are using a concept of **Profile filters** - -You can define multiple profiles to choose from for different contexts. Each filter is evaluated and a -profile with filters matching the current context the most, is used. - -You can define profile without any filters and use it as **default**. - -Only **one or none** profile will be returned per context. - -All context filters are lists which may contain strings or Regular expressions (RegEx). -- **`hosts`** - Host from which publishing was triggered. `["maya", "nuke"]` -- **`families`** - Main family of processed subset. `["plate", "model"]` -- **`tasks`** - Currently processed task. `["modeling", "animation"]` - -:::important Filtering -Filters are optional. In case when multiple profiles match current context, profile with higher number of matched filters has higher priority than profile without filters. -(The order the profiles in settings doesn't matter, only the precision of matching does.) -::: - -## Publish plugins - -Publish plugins used across all integrations. - - -### Extract Review -Plugin responsible for automatic FFmpeg conversion to variety of formats. - -Extract review uses [profile filtering](#profile-filters) to render different outputs for different situations. - -Applicable context filters: - **`hosts`** - Host from which publishing was triggered. `["maya", "nuke"]` -- **`families`** - Main family of processed subset. `["plate", "model"]` - -![global_extract_review_profiles](assets/global_extract_review_profiles.png) - -**Output Definitions** - -A profile may generate multiple outputs from a single input. Each output must define unique name and output extension (use the extension without a dot e.g. **mp4**). All other settings of output definition are optional. - -![global_extract_review_output_defs](assets/global_extract_review_output_defs.png) -- **`Tags`** - Define what will happen to output. - -- **`FFmpeg arguments`** - These arguments are appended to ffmpeg arguments auto generated by publish plugin. Some of arguments are handled automatically like rescaling or letterboxes. - - **Video filters** additional FFmpeg filters that would be defined in `-filter:v` or `-vf` command line arguments. - - **Audio filters** additional FFmpeg filters that would be defined in `-filter:a` or `-af` command line arguments. - - **Input arguments** input definition arguments of video or image sequence - this setting has limitations as you have to know what is input. - - **Output arguments** other FFmpeg output arguments like codec definition. - -- **`Output width`** and **`Output height`** - - It is possible to rescale output to specified resolution and keep aspect ratio. - - If value is set to 0, source resolution will be used. - -- **`Overscan crop`** - - Crop input resolution before rescaling. - - - Value is text may have a few variants. Each variant define output size for input size. - - - All values that cause output resolution smaller than 1 pixel are invalid. - - - Value without sign (+/-) in is always explicit and value with sign is - relative. Output size for values "200px" and "+200px" are not the same "+200px" will add 200 pixels to source and "200px" will keep only 200px from source. Value of "0", "0px" or "0%" are automatically converted to "+0px" as 0px is invalid output. - - - Cropped value is related to center. It is better to avoid odd numbers if - possible. - - **Example outputs for input size: 2200px** - - | String | Output | Description | - |---|---|---| - | ` ` | 2200px | Empty string keep resolution unchanged. | - | `50%` | 1100px | Crop 25% of input width on left and right side. | - | `300px` | 300px | Keep 300px in center of input and crop rest on left and right. | - | `300` | 300px | Values without units are used as pixels (`px`). | - | `+0px` | 2200px | Keep resolution unchanged. | - | `0px` | 2200px | Same as `+0px`. | - | `+300px` | 2500px | Add black pillars of 150px width on left and right side. | - | `-300px` | 1900px | Crop 150px on left and right side | - | `+10%` | 2420px | Add black pillars of 5% size of input on left and right side. | - | `-10%` | 1980px | Crop 5% of input size by on left and right side. | - | `-10%+` | 2000px | Input width is 110% of output width. | - - **Value "-10%+" is a special case which says that input's resolution is - bigger by 10% than expected output.** - - - It is possible to enter single value for both width and height or - combination of two variants for width and height separated with space. - - **Example for resolution: 2000px 1000px** - - | String | Output | - |---------------|---------------| - | "100px 120px" | 2100px 1120px | - | "-10% -200px" | 1800px 800px | - | "-10% -0px" | 1800px 1000px | - -- **`Overscan color`** - - Color of empty area caused by different aspect ratio of input and output. - - By default is set to black color. - -- **`Letter Box`** - - **Enabled** - Enable letter boxes - - **Ratio** - Ratio of letter boxes. Ratio type is calculated from output image dimensions. If letterbox ratio > image ratio, _letterbox_ is applied. Otherwise _pillarbox_ will be rendered. - - **Fill color** - Fill color of boxes (RGBA: 0-255) - - **Line Thickness** - Line thickness on the edge of box (set to `0` to turn off) - - **Line color** - Line color on the edge of box (RGBA: 0-255) - - ![global_extract_review_letter_box_settings](assets/global_extract_review_letter_box_settings.png) - ![global_extract_review_letter_box](assets/global_extract_review_letter_box.png) - -- **`Background color`** - - Background color can be used for inputs with possible transparency (e.g. png sequence). - - Input's without possible alpha channel are ignored all the time (e.g. mov). - - Background color slows down rendering process. - - set alpha to `0` to not use this option at all (in most of cases background stays black) - - other than `0` alpha will draw color as background - -- **`Additional filtering`** - - Profile filtering defines which group of output definitions is used but output definitions may require more specific filters on their own. - - They may filter by subset name (regex can be used) or publish families. Publish families are more complex as are based on knowing code base. - - Filtering by custom tags -> this is used for targeting to output definitions from other extractors using settings (at this moment only Nuke bake extractor can target using custom tags). - - Nuke extractor settings path: `project_settings/nuke/publish/ExtractReviewIntermediates/outputs/baking/add_custom_tags` - - Filtering by input length. Input may be video, sequence or single image. It is possible that `.mp4` should be created only when input is video or sequence and to create review `.png` when input is single frame. In some cases the output should be created even if it's single frame or multi frame input. - - -### Extract Burnin - -Plugin is responsible for adding burnins into review representations. - -Burnins are text values painted on top of input and may be surrounded with box in 6 available positions `Top Left`, `Top Center`, `Top Right`, `Bottom Left`, `Bottom Center`, `Bottom Right`. - -![presets_plugins_extract_burnin](../assets/presets_plugins_extract_burnin_01.png) - -The Extract Burnin plugin creates new representations based on plugin presets, representations in instance and whether the reviewable matches the profile filter. -A burnin can also be directly linked by name in the output definitions of the [Extract Review plug-in settings](#extract-review) so _can_ be triggered without a matching profile. - -#### Burnin formatting options (`options`) - -The formatting options define the font style for the burnin texts. -The X and Y offset define the margin around texts and (background) boxes. - -#### Burnin profiles (`profiles`) - -Plugin process is skipped if `profiles` are not set at all. Profiles contain list of profile items. Each burnin profile may specify filters for **hosts**, **tasks** and **families**. Filters work the same way as described in [Profile Filters](#profile-filters). - -#### Profile burnins - -A burnin profile may set multiple burnin outputs from one input. The burnin's name represents the unique **filename suffix** to avoid overriding files with same name. - -| Key | Description | Type | Example | -| --- | --- | --- | --- | -| **Top Left** | Top left corner content. | str | "{dd}.{mm}.{yyyy}" | -| **Top Centered** | Top center content. | str | "v{version:0>3}" | -| **Top Right** | Top right corner content. | str | "Static text" | -| **Bottom Left** | Bottom left corner content. | str | "{asset}" | -| **Bottom Centered** | Bottom center content. | str | "{username}" | -| **Bottom Right** | Bottom right corner content. | str | "{frame_start}-{current_frame}-{frame_end}" | - -Each burnin profile can be configured with additional family filtering and can -add additional tags to the burnin representation, these can be configured under -the profile's **Additional filtering** section. - -:::note Filename suffix -The filename suffix is appended to filename of the source representation. For -example, if the source representation has suffix **"h264"** and the burnin -suffix is **"client"** then the final suffix is **"h264_client"**. -::: - -**Available keys in burnin content** - -- It is possible to use same keys as in [Anatomy](admin_settings_project_anatomy.md#available-template-keys). -- It is allowed to use Anatomy templates themselves in burnins if they can be filled with available data. - -- Additional keys in burnins: - - | Burnin key | Description | - | --- | --- | - | frame_start | First frame number. | - | frame_end | Last frame number. | - | current_frame | Frame number for each frame. | - | duration | Count number of frames. | - | resolution_width | Resolution width. | - | resolution_height | Resolution height. | - | fps | Fps of an output. | - | timecode | Timecode by frame start and fps. | - | focalLength | **Only available in Maya and Houdini**

Camera focal length per frame. Use syntax `{focalLength:.2f}` for decimal truncating. Eg. `35.234985` with `{focalLength:.2f}` would produce `35.23`, whereas `{focalLength:.0f}` would produce `35`. | - -:::warning -`timecode` is a specific key that can be **only at the end of content**. (`"BOTTOM_RIGHT": "TC: {timecode}"`) -::: - - -### IntegrateAssetNew - -Saves information for all published subsets into DB, published assets are available for other hosts, tools and tasks after. -#### Template name profiles - -Allows to select [anatomy template](admin_settings_project_anatomy.md#templates) based on context of subset being published. - -For example for `render` profile you might want to publish and store assets in different location (based on anatomy setting) then for `publish` profile. -[Profile filtering](#profile-filters) is used to select between appropriate template for each context of published subsets. - -Applicable context filters: -- **`hosts`** - Host from which publishing was triggered. `["maya", "nuke"]` -- **`tasks`** - Current task. `["modeling", "animation"]` - - ![global_integrate_new_template_name_profile](assets/global_integrate_new_template_name_profile.png) - -(This image shows use case where `render` anatomy template is used for subsets of families ['review, 'render', 'prerender'], `publish` template is chosen for all other.) - -#### Subset grouping profiles - -Published subsets might be grouped together for cleaner and easier selection in the **[Subset Manager](artist_tools_subset_manager)** - -Group name is chosen with use of [profile filtering](#profile-filters) - -Applicable context filters: -- **`families`** - Main family of processed subset. `["plate", "model"]` -- **`hosts`** - Host from which publishing was triggered. `["maya", "nuke"]` -- **`tasks`** - Current task. `["modeling", "animation"]` - - ![global_integrate_new_template_name_profile](assets/global_integrate_new_subset_group.png) - -(This image shows use case where only assets published from 'photoshop', for all families for all tasks should be marked as grouped with a capitalized name of Task where they are published from.) - -## Tools -Settings for OpenPype tools. - -### Creator -Settings related to [Creator tool](artist_tools_creator). - -#### Subset name profiles -![global_tools_creator_subset_template](assets/global_tools_creator_subset_template.png) - -Subset name helps to identify published content. More specific name helps with organization and avoid mixing of published content. Subset name is defined using one of templates defined in **Subset name profiles settings**. The template is filled with context information at the time of creation. - -Usage of template is defined by profile filtering using creator's family, host and task name. Profile without filters is used as default template and it is recommend to set default template. If default template is not available `"{family}{Task}"` is used. - -**Formatting keys** - -All templates can contain text and formatting keys **family**, **task** and **variant** e.g. `"MyStudio_{family}_{task}"` (example - not recommended in production). - -|Key|Description| -|---|---| -|family|Creators family| -|task|Task under which is creation triggered| -|variant|User input in creator tool| - -**Formatting keys have 3 variants with different letter capitalization.** - -|Task|Key variant|Description|Result| -|---|---|---|---| -|`bgAnim`|`{task}`|Keep original value as is.|`bgAnim`| -|`bgAnim`|`{Task}`|Capitalize first letter of value.|`BgAnim`| -|`bgAnim`|`{TASK}`|Each letter which be capitalized.|`BGANIM`| - -Template may look like `"{family}{Task}{Variant}"`. - -Some creators may have other keys as their context may require more information or more specific values. Make sure you've read documentation of host you're using. - - -### Publish - -#### Custom Staging Directory Profiles -With this feature, users can specify a custom data folder path based on presets, which can be used during the creation and publishing stages. - -![global_tools_custom_staging_dir](assets/global_tools_custom_staging_dir.png) - -Staging directories are used as a destination for intermediate files (as renders) before they are renamed and copied to proper location during the integration phase. They could be created completely dynamically in the temp folder or for some DCCs in the `work` area. -Example could be Nuke where artist might want to temporarily render pictures into `work` area to check them before they get published with the choice of "Use existing frames" on the write node. - -One of the key advantages of this feature is that it allows users to choose the folder for writing such intermediate files to take advantage of faster storage for rendering, which can help improve workflow efficiency. Additionally, this feature allows users to keep their intermediate extracted data persistent, and use their own infrastructure for regular cleaning. - -In some cases, these DCCs (Nuke, Houdini, Maya) automatically add a rendering path during the creation stage, which is then used in publishing. Creators and extractors of such DCCs need to use these profiles to fill paths in DCC's nodes to use this functionality. - -:::note -Maya's setting `project_settings/maya/RenderSettings/default_render_image_folder` is be overwritten by the custom staging dir. -::: - -The custom staging folder uses a path template configured in `project_anatomy/templates/others` with `transient` being a default example path that could be used. The template requires a 'folder' key for it to be usable as custom staging folder. - -##### Known issues -- Any DCC that uses prefilled paths and store them inside of workfile nodes needs to implement resolving these paths with a configured profiles. -- If studio uses Site Sync remote artists need to have access to configured custom staging folder! -- Each node on the rendering farm must have access to configured custom staging folder! - -### Workfiles -All settings related to Workfile tool. - -#### Open last workfile at launch -This feature allows you to define a rule for each task/host or toggle the feature globally to all tasks as they are visible in the picture. - -![global_tools_workfile_open_last_version](assets/global_tools_workfile_open_last_version.png) diff --git a/website/docs/project_settings/settings_project_nuke.md b/website/docs/project_settings/settings_project_nuke.md deleted file mode 100644 index c9c3d12df9..0000000000 --- a/website/docs/project_settings/settings_project_nuke.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -id: settings_project_nuke -title: Project Nuke Setting -sidebar_label: Nuke ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Project settings can have project specific values. Each new project is using studio values defined in **default** project but these values can be modified or overridden per project. - -:::warning Default studio values -Projects always use default project values unless they have [project override](../admin_settings#project-overrides) (orange colour). Any changes in default project may affect all existing projects. -::: - -## Workfile Builder - -All Workfile Builder related settings can be found here. This is a list of available features: -- Create first workfile -- Custom Template path (task type filtered) -- Run Builder profiles at first run -- Define Builder Profiles With Filters - -![nuke_workfile_options_location](assets/nuke_workfile_builder_location.png) - -:::important Auto Load Last Version -In case you want to set the auto load of the latest available version of workfiles, you can do it from [here](settings_project_global#open-last-workfile-at-launch). -::: - -### Create first workfile - -By switchintg this feature on, OpenPype will generate initial workfile version. Following attributes are possible to configure: - -![nuke_workfile_options_create_first_version](assets/nuke_workfile_builder_create_first_workfile.png) - -#### Custom templates -Custom templates are added into nuke's node graph as nodes. List of task types can be defined for templates filtering. - -- Task types are sourced from project related Anatomy/Task Types - -![nuke_workfile_builder_template_task_type](assets/nuke_workfile_builder_template_task_type.png) - - - multi platform path can be used in a variety of ways. Along the absolute path to a template file also an python formatting could be used. At the moment these keys are supported (image example below): - - `root[key]`: definitions from anatomy roots - - `project[name, code]`: project in context - - `asset`: name of asset/shot in context - - `task[type, name, short_name]`: as they are defined on asset/shot and in **Anatomy/Task Type** on project context - -![nuke_workfile_builder_template_anatomy](assets/nuke_workfile_builder_template_anatomy.png) - -#### Run Builder profiles on first launch -Enabling this feature will look into available Builder's Prorfiles (look below for more information about this feature) and load available versions into node graph. - -### Profiles (Builder) -Builder profiles are set of rules allowing artist Load any available versions for the context of the asset, which it is run from. Preset is having following attributes: - -- **Filter**: Each profile could be defined with task filter. In case no filter is defined, a profile will be working for all. - -- **Context section**: filtres for subset name (regex accepted), families, representation names and available Loader plugin. - -- **Linked Assets/Shots**: filters for asset builds to be added - -![nuke_workfile_builder_profiles](assets/nuke_workfile_builder_profiles.png) diff --git a/website/docs/project_settings/settings_project_standalone.md b/website/docs/project_settings/settings_project_standalone.md deleted file mode 100644 index 1383bd488e..0000000000 --- a/website/docs/project_settings/settings_project_standalone.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -id: settings_project_standalone -title: Project Standalone Publisher Setting -sidebar_label: Standalone Publisher ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Project settings can have project specific values. Each new project is using studio values defined in **default** project but these values can be modified or overridden per project. - -:::warning Default studio values -Projects always use default project values unless they have [project override](../admin_settings#project-overrides) (orange colour). Any changes in default project may affect all existing projects. -::: - -## Creator Plugins - -Contains list of implemented families to show in middle menu in Standalone Publisher. Each plugin must contain: -- name -- label -- family -- icon -- default subset(s) -- help (additional short information about family) - -![example of creator plugin](assets/standalone_creators.png) - -## Publish plugins - -### Collect Textures - -Serves to collect all needed information about workfiles and textures created from those. Allows to publish -main workfile (for example from Mari), additional worfiles (from Substance Painter) and exported textures. - -Available configuration: -- Main workfile extension - only single workfile can be "main" one -- Support workfile extensions - additional workfiles will be published to same folder as "main", just under `resourses` subfolder -- Texture extension - what kind of formats are expected for textures -- Additional families for workfile - should any family ('ftrack', 'review') be added to published workfile -- Additional families for textures - should any family ('ftrack', 'review') be added to published textures - -#### Naming conventions - -Implementation tries to be flexible and cover multiple naming conventions for workfiles and textures. - -##### Workfile naming pattern - -Provide regex matching pattern containing regex groups used to parse workfile name to learn needed information. (For example -build name.) - -Example: - -- pattern: ```^([^.]+)(_[^_.]*)?_v([0-9]{3,}).+``` -- with groups: ```["asset", "filler", "version"]``` - -parses `corridorMain_v001` into three groups: -- asset build (`corridorMain`) -- filler (in this case empty) -- version (`001`) - -Advanced example (for texture files): - -- pattern: ```^([^_.]+)_([^_.]+)_v([0-9]{3,})_([^_.]+)_({color_space})_(1[0-9]{3}).+``` -- with groups: ```["asset", "shader", "version", "channel", "color_space", "udim"]``` - -parses `corridorMain_aluminiumID_v001_baseColor_linsRGB_1001.exr`: -- asset build (`corridorMain`) -- shader (`aluminiumID`) -- version (`001`) -- channel (`baseColor`) -- color_space (`linsRGB`) -- udim (`1001`) - - -In case of different naming pattern, additional groups could be added or removed. Number of matching groups (`(...)`) must be same as number of items in `Group order for regex patterns` - -##### Workfile group positions - -For each matching regex group set in previous paragraph, its ordinal position is required (in case of need for addition of new groups etc.) - -Number of groups added here must match number of parsing groups from `Workfile naming pattern`. - -##### Output names - -Output names of published workfiles and textures could be configured separately: -- Subset name template for workfile -- Subset name template for textures (implemented keys: ["color_space", "channel", "subset", "shader"]) - - -### Validate Scene Settings - -#### Check Frame Range for Extensions - -Configure families, file extension and task to validate that DB setting (frame range) matches currently published values. - -### ExtractThumbnailSP - -Plugin responsible for generating thumbnails, configure appropriate values for your version o ffmpeg. \ No newline at end of file diff --git a/website/docs/pype2/admin_anatomy.md b/website/docs/pype2/admin_anatomy.md deleted file mode 100644 index a7b3c16033..0000000000 --- a/website/docs/pype2/admin_anatomy.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -id: admin_anatomy -title: Project Anatomy -sidebar_label: Folder Structure ---- - -## PROJECT Structure - -This is example project structure when using Pype: - -```text -Project - โ”œโ”€โ”€โ”€assets - โ”‚ โ”œโ”€โ”€โ”€Bob - โ”‚ โ””โ”€โ”€โ”€... - โ””โ”€โ”€โ”€episodes - โ””โ”€โ”€โ”€ep01 - โ””โ”€โ”€โ”€sq01 - โ””โ”€โ”€โ”€ep01_sq01_sh001 - โ”œโ”€โ”€โ”€publish - โ””โ”€โ”€โ”€work -``` - -:::note Shot naming -We do strongly recommend to name shots with their full hierarchical name. Avalon doesn't allow two assets with same name in project. Therefore if you have for example: - -```text -sequence01 / shot001 -``` -and then -```text -sequence02 / shot001 -``` -you'll run into trouble because there are now two `shot001`. - -Better way is to use full qualified name for shot. So the above become: -```text -sequence01 / sequence01_shot001 -``` - -This has two advantages: there will be no duplicities this way and artists can see just by looking at filename the whole hierarchy. -::: - -## ASSET Structure - -```text -Bob - โ”œโ”€โ”€โ”€publish - โ”‚ โ”œโ”€โ”€โ”€model - โ”‚ โ”‚ โ”œโ”€โ”€โ”€modelMain - โ”‚ โ”‚ โ”œโ”€โ”€โ”€modelProxy - โ”‚ โ”‚ โ””โ”€โ”€โ”€modelSculpt - โ”‚ โ”œโ”€โ”€โ”€workfile - โ”‚ โ”‚ โ””โ”€โ”€โ”€taskName - โ”‚ โ”œโ”€โ”€โ”€rig - โ”‚ โ”‚ โ””โ”€โ”€โ”€rigMain - โ”‚ โ”œโ”€โ”€โ”€look - โ”‚ โ”‚ โ”œโ”€โ”€โ”€lookMain - โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€v01 - โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€texture - โ”‚ โ”‚ โ””โ”€โ”€โ”€lookWet - โ”‚ โ”œโ”€โ”€โ”€camera - โ”‚ โ”‚ โ”œโ”€โ”€โ”€camMain - โ”‚ โ”‚ โ””โ”€โ”€โ”€camLayout - โ”‚ โ”œโ”€โ”€โ”€cache - โ”‚ โ”‚ โ”œโ”€โ”€โ”€cacheChar01 - โ”‚ โ”‚ โ””โ”€โ”€โ”€cacheRock01 - โ”‚ โ”œโ”€โ”€โ”€vrproxy - โ”‚ โ”œโ”€โ”€โ”€fx - โ”‚ โ””โ”€โ”€โ”€setdress - โ””โ”€โ”€โ”€work - โ”œโ”€โ”€โ”€concept - โ”œโ”€โ”€โ”€fur - โ”œโ”€โ”€โ”€modelling - โ”œโ”€โ”€โ”€rig - โ”œโ”€โ”€โ”€look - โ””โ”€โ”€โ”€taskName -``` diff --git a/website/docs/pype2/admin_config.md b/website/docs/pype2/admin_config.md deleted file mode 100644 index c895c0b6b0..0000000000 --- a/website/docs/pype2/admin_config.md +++ /dev/null @@ -1,392 +0,0 @@ ---- -id: admin_config -title: Studio Config -sidebar_label: Studio Config ---- - -All of the studio specific configurations are stored as simple JSON files in the **pype-config** repository. - -Config is split into multiple sections described below. - -## Anatomy - -Defines where and how folders and files are created for all the project data. Anatomy has two parts **Roots** and **Templates**. - -:::warning -It is recommended to create anatomy [overrides](#per-project-configuration) for each project even if values haven't changed. Ignoring this recommendation may cause catastrophic consequences. -::: - -### Roots -Roots define where files are stored with path to shared folder. You can set them in `roots.json`. -It is required to set root path for each platform you are using in studio. All paths must point to same folder! -```json -{ - "windows": "P:/projects", - "darwin": "/Volumes/projects", - "linux": "/mnt/share/projects" -} -``` - -It is possible to set multiple roots when necessary. That may be handy when you need to store specific type of data on another disk. In that case you'll have to add one level in json. -```json -{ - "work": { - "windows": "P:/work", - "darwin": "/Volumes/work", - "linux": "/mnt/share/work" - }, - "publish": { - "windows": "Y:/publish", - "darwin": "/Volumes/publish", - "linux": "/mnt/share/publish" - } -} -``` -Usage of multiple roots is explained below in templates part. - -### Templates -Templates define project's folder structure and filenames. You can set them in `default.yaml`. - -### Required templates -We have a few required anatomy templates for Pype to work properly, however we keep adding more when needed. - -```yaml -work: - folder: "{root}/{project[name]}/{hierarchy}/{asset}/work/{task}" - file: "{project[code]}_{asset}_{task}_v{version:0>3}<_{comment}>.{ext}" - path: "{root}/{project[name]}/{hierarchy}/{asset}/work/{task}/{project[code]}_{asset}_{task}_v{version:0>3}<_{comment}>.{ext}" - -publish: - folder: "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/v{version:0>3}" - file: "{project[code]}_{asset}_{subset}_v{version:0>3}<.{frame}>.{representation}" - path: "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/v{version:0>3}/{project[code]}_{asset}_{subset}_v{version:0>3}<.{frame}>.{representation}" -``` - -Template groups `work` and `publish` must be set in all circumstances. Both must have set keys as shown `folder`, holds path template for the directory where the files are stored, `file` only holds the filename and `path` combines the two together for quicker access. - -### Available keys -| Context key | Description | -| --- | --- | -| root | Path to root folder | -| root[\] | Path to root folder when multiple roots are used.
Key `` represents root key specified in `roots.json` | -| project[name] | Project's full name. | -| project[code] | Project's code. | -| hierarchy | All hierarchical parents as subfolders. | -| asset | Name of asset or shot. | -| task | Name of task. | -| version | Version number. | -| subset | Subset name. | -| family | Main family name. | -| ext | File extension. (Possible to use only in `work` template atm.) | -| representation | Representation name. (Is used instead of `ext` except `work` template atm.) | -| frame | Frame number for sequence files. | -| output | | -| comment | | - -:::warning -Be careful about using `root` key in templates when using multiple roots. It is not allowed to combine both `{root}` and `{root[]}` in templates. -::: -:::note -It is recommended to set padding for `version` which is possible with additional expression in template. Entered key `{version:0<3}` will result into `001` if version `1` is published. -**Explanation:** Expression `0<3` will add `"0"` char to the beginning(`<`) until string has `3` characters. -::: - -| Date-Time key | Example result | Description | -| --- | --- | --- | -| d | 1, 30 | Day of month in shortest possible way. | -| dd | 01, 30 | Day of month with 2 digits. | -| ddd | Mon | Shortened week day name. | -| dddd | Monday | Full week day name. | -| m | 1, 12 | Month number in shortest possible way. | -| mm | 01, 12 | Month number with 2 digits. | -| mmm | Jan | Shortened month name. | -| mmmm | January | Full month name. | -| yy | 20 | Shortened year. | -| yyyy | 2020 | Full year. | -| H | 4, 17 | Shortened 24-hour number. | -| HH | 04, 17 | 24-hour number with 2 digits. | -| h | 5 | Shortened 12-hour number. | -| hh | 05 | 12-hour number with 2 digits. | -| ht | AM, PM | Midday part. | -| M | 0 | Shortened minutes number. | -| MM | 00 | Minutes number with 2 digits. | -| S | 0 | Shortened seconds number. | -| SS | 00 | Seconds number with 2 digits. | - -### Optional keys -Keys may be optional for some reason when are wrapped with `<` and `>`. But it is recommended to use only for these specific keys with obvious reasons: -- `output`, `comment` are optional to fill -- `frame` is used only for sequences. - -### Inner keys -It is possible to use value of one template key inside value of another template key. This can be done only per template group, which means it is not possible to use template key from `publish` group inside `work` group. - -Usage is similar to using template keys but instead of `{key}` you must add `@` in front of key: `{@key}` - -With this feature `work` template from example above may be much easier to read and modify. -```yaml -work: - folder: "{root}/{project[name]}/{hierarchy}/{asset}/work/{task}" - file: "{project[code]}_{asset}_{task}_v{version:0>3}<_{comment}>.{ext}" - path: "{@folder}/{@file}" - # This is how `path` key will look as result - # path: "{root}/{project[name]}/{hierarchy}/{asset}/work/{task}/{project[code]}_{asset}_{task}_v{version:0>3}<_{comment}>.{ext}" -``` - -:::warning -Be aware of unsolvable recursion in inner keys. -```yaml -group: - # Use key where source key is used in value - key_1: "{@key_2}" - key_2: "{@key_1}" - - # Use itself - key_3: "{@key_3}" -``` -::: - -### Global keys -Global keys are keys with value outside template groups. All these keys will be available in each template group with ability to override them inside the group. - -**Source** -```yaml -# Global key outside template group -global_key: "global value" - -group_1: - # `global_key` is not set - example_key_1: "{example_value_1}" - -group_2: - # `global_key` is iverrided - global_key: "overridden global value" -``` -**Result** -```yaml -global_key: "global value" - -group_1: - # `global_key` was added - global_key: "global value" - example_key_1: "{example_value_1}" - -group_2: - # `global_key` kept it's value for `group_2` - global_key: "overridden global value" -``` - -### Combine Inner keys with Global keys -Real power of [Inner](#inner-keys) and [Global](#global-keys) keys is their combination. - -**Template source** -```yaml -# PADDING -frame_padding: 4 -frame: "{frame:0>frame_padding}" -# MULTIPLE ROOT -root_name: "root_name_1" -root: {root[{@root_name}]} - -group_1: - example_key_1: "{@root}/{@frame}" - -group_2: - frame_padding: 3 - root_name: "root_name_2" - example_key_2: "{@root}/{@frame}" - -group_3: - frame: "{frame}" - example_key_3: "{@root}/force_value/{@frame}" -``` -**Equals** -```yaml -frame_padding: 4 -frame: "{frame:0>3}" -root_name: "root_name_1" -root: {root[root_name_1]} - -group_1: - frame_padding: 4 - frame: "{frame:0>3}" - root_name: "root_name_1" - root: {root[root_name_1]} - # `example_key_1` result - example_key_1: "{root[root_name_1]}/{frame:0>3}" - -group_2: - frame_padding: 3 - frame: "{frame:0>3}" - root_name: "root_name_2" - root: {root[root_name_2]} - # `example_key_2` result - example_key_2: "{root[root_name_2]}/{frame:0>2}" - -group_3: - frame_padding: 4 - frame: "{frame}" - root_name: "root_name_1" - root: {root[root_name_1]} - # `example_key_3` result - example_key_3: "{root[root_name_1]}/force_value/{frame}" -``` - -:::warning -Be careful about using global keys. Keep in mind that **all global keys** will be added to **all template groups** and all inner keys in their values **MUST** be in the group. -For example in [required templates](#required-templates) it seems that `path: "{@folder}/{@file}"` should be used as global key, but that would require all template groups have `folder` and `file` keys which is not true by default. -::: - -## Environments - -Here is where all the environment variables are set up. Each software has it's own environment file where we set all variables needed for it to function correctly. This is also a place where any extra in-house variables should be added. All of these individual configs and then loaded additively as needed based on current context. - -For example when launching Pype Tray, **Global** and **Avalon** envs are loaded first. If the studio uses also *Deadline* and *Ftrack*, both of those environments get added at the same time. This sets the base environment for the rest of the pipeline that will be inherited by all the applications launched from this point on. - -When user launches an application for a task, its general and versioned env files get added to the base before the software launches. When launching *Maya 2019*, both `maya.json` and `maya_2019.json` will be added. - -If the project or task also has extra tools configured, say *Arnold Mtoa 3.1.1*, a config JSON with the same name will be added too. - -This way the environment is completely dynamic with possibility of overrides on a granular level, from project all the way down to task. - -## Launchers - -Considering that different studios use different ways of deploying software to their workstations, we need to tell Pype how to launch all the individual applications available in the studio. - -Each software need multiple files prepared for it to function correctly. - -```text -application_name.toml -application_name.bat -application_name.sh -``` - -TOML file tells Pype how to work with the application across the board. Icons, Label in GUI, *Ftrack* settings but most importantly it defines what executable to run. These executable are stored in the windows and linux subfolder in the launchers folder. If `application_name.toml` defines that executable to run is `application_name`, Pype assumes that a `.bat` and `.sh` files under that name exist in the linux and windows folders in launchers. Correct version is picked automatically based on the platform Pype is running on. - -These `.bat` and `.sh` scripts have only one job then. They have to point to the exact executable path on the system, or to a command that will launch the app we want. Version granularity is up to the studio to decide. We can show artists Nuke 11.3, while specifying the particular version 11.3v4 only in the .bat file, so the artist doesn't need to deal with it, or we can present him with 11.3v4 directly. the choice is mostly between artist control vs more configuration files on the system. - -## Presets - -This is where most of the functions configuration of the pipeline happens. Colorspace, data types, burnin setting, geometry naming conventions, ftrack attributes, playblast settings, types of exports and lot's of other settings. - -Presets are categorized in folders based on what they control or what host (DCC application) they are for. We're slowly working on documenting them all, but new ones are being created regularly as well. Hopefully the categories and names are sufficiently self-explanatory. - -### colorspace - -Defines all available color spaces in the studio. These configs not only tell the system what OCIO to use, but also how exactly it needs to be applied in the give application. From loading the data, through previewing it all the way to rendered - -### Dataflow - -Defines allowed file types and data formats across the pipeline including their particular coded and compression settings. - -### Plugins - -All the creator, loader and publisher configurations are stored here. We can override any properties of the default plugin values and more. - -#### How does it work - -Overriding plugin properties is as simple as adding what needs to be changed to -JSON file along with plugin name. - -Say you have name validating plugin: - -```python -import pyblish.api - - -class ValidateModelName(pyblish.api.InstancePlugin): - - order = pype.api.ValidateContentsOrder - hosts = ['maya'] - families = ['model'] - label = 'Validate Mesh Name' - - # check for: 'foo_001_bar_GEO` - regex = r'.*_\d*_.*_GEO' - - def process(self, instance): - # pseudocode to get nodes - models = get_models(instance.data.get("setMembers", None)) - r = re.compile(self.regex) - for model in models: - m = r.match(obj) - if m is None: - raise RuntimeError("invalid name on {}".format(model)) - -``` -_This is just non-functional example_ - -Instead of creating new plugin with different regex, you can put: - -```javascript -"ValidateModelName": { - "regex": ".*\\d*_.*_geometry" -} -``` -and put it into `repos/pype-config/presets/plugins/maya/publish.json`. There can be more entries -like that for how many plugins you need. - -That will effectively replace regex defined in plugin during runtime with the one you've just -defined in JSON file. This way you can change any properties defined in plugin. - -:::tip loader and creators -Similar way exist for *Loaders* and *Creators*. Use files `create.json` for Creators, `load.json` -for Loaders and `publish.json` for **Pyblish** plugins like extractors, validators, etc. - -Preset resolution works by getting host name (for example *Maya*) and then looking inside - `repos/pype-config/presets/plugins//publish.json` path. If plugin is not found, then - `repos/pype-config/presets/plugins/global/publish.json` is tried. -::: - -:::tip Per project plugin override -You can override plugins per project. See [Per-project configuration](#per-project-configuration) -::: - - -## Schema - -Holds all database schemas for *mongoDB*, that we use. In practice these are never changed on a per studio basis, however we included them in the config for cases where a particular project might need a very individual treatment. - -## Per-project configuration - -You can have per-project configuration with Pype. This allows you to have for example different -validation requirements, file naming, etc. - -This is very easy to set up - point `PYPE_PROJECT_CONFIGS` environment variable to place -where you want those per-project configurations. Then just create directory with project name and -that's almost it. Inside, you can follow hierarchy of **pype-config** presets. Everything put there -will override stuff in **pype-config**. - -### Example - -You have a project where you need to disable some validators - let's say overlapping -UVs validator in Maya. - -Project name is *FooProject*. -Your `PYPE_PROJECT_CONFIGS` points to `/studio/pype/projects`. - -Create projects settings directory: -```sh -mkdir $PYPE_PROJECT_CONFIGS/FooProject -``` -Now you can use plugin overrides to disable validator: - -Put: -```javascript -{ - "ValidateMeshHasOverlappingUVs": { - "enabled": false - } -} -``` -into: - -```sh -$PYPE_PROJECT_CONFIGS/FooPoject/presets/plugins/maya/publish.json -``` - -And its done. **ValidateMeshHasOverlappingUVs** is a class name of validator - you can -find that name by looking into python file containing validator code, or in Pyblish GUI. - -That way you can make it optional or set whatever properties you want on plugins and those -settings will take precedence over the default site-wide settings. diff --git a/website/docs/pype2/admin_ftrack.md b/website/docs/pype2/admin_ftrack.md deleted file mode 100644 index 4ebe1a7add..0000000000 --- a/website/docs/pype2/admin_ftrack.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -id: admin_ftrack -title: Ftrack Setup -sidebar_label: Ftrack Setup ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - -Ftrack is currently the main project management option for Pype. This documentation assumes that you are familiar with Ftrack and its basic principles. If you're new to Ftrack, we recommend having a thorough look at [Ftrack Official Documentation](http://ftrack.rtd.ftrack.com/en/stable/). - -## Prepare Ftrack for Pype - -If you want to connect Ftrack to Pype you might need to make few changes in Ftrack settings. These changes would take a long time to do manually, so we prepared a few Ftrack actions to help you out. First, you'll need to launch Pype's tray application and set [Ftrack credentials](#credentials) to be able to run our Ftrack actions. - -The only action that is strictly required is [Pype Admin - Create/Update Avalon Attributes](manager_ftrack_actions#create-update-avalon-attributes), which creates and sets the Custom Attributes necessary needed for Pype to function. If you want to use pype only for new projects then you should read about best practice with [new project](#new-project). - -If you want to switch projects that are already in production, you might also need to run [Pype Doctor - Custom attr doc](manager_ftrack_actions#custom-attr-doc). - -:::caution -Keep in mind that **Custom attr doc** action will migrate certain attributes from ftrack default ones to our custom attributes. Some attributes will also be renamed. We make backup of the values, but be very careful with this option and consults us before running it. -::: - -## Event Server - -Ftrack Event Server is the key to automation of many tasks like _status change_, _thumbnail update_, _automatic synchronization to Avalon database_ and many more. Event server should run at all times to perform all the required processing as it is not possible to catch some of them retrospectively with enough certainty. - -### Running event server - -There are specific launch arguments for event server. With `$PYPE_SETUP/pype eventserver` you can launch event server but without prior preparation it will terminate immediately. The reason is that event server requires 3 pieces of information: _Ftrack server url_, _paths to events_ and _Credentials (Username and API key)_. Ftrack server URL and Event path are set from Pype's environments by default, but the credentials must be done separatelly for security reasons. - - - -:::note There are 2 ways of passing your credentials to event server. - - - - - -- **`--ftrack-user "your.username"`** : Ftrack Username -- **`--ftrack-api-key "00000aaa-11bb-22cc-33dd-444444eeeee"`** : User's API key -- **`--store-crededentials`** : Entered credentials will be stored for next launch with this argument _(It is not needed to enter **ftrackuser** and **ftrackapikey** args on next launch)_ -- **`--no-stored-credentials`** : Stored credentials are loaded first so if you want to change credentials use this argument -- `--ftrack-url "https://yourdomain.ftrackapp.com/"` : Ftrack server URL _(it is not needed to enter if you have set `FTRACK_SERVER` in Pype' environments)_ -- `--ftrack-events-path "//Paths/To/Events/"` : Paths to events folder. May contain multiple paths separated by `;`. _(it is not needed to enter if you have set `FTRACK_EVENTS_PATH` in Pype' environments)_ - -So if you want to use Pype's environments then you can launch event server for first time with these arguments `$PYPE_SETUP/pype eventserver --ftrack-user "my.username" --ftrack-api-key "00000aaa-11bb-22cc-33dd-444444eeeee" --store-credentials`. Since that time, if everything was entered correctly, you can launch event server with `$PYPE_SETUP/pype eventserver`. - - - - -- `FTRACK_API_USER` - Username _("your.username")_ -- `FTRACK_API_KEY` - User's API key _("00000aaa-11bb-22cc-33dd-444444eeeee")_ -- `FTRACK_SERVER` - Ftrack server url _(")_ -- `FTRACK_EVENTS_PATH` - Paths to events _("//Paths/To/Events/")_ - We do not recommend you this way. - - - -::: - -:::caution -We do not recommend setting your ftrack user and api key environments in a persistent way, for security reasons. Option 1. passing them as arguments is substantially safer. -::: - -### Where to run event server - -We recommend you to run event server on stable server machine with ability to connect to Avalon database and Ftrack web server. Best practice we recommend is to run event server as service. - -:::important -Event server should **not** run more than once! It may cause big pipeline issues. -::: - -### Which user to use - -- must have at least `Administrator` role -- same user should not be used by an artist - -### Run Linux service - step by step - -1. create file: - `sudo vi /opt/pype/run_event_server.sh` - -2. add content to the file: - -```sh -export PYPE_DEBUG=3 -pushd /mnt/pipeline/prod/pype-setup -. pype eventserver --ftrack-user --ftrack-api-key -``` - -3. create service file: - `sudo vi /etc/systemd/system/pype-ftrack-event-server.service` - -4. add content to the service file - -```toml -[Unit] -Description=Run Pype Ftrack Event Server Service -After=network.target - -[Service] -Type=idle -ExecStart=/opt/pype/run_event_server.sh -Restart=on-failure -RestartSec=10s - -[Install] -WantedBy=multi-user.target -``` - -5. change file permission: - `sudo chmod 0755 /etc/systemd/system/pype-ftrack-event-server.service` - -6. enable service: - `sudo systemctl enable pype-ftrack-event-server` - -7. start service: - `sudo systemctl start pype-ftrack-event-server` - -* * * - -## Ftrack events - -Events are helpers to automation. They react to Ftrack Web Server events like change entity attribute, create of entity, etc. . - -### Delete Avalon ID from new entity _(DelAvalonIdFromNew)_ - -Is used to remove value from `Avalon/Mongo Id` Custom Attribute when entity is created. - -`Avalon/Mongo Id` Custom Attribute stores id of synchronized entities in pipeline database. When user _Copy -> Paste_ selection of entities to create similar hierarchy entities, values from Custom Attributes are copied too. That causes issues during synchronization because there are multiple entities with same value of `Avalon/Mongo Id`. To avoid this error we preventively remove these values when entity is created. - -### Next Task update _(NextTaskUpdate)_ - -Change status of next task from `Not started` to `Ready` when previous task is approved. - -Multiple detailed rules for next task update can be configured in the presets. - -### Synchronization to Avalon database _(Sync_to_Avalon)_ - -Automatic [synchronization to pipeline database](manager_ftrack#synchronization-to-avalon-database). - -This event updates entities on their changes Ftrack. When new entity is created or existing entity is modified. Interface with listing information is shown to users when [synchronization rules](manager_ftrack#synchronization-rules) are not met. This event may also undo changes when they might break pipeline. Namely _change name of synchronized entity_, _move synchronized entity in hierarchy_. - -:::important -Deleting an entity by Ftrack's default is not processed for security reasons _(to delete entity use [Delete Asset/Subset action](manager_ftrack_actions#delete-asset-subset))_. -::: - -### Synchronize hierarchical attributes _(SyncHierarchicalAttrs)_ - -Auto-synchronization of hierarchical attributes from Ftrack entities. - -Related to [Synchronize to Avalon database](#synchronization-to-avalon-database) event _(without it, it makes no sense to use this event)_. Hierarchical attributes must be synchronized with special way so we needed to split synchronization into 2 parts. There are [synchronization rules](manager_ftrack#synchronization-rules) for hierarchical attributes that must be met otherwise interface with messages about not meeting conditions is shown to user. - -### Thumbnails update _(ThumbnailEvents)_ - -Updates thumbnail of Task and it's parent when new Asset Version with thumbnail is created. - -This is normally done by Ftrack Web server when Asset Version is created with Drag&Drop but not when created with Ftrack API. - -### Version to Task status _(VersionToTaskStatus)_ - -Updates Task status based on status changes on it's `AssetVersion`. - -The issue this solves is when Asset version's status is changed but the artist assigned to Task is looking at the task status, thus not noticing the review. - -This event makes sure statuses Asset Version get synced to it's task. After changing a status on version, this event first tries to set identical status to version's parent (usually task). At this moment there are a few more status mappings hardcoded into the system. If Asset version's status was changed to: - -- `Reviewed` then Task's status will be changed to `Change requested` -- `Approved` then Task's status will be changed to `Complete` - - -### Update First Version status _(FirstVersionStatus)_ - -This event handler allows setting of different status to a first created Asset Version in ftrack. - -This is useful for example if first version publish doesn't contain any actual reviewable work, but is only used for roundtrip conform check, in which case this version could receive status `pending conform` instead of standard `pending review` - -Behaviour can be filtered by `name` or `type` of the task assigned to the Asset Version. Configuration can be found in [ftrack presets](admin_presets_ftrack#first_version_status-dict) - -* * * - -## Credentials - -If you want to be able use Ftrack actions with Pype tray or [event server](#event-server) you need to enter credentials. The credentials required for Ftrack are `Username` and `API key`. - -### Credentials in tray - -How to handle with credentials in tray is described [here](#artist_ftrack#first-use-best-case-scenario). - -### Credentials in event server - -How to enter credentials to event server is described [here](#how-to-run-event-server). - -### Where to find API key - -Please check the [official documentation](http://ftrack.rtd.ftrack.com/en/backlog-scaling-ftrack-documentation-story/developing/api_keys.html). diff --git a/website/docs/pype2/admin_hosts.md b/website/docs/pype2/admin_hosts.md deleted file mode 100644 index f7aa5bd54a..0000000000 --- a/website/docs/pype2/admin_hosts.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -id: admin_hosts -title: Hosts Setup -sidebar_label: Hosts Setup ---- - -## Host configuration - -To add new host application (for example new version of Autodesk Maya, etc.) just follow these steps: - -### Launchers - -You can find **launchers** in `repos/pype-config`. You can notice there is a bunch of **[TOML](https://en.wikipedia.org/wiki/TOML)** files and Linux and Windows shell scripts in their respective folders. **TOML** file -holds basic metadata information for host application. Their naming convention is important and follow this pattern: - -```fix -app_name[_version].toml -``` - -for example `maya_2020.toml` or `nuke_11.3.toml`. More about it later. For now, lets look on content of one of these files: - -```toml -executable = "unreal" -schema = "avalon-core:application-1.0" -application_dir = "unreal" -label = "Unreal Editor 4.24" -ftrack_label = "UnrealEditor" -icon ="ue4_icon" -launch_hook = "pype/hooks/unreal/unreal_prelaunch.py/UnrealPrelaunch" -ftrack_icon = '{}/app_icons/ue4.png' -``` - -* `executable` - specifies name (without extension) of shell script launching application (in windows/linux/darwin folders) -* `schema` - not important, specifying type of metadata -* `application_dir` - this specifies name of folder used in **app** key in [anatomy templates](admin_config#anatomy) -* `label` - name of application to show in launcher -* `ftrack_label` - name under which this application is show in ftrack actions (grouped by) -* `icon` - application icon used in avalon launcher -* `launch_hook` - path to Python code to execute before application is started (currently only from ftrack action) -* `ftrack_icon` - icon used in ftrack - -### Environments - -You can modify environment variables for you application in `repos/pype-config/environments`. Those files are -[JSON](https://en.wikipedia.org/wiki/JSON) files. Those file are loaded and processed in somewhat hierarchical way. For example - for Autodesk Maya 2020, first file named `maya.json` is processed and then `maya_2020.json` is. Syntax is following: - -```json -{ - "VARIABLE": "123", - "NEXT_VARIABLE": "{VARIABLE}4", - "PLATFORMS": { - "windows": "set_on_windows", - "linux": "set_on_linux", - "darwin": "set_on_max" - }, - "PATHS: [ - "paths/1", "path/2", "path/3" - ] -} -``` - -This will result on windows in environment with: - -```sh -VARIABLE="123" -NEXT_VARIABLE="1234" -PLATFORMS="set_on_windows" -PATHS="path/1;path/2;path/3" -``` - -### Ftrack - -You need to add your new application to ftrack so it knows about it. This is done in System Preferences of -ftrack in `Advanced:Custom Attributes`. There you can find `applications` attribute. It looks like this: - -![Ftrack - custom attributes - applications](../assets/ftrack/ftrack-custom_attrib_apps.jpg) - -Menu/value consists of two rows per application - first row is application name and second is basically filename of this **TOML** file mentioned above without `.toml` extension. After you add or modify whatever you need here, you need to add you new application to project in ftrack. Just open project Info in ftrack, find out -**Applications** and add your new application there. If you are running [event server](admin_ftrack#event-server) then this information is synced to avalon automatically. If not, you need to sync it manually by running **Sync to Avalon** action. - -Now, restart Pype and your application should be ready. - -### Conclusion - -To wrap it up: - -- create your shell scripts to launch application (don't forget to set correct OS permissions) -- create **TOML** file pointing to shell scripts, set you icons and labels there -- check or create you environment **JSON** file in `environments` even if it is empty (`{}`) -- to make it work with ftrack, modify **applications** in *Custom Attributes*, add it to your project and sync -- restart Pype - -## Autodesk Maya - -[Autodesk Maya](https://www.autodesk.com/products/maya/overview) is supported out of the box and doesn't require any special setup. Even though everything should be ready to go from the start, here is the checklist to get pype running in Maya - -1. Correct executable in launchers as explained in [here](admin_config#launchers) -2. Pype environment variable added to `PYTHONPATH` key in `maya.json` environment preset. -```json -{ - "PYTHONPATH": [ - "{PYPE_ROOT}/repos/avalon-core/setup/maya", - "{PYPE_ROOT}/repos/maya-look-assigner" - ] -} -``` - - -## Foundry Nuke - -[Foundry Nuke](https://www.foundry.com/products/nuke) is supported out of the box and doesn't require any special setup. Even though everything should be ready to go from the start, here is the checklist to get pype running in Nuke - -1. Correct executable in launchers as explained in [here](admin_config#launchers) -2. Following environment variables in `nuke.json` environment file. (PYTHONPATH might need to be changed in different studio setups) - -```json -{ - "NUKE_PATH": [ - "{PYPE_ROOT}/repos/avalon-core/setup/nuke/nuke_path", - "{PYPE_MODULE_ROOT}/setup/nuke/nuke_path", - "{PYPE_STUDIO_PLUGINS}/nuke" - ], - "PYPE_LOG_NO_COLORS": "True", - "PYTHONPATH": { - "windows": "{VIRTUAL_ENV}/Lib/site-packages", - "linux": "{VIRTUAL_ENV}/lib/python3.6/site-packages" - } -} -``` - - - -## AWS Thinkbox Deadline - -To support [AWS Thinkbox Deadline](https://www.awsthinkbox.com/deadline) you just need to: - -1. enable it in **init_env** key of your `deploy.json` file: - -```json -{ - "PYPE_CONFIG": "{PYPE_ROOT}/repos/pype-config", - "init_env": ["global", "avalon", "ftrack", "deadline"] -} -``` - -2. Edit `repos/pype-config/environments/deadline.json` and change `DEADLINE_REST_URL` to point to your Deadline Web API service. - -3. Set up *Deadline Web API service*. For more details on how to do it, see [here](https://docs.thinkboxsoftware.com/products/deadline/10.0/1_User%20Manual/manual/web-service.html). - -### Pype Dealine supplement code - -There is some code needed to be installed on Deadline repository. You can find this repository overlay in -`pype-setup/vendor/deadline`. This whole directory can be copied to your existing deadline repository. - -Currently there is just **GlobalJobPreLoad.py** script taking care of path remapping in case of multiplatform -machine setup on farm. If there is no mix of windows/linux machines on farm, there is no need to use this. - -## Virtual Vertex Muster - -:::warning -Support for Muster was removed from OpenPype and AYON. -::: - -Pype supports rendering with [Muster](https://www.vvertex.com/). To enable it: -1. Add `muster` to **init_env** to your `deploy.json` - file: - -```json -{ - "PYPE_CONFIG": "{PYPE_ROOT}/repos/pype-config", - "init_env": ["global", "avalon", "ftrack", "muster"] -} -``` - -2. Configure URL to Muster Web API - in `repos/pype-config/environments/muster.json`. There you need to set `MUSTER_REST_URL` to correct value. - -3. Enabled muster in [tray presets](admin_presets_tools##item_usage-dict) - -#### Template mapping - -For setting up muster templates have a look at [Muster Template preset](admin_presets_tools#muster-templates) - -:::note -User will be asked for it's Muster login credentials during Pype startup or any time later if its authentication token expires. -::: - - -## Clockify - -[Clockify](https://clockify.me/) integration allows pype users to seamlessly log their time into clockify in the background. This in turn allow project managers to have better overview of all logged times with clockify dashboards and analytics. - -1. Enable clockify, add `clockify` to **init_env** in your `deploy.json` - file: - -```json -{ - "PYPE_CONFIG": "{PYPE_ROOT}/repos/pype-config", - "init_env": ["global", "avalon", "ftrack", "clockify"] -} -``` - -2. Configure your clockify workspace. In `repos/pype-config/environments/clockify.json`, you need to change `CLOCKIFY_WORKSPACE` to the correct value - -```json -{ - "CLOCKIFY_WORKSPACE": "test_workspace" -} -``` - -3. Enabled Clockify in [tray presets](admin_presets_tools##item_usage-dict) - - -:::note -User will be asked for it's Clockify login credentials during Pype startup. -::: - - -## Unreal Editor - -Pype supports [Unreal](https://www.unrealengine.com/). This support is currently tested only on Windows platform. -You can control Unreal behavior by editing `repos/pype-config/presets/unreal/project_setup.json`: - -```json -{ - "dev_mode": false, - "install_unreal_python_engine": false -} -``` - -Setting `dev_mode` to **true** will make all new projects created on tasks by pype C++ projects. To work with those, -you need [Visual Studio](https://visualstudio.microsoft.com/) installed. - -`install_unreal_python_engine` will install [20tab/UnrealEnginePython](https://github.com/20tab/UnrealEnginePython) as plugin -in new project. This implies `dev_mode`. Note that **UnrealEnginePython** is compatible only with specific versions of Unreal Engine (usually not with the latest one). This plugin is not needed but can be used along *"standard"* python support in Unreal Engine to -extend Pype or Avalon functionality. - -### Unreal Engine version detection - -Pype is trying to automatically find installed Unreal Engine versions. This relies on [Epic Games Launcher](https://www.epicgames.com/store/en-US/). -If you have custom install location (for example you've built your own version from sources), you can set -`UNREAL_ENGINE_LOCATION` to point there. Pype then tries to find UE version in `UE_x.xx` subfolders. - -### Avalon Unreal Integration plugin - -Avalon/Pype integration needs [Avalon Unreal Integration Plugin](https://github.com/pypeclub/avalon-unreal-integration). Use `AVALON_UNREAL_PLUGIN` environment variable to point to it. When new -UE project is created, file are copied from this directory to project `Plugins`. If Pype detects that plugin -isn't already built, it will copy its source codes to new project and force `dev_mode`. In that case, you need -**Visual Studio** to compile the plugin along with the project code. - -### Dependencies - -Pype integration needs: - -* *Python Script Plugin enabled* (done automatically) -* *Editor Scripting Utilities* (done automatically) -* *PySide* installed in Unreal Python 2 (or PySide2/PyQt5 if you've build Unreal Editor with Python 3 support) (done automatically) -* *Avalon Unreal Integration plugin* ([sources are on GitHub](https://github.com/pypeclub/avalon-unreal-integration)) -* *Visual Studio 2017* is needed to build *Avalon Unreal Integration Plugin* and/or if you need to work in `dev_mode` - -### Environment Variables - -- `AVALON_UNREAL_EDITOR` points to Avalon Unreal Integration Plugin sources/build -- `UNREAL_ENGINE_LOCATION` to override Pype autodetection and point to custom Unreal intallation -- `PYPE_UNREAL_ENGINE_PYTHON_PLUGIN` path to [20tab/UnrealEnginePython](https://github.com/20tab/UnrealEnginePython) optional plugin diff --git a/website/docs/pype2/admin_install.md b/website/docs/pype2/admin_install.md deleted file mode 100644 index c534a60945..0000000000 --- a/website/docs/pype2/admin_install.md +++ /dev/null @@ -1,430 +0,0 @@ ---- -id: admin_install -title: Pype Setup -sidebar_label: Pype Setup ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -## Introduction - -The general approach to pype deployment is installing central repositories on a shared network storage which can be accessed by all artists in the studio. Simple shortcuts to launchers are then distributed to all workstations for artists to use. This approach ensures easy maintenance and updates. - -When artist first runs pype all the required python packages get installed automatically to his local workstation and updated every time there is a change in the central installation. - -:::note -Automatic workstation installation and updates will not work in offline scenarios. In these case `pype install --force --offline` command must be triggered explicitly on the workstation -::: - -## Requirements - -### Python 3.6+ - -Pype requires Python 3.6 or later to be installed on each workstation running Pype. - -:::note -If you want to use pype with Blender, you need to upgrade your python to 3.7 or higher. -::: - -Windows version of Python can be easily grabbed at [python.org](https://www.python.org/downloads/). Install location doesn't matter but -python executable should be in `PATH` environment variable. - -:::important Linux -On linux it is somehow different and all depends on linux distribution in use. - -Some linux variants (for example *Ubuntu*) need **python-dev** variant of python package that includes python headers and developer tools. This is needed because some of **Pype** requirements need to compile themselves against python during their installation. Please, refer to your distribution community to find out how to install that package. -::: - - - - - - -```sh -sudo yum group install "Development Tools" -``` - -Python 3.6 is not part of official distribution. Easiest way is to add it with the help of *SCL* - Software Collection project. -This has advantage that it won't replace system version of python. - -```sh -sudo yum update -sudo yum install centos-release-scl -``` -Now you can install python itself: -```sh -sudo yum install rh-python36 -``` - -To be able to use installed version of python, you must enable it in shell: -```sh -scl enable rh-python36 bash -``` - -This will enable python 3.6 in currently running bash only! - -Check it with: -```sh -python --version -``` - - - - -```sh -sudo apt install build-essential -``` - -Some versions of Ubuntu already has python 3.6 installed, check it with: -```sh -python3 --version -``` -If python shows lower version then required, use: -``` -sudo apt-get update -sudo apt-get install python3-dev -``` -Please be aware that even if your system already has python 3.6, than if that -didn't come from **python3-dev** package, Pype will most likely fail to install -it's dependencies. - - - - - -:::note Override Python detection -You can override autodetection of Python. This can be useful if you want to use central network python location or some other custom location. Just set `PYPE_PYTHON_EXE` environment variable to point where you need. -::: - --------------- - -### MongoDB - -Pype needs site-wide installation of **MongoDB**. It should be installed on -reliable server all workstations (and possibly render nodes) can connect. This -server holds **Avalon** database that is at the core of everything, containing -very important data, so it should be backed up often and if high-availability is -needed, *replication* feature of **MongoDB** should be considered. This is beyond the -scope of this documentation, please refer to [MongoDB Documentation](https://docs.mongodb.com/manual/replication/). - -Pype can run it's own instance of **mongodb**, mostly for testing and development purposes. -For that it uses locally installed **MongoDB**. - -Download it from [mognoDB website](https://www.mongodb.com/download-center/community), install it and -add to the `PATH`. On Windows, Pype tries to find it in standard installation destination or using `PATH`. - -To run **mongoDB** on server, use your server distribution tools to set it up (on Linux). - -### Git - -To be able to deploy Pype, **git** is need. It will clone all required repositories and -control versions so future updates are easier. Git is however only requirent on admin workstation for global studio updates. - -See [how to install git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). - -To access private repositories, you'll need other optional stuff like ssh key agents, etc. - -### PowerShell (on Windows only) - -PowerShell is now included in recent versions of Windows. **Pype** requires at least -version 5.0, included in Windows 10 from beginning and available for Windows 7 SP1, -Windows 8.1 and Windows Server 2012. - -If you want to know what version of PowerShell are you running, execute in PowerShell prompt: -```powershell -$PSVersionTable -``` - If you need to install PowerShell or update it, please refer to: - [Installing powershell on windows](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-6) - -### Xcode CLT (on Mac only) - -Pype need **Xcode Command Line Tools** installed to provide its tools and be able to install its dependencies via pythons `pip` command. Those will be downloaded -and installed automatically if needed. - -### Other -:::warning Linux headless server -If you need to run Pype's **ftrack event server** on headless linux server, be aware that due Qt dependencies, you'll need to install OpenGL support there even if server doesn't have any real use for it. -::: - -## Studio Setup - -### Pype location - -Before you install Pype, first clone **pype-setup** repository to place you want Pype to be. In studio setting -you probably want that destination to be on shared network drive so all users can access it. - -:::tip production and development branch -We recommend to maintain two *versions* of Pype. The first is **production** branch - the one your artists use everyday for their work. The second one is **development** version you should use for testing new features and as development sandbox. Development branch can point to a different Avalon database and use its own **ftrack event server**. More on that in [Pype Configuration](admin_config) - -```text -Shared Network Drive -โ”œโ”€โ”€โ”€ pype - โ”œโ”€โ”€โ”€ prod - โ””โ”€โ”€โ”€ dev -``` - -To prepare this structure, you can use: -```sh -cd /shared_drive/pype -git clone --tag 2.4.0 https://bitbucket.com/pypeclub/pype-setup.git prod -git clone --tag 2.4.0 https://bitbucket.com/pypeclub/pype-setup.git dev -``` -::: - -Specify your version after `--branch` or `--tag` option. - -:::note -It is possible to distinguish `dev` and `prod` by changing Pype icon color to orange. To do so, you have to create `config.ini` file with content: -```text -[DEFAULT] -dev=true -``` - -And put the file to: -```text -Shared Network Drive -โ”œโ”€โ”€โ”€ dev - โ””โ”€โ”€โ”€ pype-setup - โ””โ”€โ”€โ”€pypeapp - โ””โ”€โ”€โ”€config.ini -``` -::: - -:::note -You should always use tags to checkout to get specific release, otherwise you end up with *develop* branch that can be unstable. -::: - -:::warning -By default, both branches will use the same virtual environment. Be careful when modifying your requirements in **dev** version because then it will influence **prod** version as well. To be safe, modify `PYPE_ENV` environment variable before using **dev** Pype commands. -::: - -### Installation - - - - - - -To install Pype you need to get first to it's root directory in powershell. - -If you have Pype on network, you should mount it as drive and assign it some consistent letter. You can also mount this network drive via junction point feature. As admin run from shell: - -```sh -mklink /d "C:\pipeline" "\\server\pipeline" -``` -Then your network drive will be available transparently at `C:\pipeline`. - -```sh -cd Z:\pype\production\pype-setup -``` ------ - -Now you can run installation itself: -```sh -.\pype.bat install -``` - - - - -To install pype you first need get to it's root directory in bash shell. -If you Pype location is on network drive, you should add it to `/etc/fstab` to -mount it automatically during system startup. -```sh -cd /location/of/pype -``` - -**Pype** can be installed with the following command: - -```sh -. pype install -``` - -On linux it is necessary to adjust user permissions to `/opt/pype/pype_env2` or whatever you set in `PYPE_ENV` and for that you need to be **root**. - - -#### Mounting network drives -If you Pype location is on network drive, you need to mount it first. Here are the steps to do it and make it so it re-mounts automatically after your computer restarts: - -1) in Finder press **Command+K** -2) enter path `smb://server/pipeline` and hit **Connect** -3) enter login and password -4) network drive is now mounted under `/Volumes/pipeline` -5) now go to **System Preferences** -6) click **Users & Groups -> Login Items** -7) click + and select mounted drive and click **Add** - - - - - -To install Pype on Mac, you need to have Administrator privileges. There are also further requirements if you need to deploy repositories. - -Run **Terminal**. Run following commands: -```sh -sudo -s -cd /Volumes/pipeline/pype/production/pype-setup -./pype install -``` - -`sudo -s` will take you to elevated privileges and you need to enter your password. `cd` will change directory to where you have pype located and `pype install` will run installation. - -If there are then warnings about some directory not owned by current user, you can fix it with following commands: - -```sh -chown -R yourusername /usr/local/pype -chown -R yourusername /Users/yourusername/Library/Caches/pip -``` -Switch `yourusername` for your user name :) - - - - - -What it basically does is: -1) Create python virtual environment on path: `C:\Users\Public\pype_env2` on Windows or `/opt/pype/pype_env2` on Linux or `/usr/local/pype/pype_env2` on Mac. -This can be overridden by setting `PYPE_ENV` to different path. Logic behind this is that this directory on Windows can be shared -between users on one machine - it only stores Pype dependencies, not any personal setting or credentials. - -2) Then it will install all python dependencies defined in `pypeapp\requirements.txt` into this virtual environment. - -Default installation will use your internet connection to download all necessary requirements. - -#### Offline installation - -You can also install Pype in offline scenarios: - -```sh -pype install --offline -``` - -This will use dependencies downloaded into `pype-setup/vendor/packages` rather than pulling directly from the internet. Those packages must, however, first be -downloaded on a machine connected to the internet using: - -```sh -pype download -``` - -:::warning multiple platforms -`pype download` will only download packages for currently running platform. So if you run it on Windows machine, only windows packages get downloaded (along with many universal ones). If you then run `pype install --offline` on Linux machine, it will probably fail as Linux specific packages will be missing. In multiplatform environments we recommend to run `pype download` on all used platform to combine all necessary packages into `vendor/packages`. -::: - -:::caution multiplatform caveat -There can be problems with libraries compatibility, when using multiplatform environments. For example if using **PyQt 5.12**, there seems to be no problem on Windows, but using it on **Centos Linux 7** will cause problems because Centos ships with some older dependent libraries that will not work with aforementioned PyQt version. -::: - -#### Forcing Installation - -Sometime it is necessary to force re-install Pype environment. To do this: - -```sh -pype install --force -``` - -or - -```sh -pype install --force --offline -``` -in offline scenarios. - -This is useful if Pype is misbehaving as first line of debugging. You can of course just manually delete `PYPE_ENV` directory and run `pype install` again. - -### Deployment - -After Pype is cloned and installed, it is necessary to *deploy* all repositories used by Pype. This must be done on a computer with -Internet access. - -```sh -pype deploy -``` - -This command will process all repositories specified in `deploy/deploy.json` and clone them into `repos/` directory. - -```sh -pype deploy --force -``` - -will deploy repositories, overwriting existing ones if they exists and setting them to state specified in *deploy.json*. - -:::note customizing deployment -You can customize your deployment to some extent. Everything specified in `deploy/deploy.json` is considered as default and can be overridden by creating your own *deploy.json* in sub directory. -```text -pype - โ”œโ”€โ”€โ”€ pypeapp - โ”œโ”€โ”€โ”€ deploy - โ”‚ โ”œโ”€โ”€โ”€ deploy.json - โ”‚ โ”œโ”€โ”€โ”€ deploy_schema-1.0.json - โ”‚ โ”œโ”€โ”€โ”€ my_studio_override - โ”‚ โ”‚ โ”œโ”€โ”€โ”€ deploy.json - โ”‚ โ”‚ โ””โ”€โ”€โ”€ deploy_schema-1.0.json - โ”‚ ... -... -``` -In such configuration, `deploy/my_studio_override/deploy.json` will take precedence over the default one. -::: - -To validate if Pype deployment is ok, run: - -```sh -pype validate -``` - -#### Structure of `deploy.json` - -There are a few features in `deploy.json` that needs to be explained in further detail. - -Here is a list of keys used and their function: - -- `PYPE_CONFIG` - path to Pype configuration repository. -- `init_env` - these are environment files in Pype configuration repository that - are loaded immediately after Pype starts. They define basic functionality. - ```js - "init_env": ["global", "avalon", "ftrack", "deadline"] - ``` - For example, if you don't use *Deadline* but you need *Muster* support, change `deadline` to `muster`. - Pype will then load `{PYPE_CONFIG}/environments/muster.json` and set environment variables there. -- `repositories`: this is list of repositories that will be deployed to `repos/`. There are few options - for each repository: - - - `name`: name of repository will be used as directory name - - `url`: url of the git repository - - `branch` or `tag`: this specify either branch - it's *HEAD* will be checked out, or - `tag` - commit tagged with specified tag will be checked out. - -- `pip`: these are additional dependencies to be installed by *pip* to virtual environment. -- `archive_files`: archive files to be unpacked to somewhere. For example ffmpeg installation or - anything else we need to extract during deployment to some place. - - - `extract_path`: path to where this archive should be extracted - - `url` or `vendor`: this is url of source to be downloaded or name in `vendor/packages` to be Used - - `md5_url` optional url for md5 file to validate checksum of downloaded file - - `skip_first_subfolder` will move everything inside first directory in archive to `extract_path`. - -#### Offline Deployment - -In offline scenarios it is up to you to replicate what `pype deploy` does. The easiest way -to go is to run `pype deploy` on machine, get everything in `repos/` and move it to your studio install location: - -```sh -cd pype-setup -tar cvzf pype_repos.tgz repos/ -``` - -do the same for things deployed to *vendor*. diff --git a/website/docs/pype2/admin_introduction.md b/website/docs/pype2/admin_introduction.md deleted file mode 100644 index b40f35697a..0000000000 --- a/website/docs/pype2/admin_introduction.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: admin_getting_started -title: Getting Started -sidebar_label: Getting Started ---- - -## Introduction - -**Pype** is part of a larger ecosystem of tools build around [avalon](https://github.com/getavalon/core) and [pyblish](https://github.com/pyblish/pyblish-base). -To be able to use it, you need those tools and set your environment. This -requires additional software installed and set up correctly on your system. - -Fortunately this daunting task is handled for you by **Pype Setup** package itself. **Pype** can -install most of its requirements automatically but a few more things are needed in -various usage scenarios. - -## Software requirements - -- **Python 3.7+** (Locally on all workstations) -- **PowerShell 5.0+** (Windows only) -- **Bash** (Linux only) -- **MongoDB** (Centrally accessible) - -There are other requirements for different advanced scenarios. For more -complete guide please refer to [Pype Setup page](admin_install). - - -## Hardware requirements - -Pype should be installed centrally on a fast network storage with at least read access right for all workstations and users in the Studio. Full Deplyoyment with all dependencies and both Development and Production branches installed takes about 1GB of data, however to ensure smooth updates and general working comfort, we recommend allocating at least at least 4GB of storage dedicated to PYPE deployment. - -For well functioning ftrack event server, we recommend a linux virtual server with Ubuntu or Centos OS. CPU and RAM allocation need differ based on the studio size, but a 2GB of ram, with a dual core CPU and around 4GB of storage should suffice - -## Central repositories - -### Pype-setup - -Pype-Setup is the glue that binds Avalon, Pype and the Studio together. It is essentially a wrapper application that manages requirements, installation, all the environments and runs all of our standalone tools. - -It has two main interfaces. `Pype` CLI command for all admin level tasks and a `Pype Tray` application for artists. Documentation for the `Pype` command can be found [here](admin_pype_commands) - -This is also the only repository that needs to be downloaded by hand before full pype deployment can take place. - -### Pype - -Pype is our "Avalon Config" in Avalon terms that takes avalon-core and expands on it's default features and capabilities. This is where vast majority of the code that works with your data lives. - -Avalon gives us the ability to work with a certain host, say Maya, in a standardised manner, but Pype defines **how** we work with all the data. You can think of it as. Avalon by default expects each studio to have their own avalon config, which is reasonable considering all studios have slightly different requirements and workflows. We abstracted a lot of this customisability out of the avalon config by allowing pype behaviour to be altered by a set of .json based configuration files and presets. - -Thanks to that, we are able to maintain one codebase for vast majority of the features across all our clients deployments while keeping the option to tailor the pipeline to each individual studio. - -### Avalon-core - -Avalon-core is the heart and soul of Pype. It provides the base functionality including GUIs (albeit expanded modified by us), database connection and maintenance, standards for data structures and working with entities and a lot of universal tools. - -Avalon is being very actively developed and maintained by a community of studios and TDs from around the world, with Pype Club team being an active contributor as well. - -## Studio Specific Repositories - -### Pype-Config - -Pype_config repository need to be prepared and maintained for each studio using pype and holds all of their specific requiremens for pype. Those range from naming conventions and folder structures (in pype referred to as `project anatomy`), through colour management, data preferences, all the way to what individual validators they want to use and what they are validating against. - -Thanks to a very flexible and extensible system of presets, we're almost always able to accommodate client requests for modified behaviour by introducing new presets, rather than permanently altering the main codebase for everyone. - - -### Studio-Project-Configs - -On top of studio wide pype config, we support project level overrides for any and all variables and presets available in the main studio config. - -### Studio-Project-Scrips diff --git a/website/docs/pype2/admin_presets_ftrack.md b/website/docs/pype2/admin_presets_ftrack.md deleted file mode 100644 index fb3d332418..0000000000 --- a/website/docs/pype2/admin_presets_ftrack.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -id: admin_presets_ftrack -title: Presets > Ftrack -sidebar_label: Ftrack ---- - -## PROJECT_DEFAULTS.json - -path: `pype-config/presets/ftrack/project_defauls.json` - -A list of all project defaults to be set when you run "Ftrack Prepare Project" - -```json -{ - "fps": 25, - "frameStart": 1001, - "frameEnd": 1100, - "clipIn": 1001, - "clipOut": 1100, - "handleStart": 10, - "handleEnd": 10, - - "resolutionHeight": 1080, - "resolutionWidth": 1920, - "pixelAspect": 1.0, - "applications": [ - "maya_2019", "nuke_11.3", "nukex_11.3", "nukestudio_11.3", "deadline" - ], - "tools_env": [], - "avalon_auto_sync": true -} -``` - -## FTRACK_CONFIG.json - -path: `pype-config/presets/ftrack/ftrack_config.json` - -### `sync_to_avalon` [dict] - -list of statuses that allow moving, deleting and changing of names on ftrack entities. Once any child of and entity is set to a status different than those listed in this list, it is considered to have been worked on and will not allow any major changes to hierarchy any more. - -`statuses_name_change [list]`: - -```json -{ - "sync_to_avalon": { - "statuses_name_change": ["not ready", "ready"] - } -} -``` - -### `status_update` [dict] - -mapping of status for automatic updates. -Key specifies the resulting status and value is a list of statuses from which we allow changing to the target status. - -`_ignore_` [list]: source statuses to ignore - -`target_status` [list]: target - -```json -{ - "status_update": { - "_ignore_": ["in progress", "omitted", "on hold"], - "Ready": ["not ready"], - "In Progress" : ["_any_"] - } -} -``` - -### `status_version_to_task` [dict] - -mapping of status that propagate automatically from published version to it's task. By default we search for identical status, however this preset let's you remap between different statuses on versions and tasks. - - -`status_version_to_task` [dict]: - -```json -{ - "status_version_to_task": { - "__description__": "Status `from` (key) must be lowered!", - "in progress": "in progress", - "approved": "approved" - } -} -``` - -## SERVER.json - -path: `pype-config/presets/ftrack/server.json` - -### `first_version_status` [dict] - -`task_status_map` [list]: List of dictionaires specifying individual mappings - -`status` [string]: status to set if `key` and `name` match. - -`name` [string]: name of task or task's type. - -`key` [enumerator]: _optional_ specify where to look for name. There are two possible value: - 1. `task`: task's name (default) - 2. `task_type`: task type's name - -It doesn't matter if values are lowered or capitalized. - -```json -{ - "FirstVersionStatus": { - "task_status_map": [{ - "key": "task", - "name": "compositing", - "status": "Blocking" - }, { - "MORE ITEMS...": "MORE VALUES..." - }] - }, - "...": "{...}" -} -``` diff --git a/website/docs/pype2/admin_presets_maya.md b/website/docs/pype2/admin_presets_maya.md deleted file mode 100644 index 52717873d2..0000000000 --- a/website/docs/pype2/admin_presets_maya.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -id: admin_presets_maya -title: Presets > Maya -sidebar_label: Maya ---- - -## CAPTURE.json - -path: `pype-config/presets/maya/capture.json` - -All the viewport settings for maya playblasts. - -### `Codec` [dict] ### - -```python - "Codec": { - "compression": "jpg", - "format": "image", - "quality": 95 - } -``` - - -### `Display Options` [dict] ### - -```python -"Display Options": { - "background": [ - 0.7137254901960784, - 0.7137254901960784, - 0.7137254901960784 - ], - "backgroundBottom": [ - 0.7137254901960784, - 0.7137254901960784, - 0.7137254901960784 - ], - "backgroundTop": [ - 0.7137254901960784, - 0.7137254901960784, - 0.7137254901960784 - ], - "override_display": true - } -``` - -### `Generic` [dict] ### -```python -"Generic": { - "isolate_view": true, - "off_screen": true -}, -``` - -### `IO` [dict] ### - -```python -"IO": { - "name": "", - "open_finished": false, - "raw_frame_numbers": false, - "recent_playblasts": [], - "save_file": false -}, -``` - -### `PanZoom` [dict] ### - -```python -"PanZoom": { - "pan_zoom": true -}, -``` - -### `Viewport Options` [dict] ### - -```python -"Viewport Options": { - "cameras": false, - "clipGhosts": false, - "controlVertices": false, - "deformers": false, - "dimensions": false, - "displayLights": 0, - "dynamicConstraints": false, - "dynamics": false, - "fluids": false, - "follicles": false, - "gpuCacheDisplayFilter": false, - "greasePencils": false, - "grid": false, - "hairSystems": false, - "handles": false, - "high_quality": true, - "hud": false, - "hulls": false, - "ikHandles": false, - "imagePlane": false, - "joints": false, - "lights": false, - "locators": false, - "manipulators": false, - "motionTrails": false, - "nCloths": false, - "nParticles": false, - "nRigids": false, - "nurbsCurves": false, - "nurbsSurfaces": false, - "override_viewport_options": true, - "particleInstancers": false, - "pivots": false, - "planes": false, - "pluginShapes": false, - "polymeshes": true, - "shadows": false, - "strokes": false, - "subdivSurfaces": false, - "textures": false, - "twoSidedLighting": true -} -``` - -## Maya instance scene types - -It is possible to set when to use `.ma` or `.mb` for: - -- camera -- setdress -- layout -- model -- rig -- yetiRig - -Just put `ext_mapping.json` into `presets/maya`. Inside is simple mapping: - -```JSON -{ - "rig": "mb", - "camera": "mb" -} -``` - -*Note that default type is `ma`* diff --git a/website/docs/pype2/admin_presets_nukestudio.md b/website/docs/pype2/admin_presets_nukestudio.md deleted file mode 100644 index 63ea709880..0000000000 --- a/website/docs/pype2/admin_presets_nukestudio.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -id: admin_presets_nukestudio -title: Presets > NukeStudio -sidebar_label: Nukestudio ---- - -## TAGS.json - -path: `pype-config/presets/nukestudio/tags.json` - -Each tag defines defaults in `.json` file. Inside of the file you can change the default values as shown in the example (`>>>"1001"<<<`). Please be careful not to alter the `family` value. - -```python -"Frame start": { - "editable": "1", - "note": "Starting frame for comps", - "icon": { - "path": "icons:TagBackground.png" - }, - "metadata": { - "family": "frameStart", - "number": >>>"1001"<<< - } -} -``` - -## PUBLISH.json - -path: `pype-config/presets/plugins/nukestudio/publish.json` - -### `CollectInstanceVersion` [dict] ### - - -This plugin is set to `true` by default so it will synchronize version of published instances with the version of the workfile. Set `enabled` to `false` if you wish to let publishing process decide on the next available version. - -```python -{ - "CollectInstanceVersion": { - "enabled": false - } -} -``` - -### `ExtractReviewCutUpVideo` [dict] ### - -path: `pype-config/presets/plugins/nukestudio/publish.json` - -Plugin is responsible for cuting shorter or longer source material for review. Here you can add any additional tags you wish to be added into extract review process. - -The plugin generates reedited intermediate video with handless even if it has to add empty black frames. Some productions prefer to use review material without handless so in the example, `no-handles` are added as tags. This allow further review extractor to publish review without handles, without affecting other outputs. - -```python -{ - "ExtractReviewCutUpVideo": { - "tags_addition": ["no-handles"] - } -} -``` diff --git a/website/docs/pype2/admin_presets_plugins.md b/website/docs/pype2/admin_presets_plugins.md deleted file mode 100644 index b5e8a3b8a8..0000000000 --- a/website/docs/pype2/admin_presets_plugins.md +++ /dev/null @@ -1,594 +0,0 @@ ---- -id: admin_presets_plugins -title: Presets > Plugins -sidebar_label: Plugins ---- - -## Global - -### publish.json - -Each plugin in the json should be added as name of the class. There are some default attributes recommended to use in case you wish a plugin to be switched off for some projects in `project overwrites` like `enabled: false`. So for example if you wish to switch off plugin class name `PluginName(pyblish.api.contextPlugin)` if file `name_of_plugin_file.py`, it could be done only by adding following text into root level of publish.json file: - -```json -{ - "PluginName": { - "enabled": false - } -} -``` - - -### `ExtractReview` - -Plugin responsible for automatic FFmpeg conversion to variety of formats. - -Supported extensions for both input and output: `["exr", "jpg", "jpeg", "png", "dpx", "mov", "mp4"]` - -**ExtractReview** creates new representations based on presets and representations in instance. Preset should contain only one attribute **"profiles"** which is list of profile items. Each profile item has **outputs**, where definitions of possible outputs are, and may have specified filters for **hosts**, **tasks** and **families**. - -#### Profile filters -As mentioned above you can define multiple profiles for different contexts. Profile with filters matching current context the most is used. You can define profile without filters and use it as **default**. Only **one or none** profile is processed per instance. - -All context filters are lists which may contain strings or Regular expressions (RegEx). -- **hosts** - Host from which publishing was triggered. `["maya", "nuke"]` -- **tasks** - Currently processed task. `["[Cc]ompositing", "[Aa]nimation"]` -- **families** - Main family of processed instance. `["plate", "model"]` - -:::important Filtering -Filters are optional and may not be set. In case when multiple profiles match current context, profile with filters has higher priority than profile without filters. -::: - -#### Profile outputs -Profile may have multiple outputs from one input and that's why **outputs** is dictionary where key represents **filename suffix** to avoid overriding files with same name and value represents definition itself. Definition may contain multiple optional keys. - -| Key | Description | Type | Example | -| --- | --- | --- | --- | -| **width** | Width of output. | int | 1920 | -| **height** | Height of output. | int | 1080 | -| **letter_box** | Set letterbox ratio. | float | 2.35 | -| **ext** | Extension of output file(s). | str | "mov" | -| **tags** | Tags added to new representation. | list | [here](#new-representation-tags-tags) | -| **ffmpeg_args** | Additional FFmpeg arguments. | dict | [here](#ffmpeg-arguments-ffmpeg_args) | -| **filter** | Filters definition. | dict | [here](#output-filters-filter) | - -:::note -As mentioned above **all keys are optional**. If they are not filled at all, then **"ext"** is filled with input's file extension and resolution keys **"width"** and **"height"** are filled from instance data, or from input resolution if instance doesn't have set them. -::: - -:::important resolution -It is not possible to enter only **"width"** or only **"height"**. In that case set values will be skipped. -::: - -#### New representation tags (`tags`) -You can add tags to representation created during extracting process. This might help to define what should happen with representation in upcoming plugins. - -| Tag | Description | -| --- | --- | -| **burnin** | Add burnins with predefined values into the output. | -| **preview** | Will be used as preview in Ftrack. | -| **reformat** | Rescale to format based on width and height keys. | -| **bake-lut** | Bake LUT into the output (if is available path in data). | -| **slate-frame** | Add slate frame at the beginning of video. | -| **no-handles** | Remove the shot handles from the output. | -| **sequence** | Generate a sequence of images instead of single frame.
Is applied only if **"ext"** of output is image extension e.g.: png or jpg/jpeg. | - -:::important Example -Tags key must contain list of strings. -```json -{ - "tags": ["burnin", "preview"] - ... -} -``` -::: - -#### FFmpeg arguments (`ffmpeg_args`) -It is possible to set additional FFmpeg arguments. Arguments are split into 4 categories **"input"**, **"video_filters"**, **"audio_filters"** and **"output"**. - -| Key | Description | Type | Example | -| --- | --- | --- | --- | -| **input** | FFmpeg arguments added before video/image input. | list | ["-gamma 2.2"] | -| **video_filters** | All values which should be in `-vf` or `-filter:v` argument. | list | ["scale=iw/2:-1"] | -| **audio_filters** | All values which should be in `-af` or `-filter:a` argument. | list | ["loudnorm"] | -| **output** | FFmpeg arguments added before output filepath. | list | ["-pix_fmt yuv420p", "-crf 18"] | - -:::important Example -For more information about FFmpeg arguments please visit [official documentation](https://ffmpeg.org/documentation.html). -```json -{ - "ffmpeg_args": { - "input": ["-gamma 2.2"], - "video_filters": ["yadif=0:0:0", "scale=iw/2:-1"], - "output": ["-pix_fmt yuv420p", "-crf 18"] - } - ... -} -``` -::: - -#### Output filters (`filter`) -Even if profile has filtering options it is possible that output definitions require to be filtered by all instance **families** or representation's **tags**. - -Families filters in output's `filter` will check all instance's families and may check for single family or combination of families. - -| Key | Description | Type | Example | -| --- | --- | --- | --- | -| **families** | At least one family item must match instance's families to process definition. | list | ["review"] | -| **tags** | At least one tag from list must be in representation's tags to process definition. | list | ["preview"] | - -:::important Example -These filters helps with explicit processing but do **NOT** use them if it's not necessary. -```json -{ - "filter": { - "families": [ - "review", - ["ftrack", "render2d"] - ], - "tags": ["preview"], - } - ... -} -``` -In this example representation's tags must contain **"preview"** tag and instance's families must contain **"review"** family, or both **"ftrack"** and **"render2d"** families. -::: - -#### Simple example -This example just create **mov** output with filename suffix **"simplemov"** for all representations with supported extensions. -```json -{ - "ExtractReview": { - "profiles": [{ - "outputs": { - /* Filename suffix "simplemov"*/ - "simplemov": { - /* Output extension will be "mov"*/ - "ext": "mov" - } - } - }] - } -} -``` - -#### More complex example -:::note -This is just usage example, without relevant data. Do **NOT** use these presets as default in production. -::: - -```json -{ - "ExtractReview": { - "profiles": [ - { - /* 1. profile - Without filters will be used as default. */ - "outputs": { - /* Extract single mov Prores 422 with burnins, slate and baked lut. */ - "prores": { - "ext": "mov", - "codec": [ - "-codec:v prores_ks", - "-profile:v 3" - ], - "tags": ["burnin", "reformat", "bake-lut", "slate-frame"] - } - } - }, { - /* 2. profile - Only for Nuke, "compositing" task and instance family "render2d". */ - "hosts": ["nuke"], - "tasks": ["compositing"], - "families": ["render2d"], - "outputs": { - /* Extract preview mov with burnins and without handles.*/ - "h264": { - "ext": "mov", - "ffmpeg_args": { - "output": [ - "-pix_fmt yuv420p", - ] - }, - "tags": ["burnin", "preview", "no-handles"] - }, - /* Also extract mxf with slate */ - "edit": { - "ext": "mxf", - "ffmpeg_args": { - "output": [ - "-codec:v dnxhd", - "-profile:v dnxhr_444", - "-pix_fmt yuv444p10le", - "-b:v 185M", - "-ar 48000", - "-qmax 51" - ] - }, - "tags": ["slate-frame"] - } - } - }, { - /* 3. profile - Default profile for Nuke and Maya. */ - "hosts": ["maya", "nuke"], - "outputs": { - /* Extract preview mov with burnins and with forced resolution. */ - "h264": { - "width": 1920, - "height": 1080, - "ext": "mov", - "ffmpeg_args": { - "input": [ - "-gamma 2.2" - ], - "output": [ - "-pix_fmt yuv420p", - "-crf 18", - "-intra" - ] - }, - "tags": ["burnin", "preview"] - } - } - } - ] - } -} -``` - - -### `ExtractBurnin` - -Plugin is responsible for adding burnins into review representations. - -Burnins are text values painted on top of input and may be surrounded with box in 6 available positions `Top Left`, `Top Center`, `Top Right`, `Bottom Left`, `Bottom Center`, `Bottom Right`. - -![presets_plugins_extract_burnin](../assets/presets_plugins_extract_burnin_01.png) - -ExtractBurnin creates new representations based on plugin presets and representations in instance. Presets may contain 3 keys **options**, **profiles** and **fields**. - -#### Burnin settings (`options`) -Options is dictionary where you can set the global appearance of burnins. It is possible to not fill options at all, in that case default values are used. - -| Key | Description | Type | Example | Default | -| --- | --- | --- | --- | --- | -| **font_size** | Size of text. | float | 24 | 42 | -| **font_color** | Color of text. | str | [FFmpeg color documentation](https://ffmpeg.org/ffmpeg-utils.html#color-syntax) | "white" | -| **opacity** | Opacity of text. | float | 0.7 | 1 | -| **x_offset** | Horizontal margin around text and box. | int | 0 | 5 | -| **y_offset** | Vertical margin around text and box. | int | 0 | 5 | -| **bg_padding** | Padding for box around text. | int | 0 | 5 | -| **bg_color** | Color of box around text. | str | [FFmpeg color documentation](https://ffmpeg.org/ffmpeg-utils.html#color-syntax) | "black" | -| **bg_opacity** | Opacity of box around text. | float | 1 | 0.5 | - -#### Burnin profiles (`profiles`) -Plugin process is skipped if `profiles` are not set at all. Profiles contain list of profile items. Each profile item has **burnins**, where definitions of possible burnins are, and may have specified filters for **hosts**, **tasks** and **families**. Filters work the same way as described in [ExtractReview](#profile-filters). - -#### Profile burnins -Profile may have set multiple burnin outputs from one input and that's why **burnins** is dictionary where key represents **filename suffix** to avoid overriding files with same name and value represents burnin definition. Burnin definition may contain multiple optional keys. - -| Key | Description | Type | Example | -| --- | --- | --- | --- | -| **top_left** | Top left corner content. | str | "{dd}.{mm}.{yyyy}" | -| **top_centered** | Top center content. | str | "v{version:0>3}" | -| **top_right** | Top right corner content. | str | "Static text" | -| **bottom_left** | Bottom left corner content. | str | "{asset}" | -| **bottom_centered** | Bottom center content. | str | "{username}" | -| **bottom_right** | Bottom right corner content. | str | "{frame_start}-{current_frame}-{frame_end}" | -| **options** | Options overrides for this burnin definition. | dict | [Options](#burnin-settings-options) | -| **filter** | Filters definition. | dict | [ExtractReview output filter](#output-filters-filter) | - -:::important Position keys -Any position key `top_left` -> `bottom_right` is skipped if is not set, contain empty string or is set to `null`. -And position keys are not case sensitive so instead of key `top_left` can be used `TOP_LEFT` or `Top_Left` -::: - -:::note Filename suffix -Filename suffix is appended to filename suffix of source representation. -If source representation has suffix **"h264"** and burnin suffix is **"client"** then final suffix is **"h264_client"**. -::: - -**Available keys in burnin content** - -- It is possible to use same keys as in [Anatomy](admin_config#available-keys). - -- It is allowed to use [Anatomy templates](admin_config#anatomy) themselves in burnins if they can be filled with available data. - -- Additional keys in burnins: - - | Burnin key | Description | - | --- | --- | - | frame_start | First frame number. | - | frame_end | Last frame number. | - | current_frame | Frame number for each frame. | - | duration | Count number of frames. | - | resolution_width | Resolution width. | - | resolution_height | Resolution height. | - | fps | Fps of an output. | - | timecode | Timecode by frame start and fps. | - | focalLength | **Only available in Maya and Houdini**

Camera focal length per frame. Use syntax `{focalLength:.2f}` for decimal truncating. Eg. `35.234985` with `{focalLength:.2f}` would produce `35.23`, whereas `{focalLength:.0f}` would produce `35`. | - -:::warning -`timecode` is specific key that can be **only at the end of content**. (`"BOTTOM_RIGHT": "TC: {timecode}"`) -::: - -```json -{ - "profiles": [{ - "burnins": { - "example": { - "TOP_LEFT": "{dd}.{mm}.{yyyy}", - /* Use anatomy template values. */ - "TOP_CENTERED": "{anatomy[publish][path]}", - /* Python's formatting: - ":0>3" adds padding to version number to have 3 digits. */ - "TOP_RIGHT": "v{version:0>3}", - "BOTTOM_LEFT": "{frame_start}-{current_frame}-{frame_end}", - "BOTTOM_CENTERED": "{asset}", - "BOTTOM_RIGHT": "{username}" - } - } - }] - ... -} -``` - - -#### Default content values (`fields`) -If you want to set position content values for all or most of burnin definitions, you can set them in **"fields"**. They will be added to every burnin definition in all profiles. Value can be overridden if same position key is filled in burnin definition. - -```json -{ - "fields": { - "TOP_LEFT": "{yy}-{mm}-{dd}", - "TOP_CENTERED": "{username}", - "TOP_RIGHT": "v{version:0>3}" - }, - "profiles": [{ - "burnins": { - /* example1 has empty definition but top left, center and right values - will be filled. */ - "example1": {}, - - /* example2 has 2 overrides. */ - "example2": { - /* Top left value is overridden with asset name. */ - "TOP_LEFT": "{asset}", - /* Top center will be skipped. */ - "TOP_CENTERED": null - } - } - }] -} -``` - -#### Full presets example -:::note -This is just usage example, without relevant data. Do **NOT** use these presets as default in production. -::: - -```json -{ - "ExtractBurnin": { - "options": { - "opacity": 1, - "x_offset": 5, - "y_offset": 5, - "bg_padding": 5, - "bg_opacity": 0.5, - "font_size": 42 - }, - "fields": { - "TOP_LEFT": "{yy}-{mm}-{dd}", - "TOP_RIGHT": "v{version:0>3}" - }, - "profiles": [{ - "burnins": { - "burnin": { - "options": { - "opacity": 1 - }, - "TOP_LEFT": "{username}" - } - } - }, { - "families": ["animation", "pointcache", "model"], - "tasks": ["animation"], - "burnins": {} - }, { - "families": ["render"], - "tasks": ["compositing"], - "burnins": { - "burnin": { - "TOP_LEFT": "{yy}-{mm}-{dd}", - "TOP_RIGHT": "v{version:0>3}", - "BOTTOM_RIGHT": "{frame_start}-{current_frame}-{frame_end}", - "BOTTOM_LEFT": "{username}" - }, - "burnin_ftrack": { - "filter": { - "families": ["ftrack"] - }, - "BOTTOM_RIGHT": "{frame_start}-{current_frame}-{frame_end}", - "BOTTOM_LEFT": "{username}" - }, - "burnin_v2": { - "options": { - "opacity": 0.5 - }, - "TOP_LEFT": "{yy}-{mm}-{dd}", - "TOP_RIGHT": "v{version:0>3}" - } - } - }, { - "families": ["rendersetup"], - "burnins": { - "burnin": { - "TOP_LEFT": "{yy}-{mm}-{dd}", - "BOTTOM_LEFT": "{username}" - } - } - }, { - "tasks": ["animation"], - "burnins": { - "burnin": { - "TOP_RIGHT": "v{version:0>3}", - "BOTTOM_RIGHT": "{frame_start}-{current_frame}-{frame_end}" - } - } - }] - } -} -``` - -### `ProcessSubmittedJobOnFarm` - -```json -{ - "ProcessSubmittedJobOnFarm": { - "aov_filter": { - "host": ["aov_name"], - "maya": ["beauty"] - }, - "deadline_pool": "" - } -} -``` - -## Maya - -### load.json - -### `colors` - -maya outliner colours for various families - -```python -"colors": { - "model": [0.821, 0.518, 0.117], - "rig": [0.144, 0.443, 0.463], - "pointcache": [0.368, 0.821, 0.117], - "animation": [0.368, 0.821, 0.117], - "ass": [1.0, 0.332, 0.312], - "camera": [0.447, 0.312, 1.0], - "fbx": [1.0, 0.931, 0.312], - "mayaAscii": [0.312, 1.0, 0.747], - "mayaScene": [0.312, 1.0, 0.747], - "setdress": [0.312, 1.0, 0.747], - "layout": [0.312, 1.0, 0.747], - "vdbcache": [0.312, 1.0, 0.428], - "vrayproxy": [0.258, 0.95, 0.541], - "yeticache": [0.2, 0.8, 0.3], - "yetiRig": [0, 0.8, 0.5] -} -``` - -### publish.json - -### `ValidateModelName` - -```python -"ValidateModelName": { - "enabled": false, - "material_file": "/path/to/shader_name_definition.txt", - "regex": "(.*)_(\\d)*_(?P.*)_(GEO)" -}, -``` - -### `ValidateShaderName` - -```python -"ValidateShaderName": { - "enabled": false, - "regex": "(?P.*)_(.*)_SHD" -} -``` - -## Nuke - -### create.json - -### `CreateWriteRender` - -```python -"CreateWriteRender": { - "fpath_template": "{work}/renders/nuke/{subset}/{subset}.{frame}.{ext}" -} -``` - -### publish.json - -### `ExtractThumbnail` - -Plugin responsible for generating thumbnails with colorspace controlled by Nuke. Reformat node will secure proper framing within the default workfile screen space. - -```json -{ -"nodes": { - "Reformat": [ - ["type", "to format"], - ["format", "HD_1080"], - ["filter", "Lanczos6"], - ["black_outside", true], - ["pbb", false] - ] -} -} -``` - -### `ExtractReviewIntermediates` -`viewer_lut_raw` **true** will publish the baked mov file without any colorspace conversion. It will be baked with the workfile workspace. This can happen in case the Viewer input process uses baked screen space luts. - -#### baking with controlled colorspace - -Some productions might be using custom OCIO config files either for whole project, sequence or even individual shots. In that case we can use **display roles** to let compositors use their preferred viewer space, but also make sure baking of outputs is happening in a defined space for clients reviews. - - -`bake_colorspace_fallback` this will be used if for some reason no space defined in `shot_grade_rec709` is found on shot's _config.ocio_ - -> be aware this will only work if `viewer_lut_raw` is on _false_ - -```json -{ -"viewer_lut_raw": false, -"bake_colorspace_fallback": "show_lut_rec709", -"bake_colorspace_main": "shot_grade_rec709" -} -``` - -## NukeStudio - -### Publish.json - -Destination of the following example codes: - -[`presets/plugins/nukestudio/publish.json`](https://github.com/pypeclub/pype-config/blob/develop/presets/plugins/nukestudio/publish.json) - -### `CollectInstanceVersion` - -Activate this plugin if you want your published plates to always have the same version as the hiero project they were published from. If this plugin is off, plate versioning automatically finds the next available version in the database. - -```json -{ - "CollectInstanceVersion": { - "enabled": true - } -} -``` - -### `ExtractReviewCutUpVideo` - -Example of tag which could be added into the plugin preset. -In this case because we might have 4K plates but we would like to publish all review files reformated to 2K. - -[details of available tags](#preset-attributes) - -```json -{ - "ExtractReviewCutUpVideo": { - "tags_addition": ["reformat"] - } -} -``` - -## Standalone Publisher - -Documentation yet to come. diff --git a/website/docs/pype2/admin_presets_tools.md b/website/docs/pype2/admin_presets_tools.md deleted file mode 100644 index 15d9d6a65a..0000000000 --- a/website/docs/pype2/admin_presets_tools.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -id: admin_presets_tools -title: Presets > Tools -sidebar_label: Tools ---- - -## Colorspace - -We provide two examples of possible settings for nuke, but these can vary wildly between clients and projects. - -### `Default` [dict] - -path: `pype-config/presets/colorspace/default.json` - -```python -"nuke": { - "root": { - "colorManagement": "Nuke", - "OCIO_config": "nuke-default", - "defaultViewerLUT": "Nuke Root LUTs", - "monitorLut": "sRGB", - "int8Lut": "sRGB", - "int16Lut": "sRGB", - "logLut": "Cineon", - "floatLut": "linear" - }, - "viewer": { - "viewerProcess": "sRGB" - }, - "write": { - "render": { - "colorspace": "linear" - }, - "prerender": { - "colorspace": "linear" - }, - "still": { - "colorspace": "sRGB" - } - } -}, -``` - -### `aces103-cg` [dict] - - -path: `pype-config/presets/colorspace/aces103-cg.json` - -```python -"nuke": { - "root": { - "colorManagement": "OCIO", - "OCIO_config": "aces_1.0.3", - "workingSpaceLUT": "ACES - ACEScg", - "defaultViewerLUT": "OCIO LUTs", - "monitorLut": "ACES/sRGB D60 sim.", - "int8Lut": "Utility - sRGB - Texture", - "int16Lut": "Utility - sRGB - Texture", - "logLut": "Input - ARRI - V3 LogC (EI800) - Wide Gamut", - "floatLut": "ACES - ACES2065-1" - }, - "viewer": { - "viewerProcess": "sRGB D60 sim. (ACES)" - }, - "write": { - "render": { - "colorspace": "ACES - ACEScg" - }, - "prerender": { - "colorspace": "ACES - ACEScg" - }, - "still": { - "colorspace": "Utility - Curve - sRGB" - } - } -}, -``` - - -## Creator Defaults - -path: `pype-config/presets/tools/creator.json` - -This preset tells the creator tools what family should be pre-selected in different tasks. Keep in mind that the task is matched loosely so for example any task with 'model' in it's name will be considered a modelling task for these purposes. - -`"Family name": ["list, "of, "tasks"]` - -```python -"Model": ["model"], -"Render Globals": ["light", "render"], -"Layout": ["layout"], -"Set Dress": ["setdress"], -"Look": ["look"], -"Rig": ["rigging"] -``` - -## Project Folder Structure - -path: `pype-config/presets/tools/project_folder_structure.json` - -Defines the base folder structure for a project. This is supposed to act as a starting point to quickly create the base of the project. You can add `[ftrack.entityType]` after any of the folders here and they will automatically be also created in ftrack project. - -### `__project_root__` [dict] - -```python -"__project_root__": { - "_prod" : {}, - "_resources" : { - "footage": { - "ingest": {}, - "offline": {} - }, - "audio": {}, - "art_dept": {}, - }, - "editorial" : {}, - "assets[ftrack.Library]": { - "characters[ftrack]": {}, - "locations[ftrack]": {} - }, - "shots[ftrack.Sequence]": { - "editorial[ftrack.Folder]": {} - } -} -``` - -## Software Folders - -path: `pype-config/presets/tools/sw_folders.json` - -Defines extra folders to be created inside the work space when particular task type is launched. Mostly used for configs, that use {app} key in their work template and want to add hosts that are not supported yet. - -```python -"compositing": ["nuke", "ae"], -"modeling": ["maya", "app2"], -"lookdev": ["substance"], -"animation": [], -"lighting": [], -"rigging": [] -``` - -## Tray Items - -path: `pype-config/presets/tray/menu_items.json` - -This preset let's admins to turn different pype modules on and off from the tray menu, which in turn makes them unavailable across the pipeline - -### `item_usage` [dict] - -```python -"item_usage": { - "User settings": false, - "Ftrack": true, - "Muster": false, - "Avalon": true, - "Clockify": false, - "Standalone Publish": true, - "Logging": true, - "Idle Manager": true, - "Timers Manager": true, - "Rest Api": true -}, -``` - -## Muster Templates - -path: `pype-config/presets/muster/templates_mapping.json` - -Muster template mapping maps Muster template ID to name of renderer. Initially it is set Muster defaults. About templates and Muster se Muster Documentation. Mapping is defined in: - -Keys are renderer names and values are templates IDs. - -```python -"3delight": 41, -"arnold": 46, -"arnold_sf": 57, -"gelato": 30, -"hardware": 3, -"krakatoa": 51, -"file_layers": 7, -"mentalray": 2, -"mentalray_sf": 6, -"redshift": 55, -"renderman": 29, -"software": 1, -"software_sf": 5, -"turtle": 10, -"vector": 4, -"vray": 37, -"ffmpeg": 48 -``` diff --git a/website/docs/pype2/admin_pype_commands.md b/website/docs/pype2/admin_pype_commands.md deleted file mode 100644 index 6267138f79..0000000000 --- a/website/docs/pype2/admin_pype_commands.md +++ /dev/null @@ -1,287 +0,0 @@ ---- -id: admin_pype_commands -title: Pype Commands Reference -sidebar_label: Pype Commands ---- - - - -## Help - -To get all available commands: -```sh -pype --help -``` - -To get help on particular command: -```sh -pype --help -``` - --------------------- -## `clean` - -Command to clean Python bytecode files from Pype and it's environment. Useful -for developers after code or environment update. - --------------------- - -## `coverage` - -### `--pype` -- without this option, tests are run on *pype-setup* only. - -Generate code coverage report. -```sh -pype coverage --pype -``` - --------------------- - -## `deploy` - -To deploy Pype: -```sh -pype deploy -``` - -### `--force` - -To force re-deploy: -```sh -pype deploy --force -``` - ---------------------------- - -## `download` - -To download required dependencies: -```sh -pype download -``` - --------------------- - -## `eventserver` - -This command launches ftrack event server. - -This should be ideally used by system service (such us systemd or upstart -on linux and window service). - -You have to set either proper environment variables to provide URL and -credentials or use option to specify them. If you use `--store_credentials` -provided credentials will be stored for later use. - -To run ftrack event server: -```sh -pype eventserver --ftrack-url= --ftrack-user= --ftrack-api-key= --ftrack-events-path= --no-stored-credentials --store-credentials -``` - -### `--debug` -- print debug info - -### `--ftrack-url` -- URL to ftrack server - -### `--ftrack-user` -- user name to log in to ftrack - -### `--ftrack-api-key` -- ftrack api key - -### `--ftrack-events-path` -- path to event server plugins - -### `--no-stored-credentials` -- will use credential specified with options above - -### `--store-credentials` -- will store credentials to file for later use - --------------------- - -## `install` - -To install Pype: - -```sh -pype install -``` - -### `--force` - -To reinstall Pype: -```sh -pype install --force -``` - -### `--offline` - -To install Pype in offline mode: -```sh -pype install --offline -``` - -To reinstall Pype in offline mode: -```sh -pype install --offline --force -``` - --------------------- - -## `launch` - -Launch application in Pype environment. - -### `--app` - -Application name - this should be the same as it's [defining toml](admin_hosts#launchers) file (without .toml) - -### `--project` -Project name - -### `--asset` -Asset name - -### `--task` -Task name - -### `--tools` -*Optional: Additional tools environment files to add* - -### `--user` -*Optional: User on behalf to run* - -### `--ftrack-server` / `-fs` -*Optional: Ftrack server URL* - -### `--ftrack-user` / `-fu` -*Optional: Ftrack user* - -### `--ftrack-key` / `-fk` -*Optional: Ftrack API key* - -For example to run Python interactive console in Pype context: -```sh -pype launch --app python --project my_project --asset my_asset --task my_task -``` - --------------------- - -## `make_docs` - -Generate API documentation into `docs/build` -```sh -pype make_docs -``` - --------------------- - -## `mongodb` - -To run testing mongodb database (requires mongoDB installed on the workstation): -```sh -pype mongodb -``` - --------------------- - -## `publish` - -Pype takes JSON from provided path and use it to publish data in it. -```sh -pype publish -``` - -### `--gui` -- run Pyblish GUI - -### `--debug` -- print more verbose information - --------------------- - -## `test` - -### `--pype` -- without this option, tests are run on *pype-setup* only. - -Run test suite on Pype: -```sh -pype test --pype -``` -:::note Pytest -For more information about testing see [Pytest documentation](https://docs.pytest.org/en/latest/) -::: - --------------------- - -## `texturecopy` - -Copy specified textures to provided asset path. - -It validates if project and asset exists. Then it will -copy all textures found in all directories under `--path` to destination -folder, determined by template texture in **anatomy**. I will use source -filename and automatically rise version number on directory. - -Result will be copied without directory structure so it will be flat then. -Nothing is written to database. - -### `--project` - -### `--asset` - -### `--path` - -```sh -pype texturecopy --project --asset --path -``` - --------------------- - -## `tray` - -To launch Tray: -```sh -pype tray -``` - -### `--debug` - -To launch Tray with debugging information: -```sh -pype tray --debug -``` - --------------------- - -## `update-requirements` - -Synchronize dependencies in your virtual environment with requirement.txt file. -Equivalent of running `pip freeze > pypeapp/requirements.txt` from your virtual -environment. This is useful for development purposes. - -```sh -pype update-requirements -``` - --------------------- - -## `validate` - -To validate deployment: -```sh -pype validate -``` - --------------------- - -## `validate-config` - -To validate JSON configuration files for syntax errors: -```sh -pype validate-config -``` diff --git a/website/docs/pype2/admin_setup_troubleshooting.md b/website/docs/pype2/admin_setup_troubleshooting.md deleted file mode 100644 index 7143405ae1..0000000000 --- a/website/docs/pype2/admin_setup_troubleshooting.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: admin_setup_troubleshooting -title: Setup Troubleshooting -sidebar_label: Setup Troubleshooting ---- - -## SSL Server certificates - -Python is strict about certificates when connecting to server with SSL. If -certificate cannot be validated, connection will fail. Therefore care must be -taken when using self-signed certificates to add their certification authority -to trusted certificates. - -Also please note that even when using certificates from trusted CA, you need to -update your trusted CA certificates bundle as those certificates can change. - -So if you receive SSL error `cannot validate certificate` or similar, please update root CA certificate bundle on machines and possibly **certifi** python package in Pype virtual environment - just edit `pypeapp/requirements.txt` and update its version. You can find current versions on [PyPI](https://pypi.org). diff --git a/website/docs/system_introduction.md b/website/docs/system_introduction.md deleted file mode 100644 index d64b023704..0000000000 --- a/website/docs/system_introduction.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: system_introduction -title: Introduction -sidebar_label: Introduction ---- - - -**OpenPype** is a python application built on top of many other open-source libraries, modules and projects. -To be able to use it, you need those tools and set your environment. This -requires additional software installed and set up correctly on your system. - -Fortunately this daunting task is mostly handled for you by OpenPype build and install scripts. **OpenPype** can -install most of its requirements automatically but a few more things are needed in -various usage scenarios. - -## Studio Preparation - -You can find a detailed breakdown of technical requirements [here](dev_requirements), but in general OpenPype should be able -to operate in most studios fairly quickly. The main obstacles are usually related to workflows and habits, that -might not be fully compatible with what OpenPype is expecting or enforcing. It is recommended to go through artists [key concepts](artist_concepts) to get comfortable with the basics. - -Keep in mind that if you run into any workflows that are not supported, it's usually just because we haven't hit -that particular case and it can most likely be added upon request. - - -## Artist Workstations - -To use **OpenPype** in production, it should be installed on each artist workstation, whether that is in the studio or at home in -case of a distributed workflow. Once started, it lives in the system tray menu bar and all of it's tools are executed locally on -the artist computer. There are no special requirements for the artist workstations if you are running openPype from a frozen build. - -Each artist computer will need to be able to connect to your central mongo database to load and publish any work. They will also need -access to your centralized project storage, unless you are running a fully distributed pipeline. - -## Centralized and Distributed? - -OpenPype supports a variety of studio setups, for example: - -- Single physical location with monolithic project storage. -- Fully remote studios, utilizing artist's home workstations. -- Distributed studios, running fully or partially on the cloud. -- Hybrid setups with different storages per project. -- And others that we probably didn't think of at all. - -It is totally up to you how you deploy and distribute OpenPype to your artist, but there are a few things to keep in mind: -- While it is possible to store project files in different locations for different artist, it bring a lot of extra complexity -to the table -- Some DCCs do not support using Environment variables in file paths. This will make it very hard to maintain full multiplatform -compatibility as well variable storage roots. -- Relying on VPN connection and using it to work directly of network storage will be painfully slow. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js deleted file mode 100644 index 131dc1b8ad..0000000000 --- a/website/docusaurus.config.js +++ /dev/null @@ -1,137 +0,0 @@ -module.exports = { - title: 'openPYPE', - tagline: 'Pipeline with support, for studios and remote teams.', - url: 'http://openpype.io/', - baseUrl: '/', - organizationName: 'Orbi Tools s.r.o', - projectName: 'openPype', - favicon: 'img/favicon/favicon.ico', - onBrokenLinks: 'ignore', - customFields: { - }, - presets: [ - [ - '@docusaurus/preset-classic', { - docs: { - sidebarPath: require.resolve('./sidebars.js'), - }, - theme: { - customCss: require.resolve('./src/css/custom.css') - }, - gtag: { - trackingID: 'G-DTKXMFENFY', - // Optional fields. - anonymizeIP: false, // Should IPs be anonymized? - } - } - ], - - ], - themeConfig: { - colorMode: { - // "light" | "dark" - defaultMode: 'light', - - // Hides the switch in the navbar - // Useful if you want to support a single color mode - disableSwitch: true - }, - announcementBar: { - id: 'help_with_docs', // Any value that will identify this message. - content: - 'Help us make this documentation better. Edit on github..', - backgroundColor: '#fff', // Defaults to `#fff`. - textColor: '#000', // Defaults to `#000`. - }, - navbar: { - style: 'dark', - title: 'openPYPE', - logo: { - src: 'img/logos/splash_main.svg' - }, - items: [ - { - to: '/features', - label: 'Features', - position: 'left' - }, { - to: 'docs/artist_getting_started', - label: 'User Docs', - position: 'left' - }, - { - to: 'docs/system_introduction', - label: 'Admin Docs', - position: 'left' - }, - { - to: 'docs/dev_introduction', - label: 'Dev Docs', - position: 'left' - }, - { - to: 'https://pype.club', - 'aria-label': 'pypeclub', - className: 'header-pypeclub-link', - position: 'right', - },{ - to: 'https://github.com/pypeclub', - 'aria-label': 'Github', - className: 'header-github-link', - position: 'right', - } - ] - }, - footer: { - style: 'dark', - links: [ - { - title: 'Pages', - items: [ - { - label: 'Features', - to: 'features', - }, - { - label: 'Artist', - to: 'docs/artist_getting_started', - }, - { - label: 'Admin', - to: 'docs/admin_getting_started', - } - ] - }, - { - title: 'Community', - items: [ - { - label: 'Avalon Chat', - to: 'https://gitter.im/getavalon/Lobby', - }, - { - label: 'OpenPype Chat', - to: 'https://discord.gg/sFNPWXG', - }, - { - label: 'Github Discussions', - to: 'https://github.com/pypeclub/pype/discussions', - } - ], - }, - ], - copyright: 'Copyright ยฉ 2021 Orbi Tools', - }, - algolia: { - apiKey: '5e01ee3bfbb744ca6f25d4b281ce38a9', - indexName: 'openpype', - // Optional: see doc section below - contextualSearch: true, - // Optional: Algolia search parameters - searchParameters: {}, - } - }, - stylesheets: [ - 'https://use.fontawesome.com/releases/v5.7.2/css/all.css' - ], -}; diff --git a/website/package.json b/website/package.json deleted file mode 100644 index 87a66ad7ec..0000000000 --- a/website/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "pype-documentation", - "license": "MIT", - "scripts": { - "examples": "docusaurus-examples", - "start": "docusaurus start", - "build": "docusaurus build", - "publish-gh-pages": "docusaurus-publish", - "write-translations": "docusaurus-write-translations", - "version": "docusaurus-version", - "rename-version": "docusaurus-rename-version", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "docusaurus": "docusaurus" - }, - "dependencies": { - "@docusaurus/core": "2.0.0-beta.15", - "@docusaurus/preset-classic": "2.0.0-beta.15", - "classnames": "^2.2.6", - "clsx": "^1.1.1", - "react": "^16.10.2", - "react-dom": "^16.10.2", - "react-popupbox": "^2.0.8", - "remarkable-admonitions": "^0.2.1", - "yarn": "^1.17.3" - }, - "devDependencies": {} -} diff --git a/website/publish.cmd b/website/publish.cmd deleted file mode 100644 index f203823bde..0000000000 --- a/website/publish.cmd +++ /dev/null @@ -1,5 +0,0 @@ -cd %~dp0 -set GIT_USER=mkolar -set CURRENT_BRANCH=develop -set USE_SSH=true -yarn deploy diff --git a/website/sidebars.js b/website/sidebars.js deleted file mode 100644 index 0d151433ea..0000000000 --- a/website/sidebars.js +++ /dev/null @@ -1,186 +0,0 @@ -module.exports = { - artist: [ - { - type: "category", - collapsed: false, - label: "General", - items: [ - "artist_getting_started", - "artist_concepts", - "artist_publish", - { - type: "category", - collapsed: true, - label: "Tools", - link: {type: 'doc', id: 'artist_tools'}, - items: [ - "artist_tools_context_manager", - "artist_tools_creator", - "artist_tools_loader", - "artist_tools_library_loader", - "artist_tools_publisher", - "artist_tools_inventory", - "artist_tools_workfiles", - "artist_tools_look_assigner", - "artist_tools_subset_manager", - "artist_tools_sync_queue" - ], - }, - "artist_install" - ], - }, - { - type: "category", - collapsed: false, - label: "Integrations", - items: [ - "artist_hosts_hiero", - "artist_hosts_nuke_tut", - { - type: "category", - label: "Maya", - items: [ - "artist_hosts_maya", - "artist_hosts_maya_multiverse", - "artist_hosts_maya_yeti", - "artist_hosts_maya_xgen", - "artist_hosts_maya_arnold", - "artist_hosts_maya_vray", - "artist_hosts_maya_redshift", - ], - }, - "artist_hosts_blender", - "artist_hosts_3dsmax", - "artist_hosts_harmony", - "artist_hosts_houdini", - "artist_hosts_aftereffects", - "artist_hosts_resolve", - "artist_hosts_photoshop", - "artist_hosts_tvpaint", - "artist_hosts_unreal", - "artist_kitsu", - { - type: "category", - label: "Ftrack", - items: [ - "artist_ftrack", - "manager_ftrack", - "manager_ftrack_actions", - ], - } - ], - }, - ], - Admin: [ - "system_introduction", - { - type: "category", - label: "Getting Started", - items: [ - "admin_builds", - "admin_distribute", - "admin_use", - "admin_openpype_commands", - ], - }, - { - type: "category", - label: "Configuration", - items: [ - "admin_environment", - "admin_settings", - "admin_settings_system", - "admin_settings_project_anatomy", - { - type: "category", - label: "Project Settings", - items: [ - "project_settings/settings_project_global", - "project_settings/settings_project_nuke", - "project_settings/settings_project_standalone" - ], - }, - ], - }, - { - type: "category", - label: "Modules", - items: [ - "module_ftrack", - "module_kitsu", - "module_site_sync", - "module_deadline", - "module_royalrender", - "module_clockify", - "module_slack" - ], - }, - { - type: "category", - label: "Integrations", - items: [ - "admin_hosts_blender", - "admin_hosts_hiero", - "admin_hosts_houdini", - "admin_hosts_maya", - "admin_hosts_nuke", - "admin_hosts_resolve", - "admin_hosts_harmony", - "admin_hosts_photoshop", - "admin_hosts_aftereffects", - "admin_hosts_tvpaint" - ], - }, - "admin_releases", - { - type: "category", - collapsed: false, - label: "2.0 legacy docs", - items: [ - { - type: "category", - label: "Deployment", - items: [ - "pype2/admin_getting_started", - "pype2/admin_install", - "pype2/admin_config", - "pype2/admin_ftrack", - "pype2/admin_hosts", - "pype2/admin_pype_commands", - "pype2/admin_setup_troubleshooting", - ], - }, - { - type: "category", - label: "Configuration", - items: [ - "pype2/admin_presets_nukestudio", - "pype2/admin_presets_ftrack", - "pype2/admin_presets_maya", - "pype2/admin_presets_plugins", - "pype2/admin_presets_tools", - ], - }, - ], - }, - ], - Dev: [ - "dev_introduction", - "dev_requirements", - "dev_build", - "dev_testing", - "dev_contribute", - "dev_settings", - { - type: "category", - label: "Hosts integrations", - items: [ - "dev_host_implementation", - "dev_publishing" - ] - }, - "dev_deadline", - "dev_blender", - "dev_colorspace" - ] -}; diff --git a/website/src/components/BadgesSection/badges.js b/website/src/components/BadgesSection/badges.js deleted file mode 100644 index 5b179d066d..0000000000 --- a/website/src/components/BadgesSection/badges.js +++ /dev/null @@ -1,64 +0,0 @@ -export default { - upper: [ - { - title: "VFX Platform", - src: - "https://img.shields.io/badge/vfx%20platform-2021-lightgrey?labelColor=303846", - href: "https://vfxplatform.com", - }, - { - title: "License", - src: - "https://img.shields.io/github/license/pypeclub/openpype?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "Release", - src: - "https://img.shields.io/github/v/release/pypeclub/openpype?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "GitHub last commit", - src: - "https://img.shields.io/github/last-commit/pypeclub/openpype/develop?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "GitHub commit activity", - src: - "https://img.shields.io/github/commit-activity/y/pypeclub/openpype?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "Repository Size", - src: - "https://img.shields.io/github/repo-size/pypeclub/openpype?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "Repository Size", - src: - "https://img.shields.io/github/contributors/pypeclub/openpype?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "Stars", - src: - "https://img.shields.io/github/stars/pypeclub?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "Forks", - src: - "https://img.shields.io/github/forks/pypeclub/openpype?labelColor=303846", - href: "https://github.com/pypeclub/openpype", - }, - { - title: "Discord", - src: - "https://img.shields.io/discord/517362899170230292?label=discord&logo=discord&logoColor=white&labelColor=303846", - href: "https://discord.gg/sFNPWXG", - }, - ], -}; diff --git a/website/src/components/BadgesSection/index.js b/website/src/components/BadgesSection/index.js deleted file mode 100644 index f782de2a52..0000000000 --- a/website/src/components/BadgesSection/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; - -import badges from './badges'; -import styles from './styles.module.css'; -import {StarButton} from "../index"; - -const Badge = props => ( - - {props.title}/ - -); - -export default function BadgesSection() { - const {upper: upperBadges} = badges; - - return ( -
-
- {upperBadges.map((badge, index) => ( - - ))} -
-
- ); -}; diff --git a/website/src/components/BadgesSection/styles.module.css b/website/src/components/BadgesSection/styles.module.css deleted file mode 100644 index 4db99e7e06..0000000000 --- a/website/src/components/BadgesSection/styles.module.css +++ /dev/null @@ -1,17 +0,0 @@ -.badgesSection { - margin-bottom: 5em; -} -.upperBadges, -.lowerBadges { - display: flex; - flex-wrap: wrap; - justify-content: center; -} -.upperBadges { - margin-bottom: 17px; -} -.upperBadges a, -.lowerBadges a { - margin-left: 2px; - margin-right: 2px; -} diff --git a/website/src/components/GithubButton/index.js b/website/src/components/GithubButton/index.js deleted file mode 100644 index b1950a8d6f..0000000000 --- a/website/src/components/GithubButton/index.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; - -export function StarButton() { - const context = useDocusaurusContext(); - const {siteConfig = {}} = context; - - return - T-Regx - ; -} - -export function SponsorButton() { - return
-