Skip to content

Commit 1cff48d

Browse files
[cuenimby] Add CueNIMBY - System tray application for workstation NIMBY control (#2026)
**Link the Issue(s) this Pull Request is related to.** - #2025 - #1314 - #1800 **Summarize your change.** [cuenimby] Add CueNIMBY system tray application with cross-platform NIMBY control, improved notifications, error handling, and documentation Introduce CueNIMBY, a cross-platform system tray app for managing OpenCue’s NIMBY (Not In My Back Yard) feature. Provides visual feedback, manual/automatic workstation state control, and enhanced documentation. Features: - Cross-platform support (macOS, Windows, Linux) - Color-coded tray icon with real-time rendering state - Notifications for job starts and state changes (improved reliability on macOS) - Manual lock/unlock via tray menu - Time-based scheduler for automatic state changes - Open Config File menu option - JSON-based configuration with defaults - Integration with RQD’s automatic NIMBY feature Implementation: - Core application with full test suite (15/15 passing) - Improved error handling and notification fallback chain - About dialog using native platform APIs - Dynamic version management via VERSION.in + importlib.metadata - State synchronization fixes for immediate UI feedback - Package configuration (pyproject.toml with hatchling) - Added to sandbox installer script Documentation: - Quick start, user guide, tutorial, reference, and developer guide - New desktop rendering control guide (lock states, allocations, subscriptions, workflows, troubleshooting) - Updated README, glossary, and cross-links throughout docs These changes provide artists with reliable visibility and control over workstation rendering, consistent cross-platform behavior, robust error handling, synchronized UI state, and complete documentation. --------- Signed-off-by: Ramon Figueiredo <[email protected]>
1 parent 023064c commit 1cff48d

File tree

94 files changed

+5371
-70
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+5371
-70
lines changed

.github/actions/build-python-packages/action.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@ runs:
7171
python -m build --outdir packages -s ./rqd
7272
python -m build --outdir packages -w ./rqd
7373
74+
- name: Build opencue_cuenimby package
75+
shell: bash
76+
run: |
77+
set -e
78+
python -m build --outdir packages -s ./cuenimby
79+
python -m build --outdir packages -w ./cuenimby
80+
7481
- name: Fix permissions
7582
shell: bash
7683
run: chmod uog+rwX packages/*.*

.github/workflows/packaging-pipeline.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
opencue_cuecmd_path: ${{ steps.package_outputs.outputs.opencue_cuecmd_path }}
2121
opencue_cuesubmit_path: ${{ steps.package_outputs.outputs.opencue_cuesubmit_path }}
2222
opencue_cuegui_path: ${{ steps.package_outputs.outputs.opencue_cuegui_path }}
23+
opencue_cuenimby_path: ${{ steps.package_outputs.outputs.opencue_cuenimby_path }}
2324
steps:
2425
- uses: actions/checkout@v4
2526
with:
@@ -43,6 +44,7 @@ jobs:
4344
echo "opencue_cueman_path=$(find ./packages -name 'opencue_cueman-*.whl' -print -quit)" >> $GITHUB_OUTPUT
4445
echo "opencue_cuecmd_path=$(find ./packages -name 'opencue_cuecmd-*.whl' -print -quit)" >> $GITHUB_OUTPUT
4546
echo "opencue_cuegui_path=$(find ./packages -name 'opencue_cuegui-*.whl' -print -quit)" >> $GITHUB_OUTPUT
47+
echo "opencue_cuenimby_path=$(find ./packages -name 'opencue_cuenimby-*.whl' -print -quit)" >> $GITHUB_OUTPUT
4648
4749
build_rust_binaries:
4850
name: Build Rust Binaries

.github/workflows/release-pipeline.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
opencue_cueman_path: ${{ steps.package_outputs.outputs.opencue_cueman_path }}
2121
opencue_cuesubmit_path: ${{ steps.package_outputs.outputs.opencue_cuesubmit_path }}
2222
opencue_cuegui_path: ${{ steps.package_outputs.outputs.opencue_cuegui_path }}
23+
opencue_cuenimby_path: ${{ steps.package_outputs.outputs.opencue_cuenimby_path }}
2324
steps:
2425
- uses: actions/checkout@v4
2526
with:
@@ -54,6 +55,7 @@ jobs:
5455
echo "opencue_cueadmin_path=$(find ./packages -name 'opencue_cueadmin-*.whl' -print -quit)" >> $GITHUB_OUTPUT
5556
echo "opencue_cueman_path=$(find ./packages -name 'opencue_cueman-*.whl' -print -quit)" >> $GITHUB_OUTPUT
5657
echo "opencue_cuegui_path=$(find ./packages -name 'opencue_cuegui-*.whl' -print -quit)" >> $GITHUB_OUTPUT
58+
echo "opencue_cuenimby_path=$(find ./packages -name 'opencue_cuenimby-*.whl' -print -quit)" >> $GITHUB_OUTPUT
5759
5860
build_rust_binaries:
5961
name: Build Rust Binaries
@@ -421,6 +423,16 @@ jobs:
421423
asset_name: cueman-${{ env.BUILD_ID }}-py2.py3-none-any.whl
422424
asset_content_type: application/octet-stream
423425

426+
- name: Upload CueNIMBY package
427+
uses: actions/upload-release-asset@v1
428+
env:
429+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
430+
with:
431+
upload_url: ${{ steps.create_release.outputs.upload_url }}
432+
asset_path: ${{ github.workspace }}/artifacts/opencue_cuenimby-${{ env.BUILD_ID }}-py2.py3-none-any.whl
433+
asset_name: cuenimby-${{ env.BUILD_ID }}-py2.py3-none-any.whl
434+
asset_content_type: application/octet-stream
435+
424436
- name: Upload openrqd (Linux GNU)
425437
uses: actions/upload-release-asset@v1
426438
env:

.github/workflows/testing-pipeline.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
opencue_cuecmd_path: ${{ steps.package_outputs.outputs.opencue_cuecmd_path }}
2121
opencue_cuesubmit_path: ${{ steps.package_outputs.outputs.opencue_cuesubmit_path }}
2222
opencue_rqd_path: ${{ steps.package_outputs.outputs.opencue_rqd_path }}
23+
opencue_cuenimby_path: ${{ steps.package_outputs.outputs.opencue_cuenimby_path }}
2324
steps:
2425
- uses: actions/checkout@v4
2526
with:
@@ -50,6 +51,7 @@ jobs:
5051
echo "opencue_cueman_path=$(find ./packages -name 'opencue_cueman-*.whl' -print -quit)" >> $GITHUB_OUTPUT
5152
echo "opencue_cuecmd_path=$(find ./packages -name 'opencue_cuecmd-*.whl' -print -quit)" >> $GITHUB_OUTPUT
5253
echo "opencue_cuegui_path=$(find ./packages -name 'opencue_cuegui-*.whl' -print -quit)" >> $GITHUB_OUTPUT
54+
echo "opencue_cuenimby_path=$(find ./packages -name 'opencue_cuenimby-*.whl' -print -quit)" >> $GITHUB_OUTPUT
5355
5456
install_opencue_packages:
5557
needs: build_opencue_packages
@@ -79,7 +81,8 @@ jobs:
7981
${{ needs.build_opencue_packages.outputs.opencue_cuecmd_path }} \
8082
${{ needs.build_opencue_packages.outputs.opencue_cuesubmit_path }} \
8183
${{ needs.build_opencue_packages.outputs.opencue_cuegui_path }} \
82-
${{ needs.build_opencue_packages.outputs.opencue_rqd_path }}
84+
${{ needs.build_opencue_packages.outputs.opencue_rqd_path }} \
85+
${{ needs.build_opencue_packages.outputs.opencue_cuenimby_path }}
8386
python -c "import opencue_proto"
8487
python -c "import opencue_proto.report_pb2"
8588
python -c "import opencue_proto.report_pb2_grpc"
@@ -160,6 +163,7 @@ jobs:
160163
export OPENCUE_CUESUBMIT_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuesubmit_path }}"
161164
export OPENCUE_CUEGUI_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuegui_path }}"
162165
export OPENCUE_RQD_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_rqd_path }}"
166+
export OPENCUE_CUENIMBY_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuenimby_path }}"
163167
ci/run_python_tests.sh
164168
165169
test_cuebot_2024:
@@ -205,6 +209,7 @@ jobs:
205209
export OPENCUE_CUESUBMIT_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuesubmit_path }}"
206210
export OPENCUE_CUEGUI_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuegui_path }}"
207211
export OPENCUE_RQD_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_rqd_path }}"
212+
export OPENCUE_CUENIMBY_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuenimby_path }}"
208213
ci/run_integration_test.sh
209214
210215
- name: Archive log files
@@ -245,6 +250,7 @@ jobs:
245250
export OPENCUE_CUESUBMIT_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuesubmit_path }}"
246251
export OPENCUE_CUEGUI_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuegui_path }}"
247252
export OPENCUE_RQD_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_rqd_path }}"
253+
export OPENCUE_CUENIMBY_PACKAGE_PATH="${{ needs.build_opencue_packages.outputs.opencue_cuenimby_path }}"
248254
249255
- name: Lint Python Code
250256
run: ci/run_python_lint.sh

ci/run_python_tests.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ args=("$@")
1111
python_version=$(python -V 2>&1)
1212
echo "Will run tests using ${python_version}"
1313

14-
python -m pip uninstall --yes opencue_proto opencue_pycue opencue_pyoutline opencue_cueadmin opencue_cueman opencue_cuecmd opencue_cuesubmit opencue_rqd
14+
python -m pip uninstall --yes opencue_proto opencue_pycue opencue_pyoutline opencue_cueadmin opencue_cueman opencue_cuesubmit opencue_rqd opencue_cuecmd opencue_cuenimby
1515

1616
if [[ -v OPENCUE_PROTO_PACKAGE_PATH ]]
1717
then
@@ -21,7 +21,7 @@ else
2121
python -m pip install ./proto
2222
fi
2323

24-
for package in pycue pyoutline cueadmin cueman cuecmd cuesubmit rqd
24+
for package in pycue pyoutline cueadmin cueman cuesubmit rqd cuecmd cuenimby
2525
do
2626
PACKAGE_PATH="OPENCUE_${package^^}_PACKAGE_PATH"
2727
if [[ -v "${PACKAGE_PATH}" ]]

cuenimby/.gitignore

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
*.so
6+
.Python
7+
build/
8+
develop-eggs/
9+
dist/
10+
downloads/
11+
eggs/
12+
.eggs/
13+
lib/
14+
lib64/
15+
parts/
16+
sdist/
17+
var/
18+
wheels/
19+
*.egg-info/
20+
.installed.cfg
21+
*.egg
22+
23+
# Virtual environments
24+
venv/
25+
ENV/
26+
env/
27+
28+
# IDE
29+
.vscode/
30+
.idea/
31+
*.swp
32+
*.swo
33+
*~
34+
35+
# Testing
36+
.pytest_cache/
37+
.coverage
38+
htmlcov/
39+
40+
# OS
41+
.DS_Store
42+
Thumbs.db
43+
44+
# Config (may contain sensitive info)
45+
cuenimby.json

0 commit comments

Comments
 (0)