diff --git a/.cirrus.yml b/.cirrus.yml index f848383..942f100 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -4,10 +4,10 @@ macos_arm64_dmg_task: env: REPO: https://github.com/biolab/orange3.git BUILD_BRANCH: master - BUILD_COMMIT: 3.36.0 - APP: "/Applications/Orange3.app" + BUILD_COMMIT: 3.36.2 + APP: "/Applications/Quasar-M.app" - PYTHON_VERSION: 3.9.12 + PYTHON_VERSION: "3.10.11" PIP_PREFER_BINARY: "1" ARCH: "arm64" ARCHFLAGS: "-arch arm64" @@ -15,6 +15,10 @@ macos_arm64_dmg_task: # --skip-jenkins arg to create-dmg SKIP_JENKINS: "1" + # Quasar + QUASAR_VERSION: "1.9.0" + SPECTROSCOPY_VERSION: "0.6.11" + prerequisites_script: - brew install python@3.10 - brew install create-dmg @@ -28,28 +32,33 @@ macos_arm64_dmg_task: build_installer_script: - cd orange3 - - PIP_ARGS=( --pip-arg={-r,../specs/macos/requirements-arm64.txt,Orange3==$BUILD_COMMIT} ); + - PIP_ARGS=( --pip-arg={-r,../specs/macos/requirements-arm64.txt,Orange3==$BUILD_COMMIT,orange-spectroscopy==$SPECTROSCOPY_VERSION,quasar==$QUASAR_VERSION} ); - ../scripts/macos/build-macos-app.sh --macos 11 "${PIP_ARGS[@]}" --python-version=${PYTHON_VERSION} "$APP" # Apply arm64 specific patches - patch -p1 -d "$APP" < ../scripts/macos/arm64.patch build_dmg_installer_script: - cd orange3 - - ../scripts/macos/create-dmg-installer.sh --app "$APP" dist/Orange3.dmg + - ../scripts/macos/create-dmg-installer.sh --app "$APP" dist/Quasar.dmg - >- - VERSION=`$APP/Contents/MacOS/pip show orange3 | grep -E '^Version: ' | cut -d ' ' -f 2` - - mv dist/Orange3.dmg dist/Orange3-$VERSION-Python${PYTHON_VERSION}-${ARCH}.dmg - - shasum -a 256 dist/Orange3-$VERSION-Python${PYTHON_VERSION}-${ARCH}.dmg + VERSION=`$APP/Contents/MacOS/pip show quasar | grep -E '^Version: ' | cut -d ' ' -f 2` + - mv dist/Quasar.dmg dist/Quasar-$VERSION-Python${PYTHON_VERSION}-${ARCH}.dmg + - shasum -a 256 dist/Quasar-$VERSION-Python${PYTHON_VERSION}-${ARCH}.dmg - mv dist/Orange3-$VERSION-Python${PYTHON_VERSION}-${ARCH}.dmg ../dist test_script: - mkdir -p ~/Applications - mv -f $APP ~/Applications/ - - APP=( ~/Applications/Orange3.app ) + - APP=( ~/Applications/$(basename $APP) ) - $APP/Contents/MacOS/python --version - $APP/Contents/MacOS/pip --version - $APP/Contents/MacOS/pip freeze - $APP/Contents/MacOS/python -Xfaulthandler -m unittest -v Orange.tests Orange.widgets.tests || true + # Quasar specific tests + - $APP/Contents/MacOS/python -Xfaulthandler -m unittest -v orangecontrib.spectroscopy.tests + - $APP/Contents/MacOS/python -Xfaulthandler -m quasar --help + - $APP/Contents/MacOS/python -Xfaulthandler -c "import opusFC" + dmg_artifacts: path: "dist/*" \ No newline at end of file diff --git a/.github/workflows/build-conda-installer.yml b/.github/workflows/build-conda-installer.yml new file mode 100644 index 0000000..9786fc5 --- /dev/null +++ b/.github/workflows/build-conda-installer.yml @@ -0,0 +1,221 @@ +name : Build Windows Conda Installer + +on: + pull_request: + workflow_dispatch: + push: + branches: + - 'master' + - 'releases/**' + - 'testing/**' + +jobs: + build: + runs-on: windows-2019 + timeout-minutes: 60 + env: + REPO: https://github.com/biolab/orange3.git + BUILD_BRANCH: master + BUILD_COMMIT: "3.36.2" + BUILD_LOCAL: "" + + PYTHONFAULTHANDLER: 1 + PIP_NO_PIP_VERSION_CHECK: 1 + PIP_CACHE_DIR: .pip-cache + PIP_PREFER_BINARY: 1 + CONDA_BUILD_VERSION: "3.26.*" + # CONDA_SPEC_FILE: ..\specs\win\conda-spec.txt + + # Quasar + QUASAR_VERSION: "1.9.0" + SPECTROSCOPY_VERSION: "0.6.11" + + strategy: + fail-fast: False + matrix: + include: + - python-version: "3.10.11" + miniconda-version: "py310_23.11.0-1" + + defaults: + run: + shell: bash -l {0} + + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - uses: mamba-org/setup-micromamba@v1 + with: + condarc: >- + channels: + - https://quasar.codes/conda/ + - conda-forge + - defaults + environment-name: build + create-args: conda conda-build boa python=3.11 + init-shell: bash cmd.exe + generate-run-shell: true + + - name: Checkout orange3 + shell: bash + run: | + set -e + git clone -q $REPO + cd orange3 + git fetch origin $BUILD_BRANCH + git checkout $BUILD_COMMIT + + - name: Prepare conda packages + env: + PYTHON_VERSION: ${{ matrix.python-version }} + run: | + if [[ $BUILD_LOCAL ]]; then + conda mambabuild --no-test --python $PYTHON_VERSION ./orange3/conda-recipe + VERSION=$(cd orange3; python setup.py --version) + EXTRA_ARGS=(-c file:///C:/users/runneradmin/micromamba/envs/build/conda-bld) + else + VERSION=$BUILD_COMMIT + EXTRA_ARGS=() + fi + if [[ ! $CONDA_SPEC_FILE ]]; then + micromamba create -p ./env --yes \ + ${EXTRA_ARGS[*]} \ + python=$PYTHON_VERSION \ + numpy=1.24.* \ + scipy=1.10.* \ + scikit-learn=1.3.* \ + pandas=1.5.* \ + pyqtgraph=0.13.* \ + bottleneck=1.3.* \ + pyqt=5.15.* \ + pyqtwebengine=5.15.* \ + Orange3=$VERSION \ + blas=*=openblas \ + quasar=$QUASAR_VERSION \ + orange-spectroscopy=$SPECTROSCOPY_VERSION \ + opusFC=1.3.0 \ + h5py + conda list -p ./env --export --explicit --md5 > env-spec.txt + cat env-spec.txt + echo "CONDA_SPEC_FILE=env-spec.txt" >> $GITHUB_ENV + fi + + - name: Build installer + env: + PLATTAG: win_amd64 + MINICONDA_VERSION: ${{ matrix.miniconda-version }} + run: | + mkdir dist + export PATH="$(cygpath -u 'C:\Program Files (x86)\NSIS'):$PATH" + echo PATH=$PATH + bash -e ./scripts/windows/build-conda-installer.sh \ + --platform $PLATTAG \ + --cache-dir .cache \ + --dist-dir dist \ + --miniconda-version "$MINICONDA_VERSION" \ + --env-spec "$CONDA_SPEC_FILE" \ + --online no + + INSTALLER=( dist/Quasar-*.exe ) + SHA256=$( sha256sum -b $INSTALLER ) + echo INSTALLER = $INSTALLER + echo SHA256 = $( sha256sum -b $INSTALLER ) + + - name: Upload installer + uses: actions/upload-artifact@v4 + with: + name: orange-win-conda-installer + path: dist/Quasar-*.exe + if-no-files-found: error + + test: + name: Test + needs: build + runs-on: windows-2019 + steps: + - name: Download installer + uses: actions/download-artifact@v4 + with: + name: orange-win-conda-installer + + - name: Install + shell: cmd + run: | + rem # Install in silent mode. Output has to be piped somewhere so the installer + rem # runs 'attached' to the console. + for %%s in ( Quasar-*.exe ) do ( set "INSTALLER=%%s" ) + echo INSTALLER = %INSTALLER% + %INSTALLER% /S /D=D:\test-install > nul + - name: Run tests + shell: bash + run: | + PYTHON=$(cygpath -u 'D:\test-install\python') + $PYTHON --version + $PYTHON -m pip --version + $PYTHON -m pip list --format=freeze + # Test that orange and all dependencies are installed in a + # consistent state + #$PYTHON -m pip install --no-index --no-cache-dir orange3 + + # Run test suite in the installed environment. + export ORANGE_DEPRECATIONS_ERROR=1 + export PYTHONWARNINGS=module + + $PYTHON -m unittest -v Orange.tests Orange.widgets.tests + + # Quasar specific tests + $PYTHON -m unittest -v orangecontrib.spectroscopy.tests + $PYTHON -m quasar --help + $PYTHON -c "import opusFC" + + - name: Test conda + shell: cmd + run: | + D:\test-install\Scripts\conda.bat --help + D:\test-install\Scripts\conda.bat info + D:\test-install\Scripts\activate.bat + echo %CONDA_PREFIX% + + package_portable: + name: Package a portable install + needs: [build, test] + runs-on: windows-2019 + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Download installer + uses: actions/download-artifact@v3 + with: + name: orange-win-conda-installer + + - name: Extract installer contents + shell: cmd + run: | + rem # Install in silent mode. Output has to be piped somewhere so the installer + rem # runs 'attached' to the console. + for %%s in ( Orange3*.exe ) do ( set "INSTALLER=%%s" ) + echo INSTALLER = %INSTALLER% + %INSTALLER% /S /D=D:\test-install > nul + + - name: Package portable installer + shell: cmd + run: | + mkdir dist + ci\appveyor-make-portable.bat D:\test-install %CD%\dist\Orange.zip + + - name: Upload portable installer + uses: actions/upload-artifact@v4 + with: + name: orange-win-portable-installer + path: dist/Orange*.zip + if-no-files-found: error diff --git a/.github/workflows/build-macos-installer.yml b/.github/workflows/build-macos-installer.yml new file mode 100644 index 0000000..78b7aae --- /dev/null +++ b/.github/workflows/build-macos-installer.yml @@ -0,0 +1,165 @@ +name : Build macOS dmg + +on: + pull_request: + workflow_dispatch: + push: + branches: + - 'master' + - 'releases/**' + - 'testing/**' + +jobs: + build: + runs-on: macos-11 + timeout-minutes: 50 + env: + REPO: https://github.com/biolab/orange3.git + BUILD_BRANCH: master + BUILD_COMMIT: "3.36.2" + BUILD_LOCAL: "" + APP: "/Applications/Quasar.app" + + PYTHONFAULTHANDLER: 1 + PIP_NO_PIP_VERSION_CHECK: 1 + PIP_CACHE_DIR: .pip-cache + PIP_PREFER_BINARY: 1 + + # Quasar + QUASAR_VERSION: "1.9.0" + SPECTROSCOPY_VERSION: "0.6.11" + + strategy: + fail-fast: False + matrix: + include: + - python-version: "3.10.11" + + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Checkout orange3 + shell: bash + run: | + set -e + git clone -q $REPO + cd orange3 + git fetch origin $BUILD_BRANCH + git checkout $BUILD_COMMIT + + - name: Setup Pip Cache + uses: actions/cache@v3 + with: + path: .pip-cache + key: ${{ runner.os }}-py-${{ matrix.python-version }}-pip-${{ hashFiles('.github/workflows/build-macos-installer.yml') }} + restore-keys: | + ${{ runner.os }}-py-${{ matrix.python-version }}-pip + + - name: 'Install modified create-dmg (modified to allow longer detach timeouts)' + shell: bash + run: | + wget https://github.com/create-dmg/create-dmg/archive/refs/tags/v1.2.1.tar.gz + tar -zxvf v1.2.1.tar.gz + cd create-dmg-1.2.1/ + patch --ignore-whitespace create-dmg <<'EOF' + --- a/create-dmg 2023-11-13 15:11:49.411364880 +0100 + +++ b/create-dmg 2023-11-13 15:20:02.373043672 +0100 + @@ -31,7 +31,7 @@ + SANDBOX_SAFE=0 + BLESS=0 + SKIP_JENKINS=0 + -MAXIMUM_UNMOUNTING_ATTEMPTS=3 + +MAXIMUM_UNMOUNTING_ATTEMPTS=6 + SIGNATURE="" + NOTARIZE="" + + @@ -41,14 +41,17 @@ + + function hdiutil_detach_retry() { + # Unmount + + sync --file-system "$1" + + sleep 10 + unmounting_attempts=0 + until + echo "Unmounting disk image..." + (( unmounting_attempts++ )) + hdiutil detach "$1" + exit_code=$? + + echo "hdiutil exited with $exit_code" + (( exit_code == 0 )) && break # nothing goes wrong + - (( exit_code != 16 )) && exit $exit_code # exit with the original exit code + + #(( exit_code != 16 )) && exit $exit_code # exit with the original exit code + # The above statement returns 1 if test failed (exit_code == 16). + # It can make the code in the {do... done} block to be executed + do + EOF + make install + cd .. + + - name: Build application bundle + shell: bash + env: + PYTHON_VERSION: ${{ matrix.python-version }} + run: | + set -e + cd orange3 + if [[ $BUILD_LOCAL ]]; then + PIP_ARGS=( --pip-arg={-r,../specs/macos/requirements.txt,./,orange-spectroscopy==$SPECTROSCOPY_VERSION,quasar==$QUASAR_VERSION} ); + else + PIP_ARGS=( --pip-arg={-r,../specs/macos/requirements.txt,Orange3==$BUILD_COMMIT,orange-spectroscopy==$SPECTROSCOPY_VERSION,quasar==$QUASAR_VERSION} ); + fi + ../scripts/macos/build-macos-app.sh "${PIP_ARGS[@]}" --python-version=${PYTHON_VERSION} "$APP" + + - name: Build dmg installer + shell: bash + env: + PYTHON_VERSION: ${{ matrix.python-version }} + run: | + set -e + mkdir dist + ./scripts/macos/create-dmg-installer.sh --app "$APP" dist/Quasar.dmg + VERSION=$("$APP/Contents/MacOS/pip" show quasar | grep -E '^Version: ' | cut -d ' ' -f 2) + mv dist/Quasar.dmg dist/Quasar-$VERSION-Python${PYTHON_VERSION}.dmg + shasum -a 256 dist/Quasar-$VERSION-Python${PYTHON_VERSION}.dmg + + - name: Upload dmg + uses: actions/upload-artifact@v4 + with: + name: orange-dmg-installer + path: dist/Quasar-*.dmg + if-no-files-found: error + + test: + name: Test + needs: build + runs-on: macos-latest + steps: + - name: Download dmg + uses: actions/download-artifact@v4 + with: + name: orange-dmg-installer + - name: Mount + shell: bash + run: | + mkdir ./mnt + hdiutil attach Quasar*.dmg -noverify -noautoopen -mountpoint ./mnt + - name: Run tests + run: | + APP=( mnt/Quasar.app ) + $APP/Contents/MacOS/python --version + $APP/Contents/MacOS/pip --version + $APP/Contents/MacOS/pip freeze + + export ORANGE_DEPRECATIONS_ERROR=1 + export PYTHONWARNINGS=module + $APP/Contents/MacOS/python -Xfaulthandler -m unittest -v Orange.tests Orange.widgets.tests || true + + # Quasar specific tests + $APP/Contents/MacOS/python -Xfaulthandler -m unittest -v orangecontrib.spectroscopy.tests + $APP/Contents/MacOS/python -Xfaulthandler -m quasar --help + $APP/Contents/MacOS/python -Xfaulthandler -c "import opusFC" diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 253e375..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,97 +0,0 @@ -clone_depth: 30 - -image: Visual Studio 2019 - -environment: - global: - # Commit ref/tag to checkout - BUILD_COMMIT: 1.9.0 - - # Build the package locally or use the build packages from - # conda-forge / PyPI. Unsupported! - BUILD_LOCAL: - - PIP_DISABLE_PIP_VERSION_CHECK: 1 - - # build env dependencies for building orange3 wheels or any of its - # dependencies that do not have wheels available - BUILD_DEPS: wheel~=0.37.0 pip~=22.0.3 - - # Note the python version here refers to the one included in the installer - # not the one used for building/packaging - matrix: - - PYTHON_VERSION: '3.9.12' - PLATTAG: win_amd64 - CONDA: C:\Miniconda38-x64\Scripts\conda - PYTHON: C:\Miniconda38-x64\python - MINICONDA_VERSION: 'py39_4.12.0' - CONDA_BUILD_VERSION: '3.22' - CONDA_USE_ONLY_TAR_BZ2: "" - CONDA_SPEC_FILE: - # CONDA_SPEC_FILE: ..\specs\win\conda-spec.txt - -matrix: - fast_finish: true - -cache: - - '%LOCALAPPDATA%\pip\Cache -> appveyor.yml' - - '.cache -> appveyor.yml' - -build_script: - - set "PATH_BEFORE_BUILD=%PATH%" - - set "PATH=C:\msys64\usr\bin;C:\Program Files (x86)\NSIS;%PATH%" - - - if not "%CONDA%" == "" ( rmdir /q /s "C:\Program Files (x86)\Windows Kits\10\include\wdf" ) - - if not "%CONDA%" == "" ( ci\appveyor-conda-build.bat ) - - if "%CONDA%" == "" ( ci\appveyor-build.bat ) - - - for %%s in ( dist/Quasar*.exe ) do ( set "INSTALLER=%%s" ) - - echo INSTALLER = %INSTALLER% - - - set "PATH=%PATH_BEFORE_BUILD%" - -test_script: - # cleanup registry of anaconda reg keys - - reg delete HKEY_LOCAL_MACHINE\Software\Python\ContinuumAnalytics /f || cd . - - reg delete HKEY_CURRENT_USER\Software\Python\ContinuumAnalytics /f || cd . - - dir dist - # Install in silent mode. Output has to be piped somewhere so the installer - # runs 'attached' to the console. - - dist\%INSTALLER% /S /D=C:\test-install > nul - # The venv and conda envs create different install layouts. - - if "%CONDA%" == "" ( set "PYTHON=C:\test-install\Scripts\python" ) - - if not "%CONDA%" == "" ( set "PYTHON=C:\test-install\python" ) - - >- - "%PYTHON%" --version - - >- - "%PYTHON%" -m pip --version - - >- - "%PYTHON%" -m pip list --format=freeze - # Test that orange and all dependencies are installed in a consistent state - # - >- - # "%PYTHON%" -m pip install --no-index --no-cache-dir orange3 - - # Run test suite in the installed environment. - - set ORANGE_DEPRECATIONS_ERROR=1 - - set PYTHONWARNINGS=module - - - >- - "%PYTHON%" -m unittest -v Orange.tests Orange.widgets.tests || cd . - - >- - "%PYTHON%" -m unittest -v orangecontrib.spectroscopy.tests || cd . - - >- - "%PYTHON%" -m quasar --help - - >- - "%PYTHON%" -c "import opusFC" - - mkdir installers - - move dist\%INSTALLER% installers\ - - # Log the filename and the sha checksum - - for /f %%s in ( 'sha256sum -b installers/%INSTALLER%' ) do ( set "CHECKSUM=%%s" ) - - echo INSTALLER = %INSTALLER% - - echo SHA256 = %CHECKSUM% - - -artifacts: - - path: installers\* - - path: conda-pkgs\* diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 50fdf23..0000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,85 +0,0 @@ -variables: - BUILD_BRANCH: master - BUILD_COMMIT: 1.9.0 - BUILD_LOCAL: - - APP: "/Applications/Quasar.app" - -jobs: - - job: 'build_macos_dmg' - displayName: Build macOS installer - timeoutInMinutes: 90 - pool: - vmImage: macOS-11 - - strategy: - matrix: - PY38: - PYTHON_VERSION: 3.9.12 - - steps: - - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.9' - architecture: 'x64' - displayName: 'Use Python 3.9' - - - bash: | - wget https://github.com/create-dmg/create-dmg/archive/refs/tags/v1.1.0.tar.gz - tar -zxvf v1.1.0.tar.gz - cd create-dmg-1.1.0/ - sed -i.bu 's/MAXIMUM_UNMOUNTING_ATTEMPTS=3/MAXIMUM_UNMOUNTING_ATTEMPTS=6/g' create-dmg - cat create-dmg | grep MAXIMUM_UNMOUNTING_ATTEMPTS - sed -i.bu 's/exit_code != 16/exit_code == 1616/g' create-dmg - cat create-dmg | grep exit_code - make install - cd .. - displayName: 'Install modified create-dmg (modified to allow longer detach timeouts)' - - - bash: | - set -e - if [[ $BUILD_LOCAL ]]; then - PIP_ARGS=( --pip-arg={-r,./specs/macos/requirements.txt,./} ); - else - PIP_ARGS=( --pip-arg={-r,./specs/macos/requirements.txt,Quasar==$BUILD_COMMIT} ); - fi - ./scripts/macos/build-macos-app.sh --macos 10.9 "${PIP_ARGS[@]}" --python-version=$PYTHON_VERSION "$APP" - displayName: Build application bundle - - - bash: | - set -e - ./scripts/macos/create-dmg-installer.sh --app "$APP" dist/Quasar.dmg - VERSION=$("$APP/Contents/MacOS/pip" show quasar | grep -E '^Version: ' | cut -d ' ' -f 2) - mv dist/Quasar.dmg dist/Quasar-$VERSION-Python${PYTHON_VERSION}.dmg - shasum -a 256 dist/Quasar-$VERSION-Python${PYTHON_VERSION}.dmg - displayName: Build dmg installer - - - bash: | - set -e - mkdir -p ~/Applications - mv -f $APP ~/Applications/ - APP=( ~/Applications/Quasar.app ) - $APP/Contents/MacOS/python --version - $APP/Contents/MacOS/pip --version - $APP/Contents/MacOS/pip freeze - - export ORANGE_DEPRECATIONS_ERROR=1 - export PYTHONWARNINGS=module - unset TRAVIS - $APP/Contents/MacOS/python -Xfaulthandler -m unittest -v Orange.tests Orange.widgets.tests || true - $APP/Contents/MacOS/python -Xfaulthandler -m unittest -v orangecontrib.spectroscopy.tests || true - $APP/Contents/MacOS/Quasar --help - $APP/Contents/MacOS/python -c "import opusFC" - displayName: Run tests - - - task: CopyFiles@2 - inputs: - contents: 'dist/*.dmg' - targetFolder: $(Build.ArtifactStagingDirectory) - flattenFolders: true - - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: $(Build.ArtifactStagingDirectory) - artifactName: 'macOS dmg installer' diff --git a/ci/appveyor-conda-build.bat b/ci/appveyor-conda-build.bat deleted file mode 100644 index f2a338e..0000000 --- a/ci/appveyor-conda-build.bat +++ /dev/null @@ -1,96 +0,0 @@ -@echo on -setlocal EnableDelayedExpansion - -if "%PYTHON_VERSION%" == "" ( - echo PYTHON_VERSION must be defined >&2 - exit /b 1 -) - -if "%PLATTAG%" == "" ( - echo Missing PLATTAG variable >&2 - exit /b 1 -) - -rem activate the root conda environment (miniconda3 4.7.0 installs -rem libarchive that requires this - conda cannot be used as a executable -rem without activation first) -if exist "%CONDA%\..\activate" ( - call "%CONDA%\..\activate" -) - -"%CONDA%" config --append channels conda-forge || exit /b !ERRORLEVEL! - -if not "%CONDA_USE_ONLY_TAR_BZ2%" == "" ( - "%CONDA%" config --set use_only_tar_bz2 True || exit /b !ERRORLEVEL! - "%CONDA%" clean --all --yes -) - -if "%CONDA_BUILD_VERSION%" == "" ( - set "CONDA_BUILD_VERSION=3.17.8" -) - -if "%MINICONDA_VERSION%" == "" ( - set "MINICONDA_VERSION=4.7.12" -) - -if not "%BUILD_LOCAL%" == "" ( - rem # Disabled local builds -) else ( - set "VERSION=%BUILD_COMMIT%" -) - -echo VERSION = %VERSION% - -if "%CONDA_SPEC_FILE%" == "" ( - rem # prefer conda forge - "%CONDA%" config --add channels conda-forge || exit /b !ERRORLEVEL! - "%CONDA%" config --add channels https://quasar.codes/conda/ - "%CONDA%" config --set channel_priority strict - - "%CONDA%" create -n env --yes --use-local ^ - python=%PYTHON_VERSION% ^ - numpy=1.24.* ^ - scipy=1.10.* ^ - scikit-learn=1.1.* ^ - pandas=1.5.* ^ - pyqtgraph=0.13.* ^ - bottleneck=1.3.* ^ - pyqt=5.15.* ^ - pyqtwebengine=5.15.* ^ - Orange3=3.36.1 ^ - blas=*=openblas ^ - quasar=%VERSION% ^ - orange-spectroscopy=0.6.11 ^ - opusFC=1.3.0 ^ - h5py ^ - filelock ^ - || exit /b !ERRORLEVEL! - - "%CONDA%" list -n env --export --explicit --md5 > env-spec.txt - set CONDA_SPEC_FILE=env-spec.txt -) - -type "%CONDA_SPEC_FILE%" - -bash -e scripts/windows/build-conda-installer.sh ^ - --platform %PLATTAG% ^ - --cache-dir ../.cache ^ - --dist-dir dist ^ - --miniconda-version "%MINICONDA_VERSION%" ^ - --env-spec "%CONDA_SPEC_FILE%" ^ - --online no ^ - || exit /b !ERRORLEVEL! - - -for %%s in ( dist/Quasar-*Miniconda*.exe ) do ( - set "INSTALLER=%%s" -) - -for /f %%s in ( 'sha256sum -b dist/%INSTALLER%' ) do ( - set "CHECKSUM=%%s" -) - -echo INSTALLER = %INSTALLER% -echo SHA256 = %CHECKSUM% - -@echo on diff --git a/scripts/macos/arm64.patch b/scripts/macos/arm64.patch index a7ba064..1a83478 100644 --- a/scripts/macos/arm64.patch +++ b/scripts/macos/arm64.patch @@ -15,13 +15,15 @@ # Patch Orange startup script to force arm46 execution --- a/Contents/MacOS/Orange +++ b/Contents/MacOS/Orange -@@ -1,2 +1,2 @@ --#!/bin/bash -+#!/usr/bin/arch -arm64 /bin/bash +@@ -1,2 +1,4 @@ + #!/bin/bash ++ ++export ARCHPREFERENCE=arm64 # Patch pip startup script to force arm46 execution --- a/Contents/MacOS/pip +++ b/Contents/MacOS/pip -@@ -1,2 +1,2 @@ --#!/bin/bash -+#!/usr/bin/arch -arm64 /bin/bash +@@ -1,2 +1,4 @@ + #!/bin/bash ++ ++export ARCHPREFERENCE=arm64 diff --git a/scripts/macos/create-dmg-installer.sh b/scripts/macos/create-dmg-installer.sh index 2de495f..bbb1148 100755 --- a/scripts/macos/create-dmg-installer.sh +++ b/scripts/macos/create-dmg-installer.sh @@ -57,8 +57,12 @@ echo "=============================================" mkdir -p "${TMP_TEMPLATE}"/ +BASENAME=$(basename $APP) +echo "Copying the app ${BASENAME}" + # Copy the .app directory in place -cp -a "${APP}" "${TMP_TEMPLATE}"/Quasar.app +cp -a "${APP}" "${TMP_TEMPLATE}"/"${BASENAME}" + mkdir -p "$(dirname "${DMG}")" EXTRA_DS_STORE=() @@ -78,8 +82,8 @@ create-dmg \ --window-size 400 244 \ --icon-size 75 \ --text-size 12 \ - --hide-extension "Quasar.app" \ - --icon "Quasar.app" 95 125 \ + --hide-extension "${BASENAME}" \ + --icon "${BASENAME}" 95 125 \ --app-drop-link 305 125 \ ${EXTRA_DS_STORE[*]} \ "${DMG}" \ diff --git a/scripts/macos/dmg-resources/DS_Store b/scripts/macos/dmg-resources/DS_Store index e4cbf14..aa367b2 100644 Binary files a/scripts/macos/dmg-resources/DS_Store and b/scripts/macos/dmg-resources/DS_Store differ diff --git a/scripts/windows/PythonHelpers.nsh b/scripts/windows/PythonHelpers.nsh index 5650060..a3d25b8 100644 --- a/scripts/windows/PythonHelpers.nsh +++ b/scripts/windows/PythonHelpers.nsh @@ -1,5 +1,6 @@ !include TextFunc.nsh +!include StrFunc.nsh # ${GetPythonInstallPEP514} COMPANY TAG $(user_var: INSTALL_PREFIX) $(user_var: INSTALL_MODE) # @@ -73,6 +74,17 @@ !endif ${GetPythonInstallPEP514} PythonCore ${__TAG} ${INSTALL_PREFIX} ${INSTALL_MODE} !undef __TAG + + # Avoid Orange to use Python from Miniconda/Anaconda which is also present under + # PythonCore. The problem with this Python is that when the environment is not + # activated it doesn't have acess to the DLL libraries. + Push $1 + ${StrStr} $1 ${INSTALL_PREFIX} "conda" + ${If} $1 != "" + StrCpy ${INSTALL_PREFIX} "" + StrCpy ${INSTALL_MODE} -1 + ${EndIf} + Pop $1 !macroend !define GetPythonInstall "!insertmacro __GET_PYTHON_INSTALL" @@ -138,6 +150,86 @@ !macroend !define FindAnacondaInstall "!insertmacro FindAnacondaInstallCall" +Function TrimQuotes + Exch $R0 + Push $R1 + + StrCpy $R1 $R0 1 + StrCmp $R1 `"` 0 +2 + StrCpy $R0 $R0 `` 1 + StrCpy $R1 $R0 1 -1 + StrCmp $R1 `"` 0 +2 + StrCpy $R0 $R0 -1 + + Pop $R1 + Exch $R0 +FunctionEnd + +# ${TrimQuotes} $(user_var: RVAL) $(user_var: OUTPUT) +# Trims single leading and trailing double quotes ("). +!macro _TrimQuotes Input Output + Push `${Input}` + Call TrimQuotes + Pop ${Output} +!macroend +!define TrimQuotes `!insertmacro _TrimQuotes` + +# ${FindAnacondaInstall} ROOT_KEY $(user_var: PREFIX) +# ROOT_KEY: HKCU or HKLM (see ReadRegStr for details) +# PREFIX: User variable where the install prefix is stored. Empty if +# no anaconda installation was found. +# Find a registerd anaconda python installation +# In case there are multiple registered installs the last +# one under 'Software\Python\ContinuumAnalytics' registry key is returned +!macro FindAnacondaInstallViaCurrentCall ROOT_KEY PREFIX + !define __REG_PREFIX Software\Microsoft\Windows\CurrentVersion\Uninstall + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push "" # $0, $1, $2, $3, $4, "" + StrCpy $0 0 + StrCpy $1 "" + StrCpy $2 "" + StrCpy $3 "" + StrCpy $4 "" + ${Do} + EnumRegKey $1 ${ROOT_KEY} ${__REG_PREFIX} $0 + ${If} $1 != "" + ReadRegStr $2 ${ROOT_KEY} \ + "${__REG_PREFIX}\$1" "DisplayName" + ${If} $2 != "" + ${StrStr} $3 $2 "Miniconda3" + ${StrStr} $4 $2 "Anaconda3" + ${LogWrite} " $3 $4" + ${If} $3 != "" + ${OrIf} $4 != "" + ReadRegStr $2 ${ROOT_KEY} \ + "${__REG_PREFIX}\$1" "UninstallString" + ${TrimQuotes} $2 $2 + ${GetParent} $2 $1 + Exch $1 # $0, $1, $2, $3, $4, prefix + ${EndIf} + ${EndIf} + ${EndIf} + IntOp $0 $0 + 1 + ${LoopUntil} $1 == "" + Exch # $0, $1, $2, $3, prefix, $4 + Pop $4 # $0, $1, $2, $3, prefix + Exch # $0, $1, $2, prefix, $3 + Pop $3 # $0, $1, $2, prefix + Exch # $0, $1, prefix, $2 + Pop $2 # $0, $1, prefix + Exch # $0, prefix, $1 + Pop $1 # $0, prefix + Exch # prefix, $0 + Pop $0 + Pop ${PREFIX} + !undef __REG_PREFIX +!macroend +!define FindAnacondaInstallViaCurrent "!insertmacro FindAnacondaInstallViaCurrentCall" + !macro GetAnyAnacondaInstalCall INSTALL_PREFIX INSTALL_MODE ${FindAnacondaInstall} HKCU ${INSTALL_PREFIX} ${LogWrite} "Anaconda in HKCU: ${INSTALL_PREFIX}" @@ -152,6 +244,21 @@ ${Else} StrCpy ${INSTALL_MODE} 0 ${EndIf} + ${If} ${INSTALL_PREFIX} == "" + ${FindAnacondaInstallViaCurrent} HKCU ${INSTALL_PREFIX} + ${LogWrite} "Anaconda Uninstall in HKCU: ${INSTALL_PREFIX}" + ${If} ${INSTALL_PREFIX} == "" + ${FindAnacondaInstallViaCurrent} HKLM ${INSTALL_PREFIX} + ${LogWrite} "Anaconda Uninstall in HKLM: ${INSTALL_PREFIX}" + ${If} ${INSTALL_PREFIX} != "" + StrCpy ${INSTALL_MODE} 1 + ${Else} + StrCpy ${INSTALL_MODE} -1 + ${Endif} + ${Else} + StrCpy ${INSTALL_MODE} 0 + ${EndIf} + ${EndIf} !macroend !define GetAnyAnacondaInstall "!insertmacro GetAnyAnacondaInstalCall" diff --git a/scripts/windows/build-conda-installer.sh b/scripts/windows/build-conda-installer.sh index 9ea3b62..7e74148 100755 --- a/scripts/windows/build-conda-installer.sh +++ b/scripts/windows/build-conda-installer.sh @@ -347,13 +347,13 @@ EOF -DBASEDIR="${basedir}" \ -DPYINSTALLER=${pyinstaller} \ -DINSTALL_REGISTRY_KEY=Quasar \ - -DINSTALLERICON=scripts/windows/quasar.ico \ + -DINSTALLERICON="$(win-path "${scriptdir}")/quasar.ico" \ -DICONDIR="quasar\icons" \ -DLICENSE_FILE="${BASEDIR}"/license.txt \ -DLAUNCHERMODULE="quasar" \ "${extransisparams[@]}" \ -NOCD \ - -V4 -WX \ + -V4 \ "-X!addincludedir $(win-path "${scriptdir}")" \ "${nsis_script:?}" } diff --git a/scripts/windows/orange-conda.nsi b/scripts/windows/orange-conda.nsi index 3d3341b..5f99744 100644 --- a/scripts/windows/orange-conda.nsi +++ b/scripts/windows/orange-conda.nsi @@ -344,7 +344,8 @@ Function DirectoryLeave MessageBox MB_OK '\ "$InstDir" contains a pre-existing environment \ that is not binary compatible with this installer.$\r$\n\ - Please choose another destination folder.' + Uninstall the existing version of ${APPLICATIONNAME} or \ + choose another destination folder.' Abort '$R1 $R2 != "${PYMAJOR}.${PYMINOR} ${PYARCH}"' ${EndIf} ${LogWrite} 'Found existing python in $InstDir: $R2 - $R3' diff --git a/specs/macos/requirements-arm64.txt b/specs/macos/requirements-arm64.txt index 83451c7..8b94b0c 100644 --- a/specs/macos/requirements-arm64.txt +++ b/specs/macos/requirements-arm64.txt @@ -7,7 +7,7 @@ numpy~=1.24.0 scipy~=1.10.0 -scikit-learn~=1.1.2 +scikit-learn~=1.3.0 bottleneck~=1.3.0 joblib==1.2.0 chardet~=5.0 @@ -15,13 +15,13 @@ keyring~=23.0 keyrings.alt~=4.0 AnyQt~=0.2.0 -PyQt6~=6.5.0 -PyQt6-Qt6~=6.5.0 -PyQt6-WebEngine~=6.5.0 -PyQt6-WebEngine-Qt6~=6.5.0 +PyQt5~=5.15.10 +PyQt5-Qt5~=5.15.12 +PyQtWebEngine~=5.15.6 +PyQtWebEngine-Qt5~=5.15.12 docutils~=0.18.0 -pip~=23.0.0 +pip~=23.3.1 pyqtgraph~=0.13.1 xlrd~=2.0 xlsxwriter @@ -31,3 +31,6 @@ python-louvain>=0.13 pandas~=1.5.0 xgboost catboost + +h5py +opusFC>=1.3.0 diff --git a/specs/macos/requirements.txt b/specs/macos/requirements.txt index 31e8b7c..0740e2e 100644 --- a/specs/macos/requirements.txt +++ b/specs/macos/requirements.txt @@ -10,7 +10,7 @@ numpy~=1.24.0 scipy~=1.10.0 -scikit-learn~=1.1.0 +scikit-learn~=1.3.0 bottleneck~=1.3.0 joblib==1.2.0 chardet~=5.0 @@ -22,7 +22,7 @@ PyQt5~=5.15.4 pyqtwebengine~=5.15.4 docutils~=0.18.0 -pip~=23.0.0 +pip~=23.3.1 pyqtgraph~=0.13.1 xlrd~=2.0 xlsxwriter @@ -35,9 +35,3 @@ catboost~=1.1.1 # catboost 1.2 wheels do not support macos <11 h5py opusFC>=1.3.0 - -Orange3==3.36.1 -orange-widget-base==4.22.0 -orange-canvas-core==0.1.33 - -orange-spectroscopy==0.6.11 diff --git a/specs/win/conda-spec.txt b/specs/win/conda-spec.txt index 1ee5766..6ab282b 100644 --- a/specs/win/conda-spec.txt +++ b/specs/win/conda-spec.txt @@ -1,84 +1,71 @@ -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: win-64 -@EXPLICIT -https://repo.anaconda.com/pkgs/main/win-64/blas-1.0-mkl.tar.bz2#e8aa6b7daaf0925245c148aaeaa0722e -https://repo.anaconda.com/pkgs/main/win-64/ca-certificates-2019.1.23-0.tar.bz2#f51beb89e3b35de34ff33a5e652adce4 -https://repo.anaconda.com/pkgs/main/win-64/icc_rt-2019.0.0-h0cc432a_1.tar.bz2#ce2949c239b5cd45848a0a7865d30520 -https://repo.anaconda.com/pkgs/main/win-64/intel-openmp-2019.3-203.tar.bz2#521484064fa841f1fe0e3ce009b12281 -https://repo.anaconda.com/pkgs/main/win-64/vs2015_runtime-14.15.26706-h3a45250_4.tar.bz2#850af9220d561dd550056957c981e62e -https://repo.anaconda.com/pkgs/main/win-64/mkl-2019.3-203.tar.bz2#621018a685432c994422ca4dd2dc94f3 -https://repo.anaconda.com/pkgs/main/win-64/vc-14.1-h0510ff6_4.tar.bz2#00bfe39f46f67409a376939cd2ab5039 -https://repo.anaconda.com/pkgs/main/win-64/icu-58.2-ha66f8fd_1.tar.bz2#8b9a078b693623d58afd56f4f2a162c3 -https://repo.anaconda.com/pkgs/main/win-64/jpeg-9b-hb83a4c4_2.tar.bz2#7abafa9f9a2c609e1b77424f5ffa6a8a -https://repo.anaconda.com/pkgs/main/win-64/openssl-1.0.2r-he774522_0.tar.bz2#2489e4ae0702d5b33ab18609b21cbc05 -https://repo.anaconda.com/pkgs/main/win-64/sqlite-3.28.0-he774522_0.tar.bz2#08bd6dc305316bf448e33004421313af -https://repo.anaconda.com/pkgs/main/win-64/yaml-0.1.7-hc54c509_2.tar.bz2#eaeee418b8ac33d392ea03bb9b6f389d -https://repo.anaconda.com/pkgs/main/win-64/zlib-1.2.11-h62dcd97_3.tar.bz2#6f96fd91475cc78aabf76d2e1a9ed91f -https://repo.anaconda.com/pkgs/main/win-64/hdf5-1.10.4-h7ebc959_0.tar.bz2#de2d3c434711af9c473efc9741189816 -https://repo.anaconda.com/pkgs/main/win-64/libpng-1.6.37-h2a8f88b_0.tar.bz2#351328bf2bee7fd7ee7e9c158aeb1be2 -https://repo.anaconda.com/pkgs/main/win-64/python-3.6.8-h9f7ef89_7.tar.bz2#e6c7400a0a76422e0c26e7e245ff5ed7 -https://repo.anaconda.com/pkgs/main/win-64/asn1crypto-0.24.0-py36_0.tar.bz2#a0a7514683fc72a9b8ca218c76a0f854 -https://repo.anaconda.com/pkgs/main/win-64/certifi-2019.3.9-py36_0.tar.bz2#e1faa30cf88c0cd141dfe71e70a9597a -https://repo.anaconda.com/pkgs/main/win-64/chardet-3.0.4-py36_1.tar.bz2#ed144f5416f8caf429e5421d37f2ae52 -https://repo.anaconda.com/pkgs/main/win-64/decorator-4.4.0-py36_1.tar.bz2#72875d63dd69455d06238094f9cd1585 -https://repo.anaconda.com/pkgs/main/win-64/docutils-0.14-py36h6012d8f_0.tar.bz2#9d43960c1822126eae5f541ecf0edc65 -https://repo.anaconda.com/pkgs/main/win-64/entrypoints-0.3-py36_0.tar.bz2#032c3c66f46872e1e01f8575d0cec8e3 -https://repo.anaconda.com/pkgs/main/win-64/freetype-2.9.1-ha9979f8_1.tar.bz2#f3263f3249686ede2d2bea458e30e61f -https://repo.anaconda.com/pkgs/main/win-64/idna-2.8-py36_0.tar.bz2#ec1acbd73601eecdaf2f2c1a7778a4ee -https://repo.anaconda.com/pkgs/main/win-64/joblib-0.13.2-py36_0.tar.bz2#9d972c33a38b604df2df6e2f665fbf41 -https://repo.anaconda.com/pkgs/main/win-64/kiwisolver-1.1.0-py36ha925a31_0.tar.bz2#aadffe2a64dd4a6f6316a617c3603610 -https://repo.anaconda.com/pkgs/main/win-64/llvmlite-0.28.0-py36ha925a31_0.tar.bz2#857c1ffa4589e15ad2604a3ee97b056a -https://repo.anaconda.com/pkgs/main/noarch/param-1.9.0-py_0.tar.bz2#24d83c546dbe7b7cd97a6186eec67837 -https://repo.anaconda.com/pkgs/main/win-64/pycparser-2.19-py36_0.tar.bz2#916a2d9a1840e412a60ed5c3b96a7002 -https://repo.anaconda.com/pkgs/main/noarch/pyparsing-2.4.0-py_0.tar.bz2#f6e70d858b30e70e663fd37cc20564ef -https://repo.anaconda.com/pkgs/main/win-64/pyreadline-2.1-py36_1.tar.bz2#f4ccfad83b692e09fb6f0d448e399397 -https://repo.anaconda.com/pkgs/main/noarch/pytz-2019.1-py_0.tar.bz2#cbb1721fde782f33a3c80ac645ae1951 -https://repo.anaconda.com/pkgs/main/win-64/pywin32-223-py36hfa6e2cd_1.tar.bz2#2b054becb70649e0b2207410e2513cbc -https://repo.anaconda.com/pkgs/main/win-64/pyyaml-5.1-py36he774522_0.tar.bz2#e54361548678f118daa04be67b8d0093 -https://repo.anaconda.com/pkgs/main/win-64/qt-5.6.2-vc14h6f8c307_12.tar.bz2#4a23c549d9f4c991db1afc23d3307183 -https://repo.anaconda.com/pkgs/main/win-64/sip-4.18.1-py36h6538335_2.tar.bz2#65bea0ba643843c8a5fd46ea00895b21 -https://repo.anaconda.com/pkgs/main/win-64/six-1.12.0-py36_0.tar.bz2#31dfe13c94e5b173aa1cc3108b9f9959 -https://repo.anaconda.com/pkgs/main/win-64/tornado-6.0.2-py36he774522_0.tar.bz2#b73bc60b5cd6db0912170ce63b1f92c3 -https://repo.anaconda.com/pkgs/main/win-64/win_inet_pton-1.1.0-py36_0.tar.bz2#0cdb48b6e3b8d614f3ae41a24dd0b37a -https://repo.anaconda.com/pkgs/main/win-64/wincertstore-0.2-py36h7fe50ca_0.tar.bz2#6c0c44d1a1e2d83e508dbce508c6f009 -https://repo.anaconda.com/pkgs/main/win-64/xlrd-1.2.0-py36_0.tar.bz2#3aa49f5f26b2a3ee9f1c75ce93c6d6d0 -https://repo.anaconda.com/pkgs/main/noarch/xlsxwriter-1.1.7-py_0.tar.bz2#314e5dbb6b7cbcdb2769f783e87df76d -https://repo.anaconda.com/pkgs/main/win-64/cffi-1.12.3-py36h7a1dbc1_0.tar.bz2#18b9ba8ddd5de61389f9733255d2d4c3 -https://repo.anaconda.com/pkgs/main/win-64/cycler-0.10.0-py36h009560c_0.tar.bz2#5d045387250c9b55097d3be01af54b11 -https://repo.anaconda.com/pkgs/main/win-64/keyring-18.0.0-py36_0.tar.bz2#12ad9676e9849c4634d9097098562623 -https://repo.anaconda.com/pkgs/main/win-64/pyqt-5.6.0-py36ha878b3d_6.tar.bz2#548cfaa08ef4fb05b0788594879de098 -https://repo.anaconda.com/pkgs/main/win-64/pysocks-1.6.8-py36_0.tar.bz2#1d4d4d775522356933daeb0a9fa85ebc -https://repo.anaconda.com/pkgs/main/win-64/python-dateutil-2.8.0-py36_0.tar.bz2#8ee8fc0f5ca164bb557bd5f650dd5d7c -https://repo.anaconda.com/pkgs/main/win-64/setuptools-41.0.1-py36_0.tar.bz2#693645f690539d33beaadf84864b0028 -https://repo.anaconda.com/pkgs/main/win-64/anyqt-0.0.10-py36_0.tar.bz2#b53ee337a0ef6e6a1a90f4e880465844 -https://repo.anaconda.com/pkgs/main/win-64/cryptography-2.3.1-py36h74b6da3_0.tar.bz2#8faa5e6ead37dca7baf33b503615ce5d -https://repo.anaconda.com/pkgs/main/win-64/keyrings.alt-3.1.1-py36_0.tar.bz2#385b928dd900113e35989f6279f8d15d -https://repo.anaconda.com/pkgs/main/noarch/networkx-2.3-py_0.tar.bz2#e519ecc91263aa0c0088c919871be9e7 -https://repo.anaconda.com/pkgs/main/win-64/wheel-0.33.1-py36_0.tar.bz2#0174a5e5d47836166e9a58fe6bb7fd08 -https://repo.anaconda.com/pkgs/main/win-64/pip-19.1-py36_0.tar.bz2#3ba889324d0b00c3b3afb02e7e7c72e2 -https://repo.anaconda.com/pkgs/main/win-64/pyopenssl-19.0.0-py36_0.tar.bz2#7ceb720c2958a66737b65b8111b406f5 -https://repo.anaconda.com/pkgs/main/win-64/urllib3-1.24.2-py36_0.tar.bz2#65ff729a1dee0ba78bcc59c5ce7b3eba -https://repo.anaconda.com/pkgs/main/win-64/requests-2.21.0-py36_0.tar.bz2#8840684539f92598a2073c5ebce61b61 -https://repo.anaconda.com/pkgs/main/win-64/pyct-0.4.6-py36_0.tar.bz2#b8b2bf770e43669a85cb2da96047d58b -https://repo.anaconda.com/pkgs/main/win-64/serverfiles-0.3.0-py36_0.tar.bz2#2fca4ecf0e16bc2ac0f7b08e3ce6db6d -https://repo.anaconda.com/pkgs/main/noarch/colorcet-2.0.1-py_0.tar.bz2#b72fb32eb4834c33c030e0a537c0ad27 -https://repo.anaconda.com/pkgs/main/win-64/bottleneck-1.2.1-py36h452e1ab_1.tar.bz2#fee379513d73fb059196658b1f5b3446 -https://quasar.codes/conda/noarch/extranormal3-0.0.3-py_0.tar.bz2#1b383d2e924b0e4a64b58d03ea470ba5 -https://repo.anaconda.com/pkgs/main/win-64/h5py-2.9.0-py36h5e291fa_0.tar.bz2#3d044930b992ab1a6c8163e235b43790 -https://repo.anaconda.com/pkgs/main/win-64/matplotlib-2.2.2-py36had4c4a9_2.tar.bz2#145e265f4b8e8f9215c3949b10db22b0 -https://repo.anaconda.com/pkgs/main/win-64/mkl_fft-1.0.12-py36h14836fe_0.tar.bz2#5276d0a1710449e546ab140a65f26359 -https://repo.anaconda.com/pkgs/main/win-64/mkl_random-1.0.2-py36h343c172_0.tar.bz2#ce1021d7aa8914e763528250e6eb795d -https://repo.anaconda.com/pkgs/main/win-64/numba-0.43.1-py36hf9181ef_0.tar.bz2#fba4f960e9950007c74fde7a10b0f469 -https://repo.anaconda.com/pkgs/main/win-64/numpy-1.15.4-py36h19fb1c0_0.tar.bz2#1b19cfdbd65be6888c423a4643365dc9 -https://repo.anaconda.com/pkgs/main/win-64/numpy-base-1.15.4-py36hc3f5095_0.tar.bz2#6e4e252e1dfc9ea0f5ebbdecb7f1dac8 -https://quasar.codes/conda/win-64/opusfc-1.2.0-py36h8c2d366_0.tar.bz2#45462d971b96c05fed430aa085205ce5 -https://repo.anaconda.com/pkgs/main/win-64/pyqtgraph-0.10.0-py36h28b3542_3.tar.bz2#295ad6c168c7fe008c30a37fbbb66bf5 -https://repo.anaconda.com/pkgs/main/noarch/python-louvain-0.13-py_0.tar.bz2#5e9896a094f76c87f5af222d383c8740 -https://repo.anaconda.com/pkgs/main/win-64/scipy-1.1.0-py36h29ff71c_2.tar.bz2#6262ea7c06347988534f5d88a2745e3f -https://conda.anaconda.org/conda-forge/noarch/spectral-0.19-py_1.tar.bz2#b977eab43f44293623bdc87f91aeafa6 -https://repo.anaconda.com/pkgs/main/win-64/scikit-learn-0.20.3-py36h343c172_0.tar.bz2#121367a95de33c75ca4d9e12093d3b67 -https://conda.anaconda.org/conda-forge/win-64/opentsne-0.3.2-py36h830ac7b_0.tar.bz2#8bd6e9c0580e503f0c4429e5b0136541 -https://conda.anaconda.org/conda-forge/win-64/orange3-3.20.1-py36h6538335_0.tar.bz2#66a71dc7a8345eb062be4e05691e3a8d -https://quasar.codes/conda/noarch/orange-spectroscopy-0.4.4-py_0.tar.bz2#40e6cd59d118510f0c1339fc32ef0dd5 -https://quasar.codes/conda/noarch/quasar-0.3.2-py_0.tar.bz2#16aa794554bf40635f9391f43a651f78 +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: win-64 +@EXPLICIT +https://repo.anaconda.com/pkgs/free/win-64/blas-1.0-mkl.tar.bz2#e8aa6b7daaf0925245c148aaeaa0722e +https://repo.anaconda.com/pkgs/main/win-64/ca-certificates-2018.12.5-0.tar.bz2#b333d284d619042ea76500d75aede5b0 +https://repo.anaconda.com/pkgs/main/win-64/icc_rt-2019.0.0-h0cc432a_1.tar.bz2#ce2949c239b5cd45848a0a7865d30520 +https://repo.anaconda.com/pkgs/main/win-64/intel-openmp-2019.1-144.tar.bz2#5edffe78df0bebc16b89c72e19598543 +https://repo.anaconda.com/pkgs/main/win-64/vs2015_runtime-14.15.26706-h3a45250_0.tar.bz2#6a9e60c0d113a7d1e9f72c38e4f6c05d +https://repo.anaconda.com/pkgs/main/win-64/mkl-2018.0.3-1.tar.bz2#3097902ad98b2f408bad39b7482fa200 +https://repo.anaconda.com/pkgs/main/win-64/vc-14.1-h0510ff6_4.tar.bz2#00bfe39f46f67409a376939cd2ab5039 +https://repo.anaconda.com/pkgs/main/win-64/icu-58.2-ha66f8fd_1.tar.bz2#8b9a078b693623d58afd56f4f2a162c3 +https://repo.anaconda.com/pkgs/main/win-64/jpeg-9b-hb83a4c4_2.tar.bz2#7abafa9f9a2c609e1b77424f5ffa6a8a +https://repo.anaconda.com/pkgs/main/win-64/openssl-1.0.2p-hfa6e2cd_0.tar.bz2#dd8f54d03bbe425eca55eca0bc0a174c +https://repo.anaconda.com/pkgs/main/win-64/sqlite-3.26.0-he774522_0.tar.bz2#40738f3130ce5145f6060160b30c1839 +https://repo.anaconda.com/pkgs/main/win-64/zlib-1.2.11-h62dcd97_3.tar.bz2#6f96fd91475cc78aabf76d2e1a9ed91f +https://repo.anaconda.com/pkgs/main/win-64/libpng-1.6.36-h2a8f88b_0.tar.bz2#bbb0e007322ca784e9021d4fa35efccc +https://repo.anaconda.com/pkgs/main/win-64/python-3.6.8-h9f7ef89_0.tar.bz2#e3179d2c207ee18f1a581a1ff3d4a87e +https://repo.anaconda.com/pkgs/main/win-64/asn1crypto-0.24.0-py36_0.tar.bz2#a0a7514683fc72a9b8ca218c76a0f854 +https://repo.anaconda.com/pkgs/main/win-64/certifi-2018.11.29-py36_0.tar.bz2#84effc142dd1125a8925c86b7eaa6bca +https://repo.anaconda.com/pkgs/main/win-64/chardet-3.0.4-py36_1.tar.bz2#ed144f5416f8caf429e5421d37f2ae52 +https://repo.anaconda.com/pkgs/main/win-64/decorator-4.3.0-py36_0.tar.bz2#8b778fbdf44210fbce2147c04306e92d +https://repo.anaconda.com/pkgs/main/win-64/docutils-0.14-py36h6012d8f_0.tar.bz2#9d43960c1822126eae5f541ecf0edc65 +https://repo.anaconda.com/pkgs/main/win-64/entrypoints-0.3-py36_0.tar.bz2#032c3c66f46872e1e01f8575d0cec8e3 +https://repo.anaconda.com/pkgs/main/win-64/freetype-2.9.1-ha9979f8_1.tar.bz2#f3263f3249686ede2d2bea458e30e61f +https://repo.anaconda.com/pkgs/main/win-64/idna-2.8-py36_0.tar.bz2#ec1acbd73601eecdaf2f2c1a7778a4ee +https://repo.anaconda.com/pkgs/main/win-64/joblib-0.13.1-py36_0.tar.bz2#f118435f3e4393191f538d9775d17d57 +https://repo.anaconda.com/pkgs/main/win-64/kiwisolver-1.0.1-py36h6538335_0.tar.bz2#f4d794e2bd7895193408fa85270506de +https://repo.anaconda.com/pkgs/main/win-64/llvmlite-0.27.0-py36ha925a31_0.tar.bz2#3cd9305e578e49045e604c346b46d6bf +https://repo.anaconda.com/pkgs/main/win-64/numpy-base-1.14.6-py36h8128ebf_4.tar.bz2#a1a95438c860bd314a6665eb942fc1fb +https://repo.anaconda.com/pkgs/main/win-64/pycparser-2.19-py36_0.tar.bz2#916a2d9a1840e412a60ed5c3b96a7002 +https://repo.anaconda.com/pkgs/main/win-64/pyparsing-2.3.1-py36_0.tar.bz2#d9db97b69476e4c5b58d5c126508dd09 +https://repo.anaconda.com/pkgs/main/win-64/pytz-2018.9-py36_0.tar.bz2#c9cacb9e773e8913babf94620fedaf25 +https://repo.anaconda.com/pkgs/main/win-64/pywin32-223-py36hfa6e2cd_1.tar.bz2#2b054becb70649e0b2207410e2513cbc +https://repo.anaconda.com/pkgs/main/win-64/qt-5.6.2-vc14h6f8c307_12.tar.bz2#4a23c549d9f4c991db1afc23d3307183 +https://repo.anaconda.com/pkgs/main/win-64/sip-4.18.1-py36h6538335_2.tar.bz2#65bea0ba643843c8a5fd46ea00895b21 +https://repo.anaconda.com/pkgs/main/win-64/six-1.12.0-py36_0.tar.bz2#31dfe13c94e5b173aa1cc3108b9f9959 +https://repo.anaconda.com/pkgs/main/win-64/tornado-5.1.1-py36hfa6e2cd_0.tar.bz2#0ece9d327da771868cc9a077e4acd5e3 +https://repo.anaconda.com/pkgs/main/win-64/win_inet_pton-1.0.1-py36_1.tar.bz2#0ecd051cc71116433db6a9be284b8f5c +https://repo.anaconda.com/pkgs/main/win-64/wincertstore-0.2-py36h7fe50ca_0.tar.bz2#6c0c44d1a1e2d83e508dbce508c6f009 +https://repo.anaconda.com/pkgs/main/win-64/xlrd-1.2.0-py36_0.tar.bz2#3aa49f5f26b2a3ee9f1c75ce93c6d6d0 +https://repo.anaconda.com/pkgs/main/win-64/xlsxwriter-1.1.2-py36_0.tar.bz2#d4677ac56c36f98617e9082ff0b7666b +https://repo.anaconda.com/pkgs/main/win-64/cffi-1.11.5-py36h74b6da3_1.tar.bz2#78c6778fcc260f4337f4b8e17ae3ae37 +https://repo.anaconda.com/pkgs/main/win-64/cycler-0.10.0-py36h009560c_0.tar.bz2#5d045387250c9b55097d3be01af54b11 +https://repo.anaconda.com/pkgs/main/win-64/keyring-17.1.1-py36_0.tar.bz2#7df131b765960a49e2200e56429c624c +https://repo.anaconda.com/pkgs/main/win-64/pyqt-5.6.0-py36ha878b3d_6.tar.bz2#548cfaa08ef4fb05b0788594879de098 +https://repo.anaconda.com/pkgs/main/win-64/pysocks-1.6.8-py36_0.tar.bz2#1d4d4d775522356933daeb0a9fa85ebc +https://repo.anaconda.com/pkgs/main/win-64/python-dateutil-2.7.5-py36_0.tar.bz2#f5cd9e6e7c28fd1726b87e25ba3d3b61 +https://repo.anaconda.com/pkgs/main/win-64/setuptools-40.6.3-py36_0.tar.bz2#3a2eacda9a4155f6a11467c176be4912 +https://repo.anaconda.com/pkgs/main/win-64/anyqt-0.0.10-py36_0.tar.bz2#b53ee337a0ef6e6a1a90f4e880465844 +https://repo.anaconda.com/pkgs/main/win-64/cryptography-2.3.1-py36h74b6da3_0.tar.bz2#8faa5e6ead37dca7baf33b503615ce5d +https://repo.anaconda.com/pkgs/main/win-64/keyrings.alt-3.1.1-py36_0.tar.bz2#385b928dd900113e35989f6279f8d15d +https://repo.anaconda.com/pkgs/main/win-64/networkx-2.2-py36_1.tar.bz2#712dff0d6d7800f238772e4b885a85d3 +https://repo.anaconda.com/pkgs/main/win-64/wheel-0.32.3-py36_0.tar.bz2#3036631d749c41e03753c95ca3cc8d3b +https://repo.anaconda.com/pkgs/main/win-64/pip-18.1-py36_0.tar.bz2#83b12345e641b9aaa07a27d36782b759 +https://repo.anaconda.com/pkgs/main/win-64/pyopenssl-18.0.0-py36_0.tar.bz2#bd7e3baa410bf847f3894803cd7cd771 +https://repo.anaconda.com/pkgs/main/win-64/urllib3-1.24.1-py36_0.tar.bz2#0aae61ecc48bd2ade82755a6a3c61548 +https://repo.anaconda.com/pkgs/main/win-64/requests-2.21.0-py36_0.tar.bz2#8840684539f92598a2073c5ebce61b61 +https://repo.anaconda.com/pkgs/main/win-64/serverfiles-0.3.0-py36_0.tar.bz2#2fca4ecf0e16bc2ac0f7b08e3ce6db6d +https://repo.anaconda.com/pkgs/main/win-64/bottleneck-1.2.1-py36h452e1ab_1.tar.bz2#fee379513d73fb059196658b1f5b3446 +https://repo.anaconda.com/pkgs/main/win-64/matplotlib-2.2.2-py36had4c4a9_2.tar.bz2#145e265f4b8e8f9215c3949b10db22b0 +https://repo.anaconda.com/pkgs/main/win-64/mkl_fft-1.0.6-py36hdbbee80_0.tar.bz2#9228b016ce78bdbbd105bbb7c72d455b +https://repo.anaconda.com/pkgs/main/win-64/mkl_random-1.0.1-py36h77b88f5_1.tar.bz2#a620e0e1acb966de2071824225183022 +https://repo.anaconda.com/pkgs/main/win-64/numpy-1.14.6-py36hc27ee41_4.tar.bz2#4adbae631e77b989eb2a77ece08f0713 +https://repo.anaconda.com/pkgs/main/win-64/numba-0.42.0-py36hf9181ef_0.tar.bz2#90757a5f5e8b7603d220776484abec65 +https://repo.anaconda.com/pkgs/main/win-64/pyqtgraph-0.10.0-py36h28b3542_3.tar.bz2#295ad6c168c7fe008c30a37fbbb66bf5 +https://conda.anaconda.org/conda-forge/noarch/python-louvain-0.13-py_0.tar.bz2#5da6647a5e36f75f7676cc545559a86b +https://repo.anaconda.com/pkgs/main/win-64/scipy-1.1.0-py36hc28095f_0.tar.bz2#fa2b2ca5d7eb490370d93aad6d9f5036 +https://repo.anaconda.com/pkgs/main/win-64/scikit-learn-0.20.1-py36hb854c30_0.tar.bz2#112729519baed742f4af184491b0891a +https://conda.anaconda.org/conda-forge/win-64/opentsne-0.3.0-py36h830ac7b_1000.tar.bz2#d22aed931dfc491cd0503cb3f8777d59 +https://conda.anaconda.org/conda-forge/win-64/orange3-3.20.1-py36h6538335_0.tar.bz2#66a71dc7a8345eb062be4e05691e3a8d