psychopy 2024.2.5__py3-none-any.whl → 2025.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of psychopy might be problematic. Click here for more details.
- psychopy/CHANGELOG.txt +4 -4
- psychopy/GIT_SHA +1 -1
- psychopy/LICENSE.txt +1 -1
- psychopy/VERSION +1 -1
- psychopy/__init__.py +10 -7
- psychopy/alerts/__init__.py +1 -1
- psychopy/alerts/_alerts.py +53 -17
- psychopy/alerts/_errorHandler.py +3 -4
- psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
- psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
- psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
- psychopy/alerts/alerttools.py +0 -16
- psychopy/app/Resources/betasplash.png +0 -0
- psychopy/app/Resources/betasplash@2x.png +0 -0
- psychopy/app/Resources/classic/case.png +0 -0
- psychopy/app/Resources/classic/case@2x.png +0 -0
- psychopy/app/Resources/classic/fileaudio.png +0 -0
- psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
- psychopy/app/Resources/classic/filecss.png +0 -0
- psychopy/app/Resources/classic/filecss@2x.png +0 -0
- psychopy/app/Resources/classic/filecsv.png +0 -0
- psychopy/app/Resources/classic/filecsv@2x.png +0 -0
- psychopy/app/Resources/classic/filedesign.png +0 -0
- psychopy/app/Resources/classic/filedesign@2x.png +0 -0
- psychopy/app/Resources/classic/filefont.png +0 -0
- psychopy/app/Resources/classic/filefont@2x.png +0 -0
- psychopy/app/Resources/classic/filegit.png +0 -0
- psychopy/app/Resources/classic/filegit@2x.png +0 -0
- psychopy/app/Resources/classic/filehtml.png +0 -0
- psychopy/app/Resources/classic/filehtml@2x.png +0 -0
- psychopy/app/Resources/classic/fileimage.png +0 -0
- psychopy/app/Resources/classic/fileimage@2x.png +0 -0
- psychopy/app/Resources/classic/fileinfo.png +0 -0
- psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
- psychopy/app/Resources/classic/filejs.png +0 -0
- psychopy/app/Resources/classic/filejs@2x.png +0 -0
- psychopy/app/Resources/classic/filejson.png +0 -0
- psychopy/app/Resources/classic/filejson@2x.png +0 -0
- psychopy/app/Resources/classic/filepkg.png +0 -0
- psychopy/app/Resources/classic/filepkg@2x.png +0 -0
- psychopy/app/Resources/classic/filepsyexp.png +0 -0
- psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/classic/filepy.png +0 -0
- psychopy/app/Resources/classic/filepy@2x.png +0 -0
- psychopy/app/Resources/classic/filetxt.png +0 -0
- psychopy/app/Resources/classic/filetxt@2x.png +0 -0
- psychopy/app/Resources/classic/fileunknown.png +0 -0
- psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
- psychopy/app/Resources/classic/filevideo.png +0 -0
- psychopy/app/Resources/classic/filevideo@2x.png +0 -0
- psychopy/app/Resources/classic/find.png +0 -0
- psychopy/app/Resources/classic/find@2x.png +0 -0
- psychopy/app/Resources/classic/loop.png +0 -0
- psychopy/app/Resources/classic/loop@2x.png +0 -0
- psychopy/app/Resources/classic/regex.png +0 -0
- psychopy/app/Resources/classic/regex@2x.png +0 -0
- psychopy/app/Resources/dark/case.png +0 -0
- psychopy/app/Resources/dark/case@2x.png +0 -0
- psychopy/app/Resources/dark/fileaudio.png +0 -0
- psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
- psychopy/app/Resources/dark/filecss.png +0 -0
- psychopy/app/Resources/dark/filecss@2x.png +0 -0
- psychopy/app/Resources/dark/filecsv.png +0 -0
- psychopy/app/Resources/dark/filecsv@2x.png +0 -0
- psychopy/app/Resources/dark/filedesign.png +0 -0
- psychopy/app/Resources/dark/filedesign@2x.png +0 -0
- psychopy/app/Resources/dark/filefont.png +0 -0
- psychopy/app/Resources/dark/filefont@2x.png +0 -0
- psychopy/app/Resources/dark/filegit.png +0 -0
- psychopy/app/Resources/dark/filegit@2x.png +0 -0
- psychopy/app/Resources/dark/filehtml.png +0 -0
- psychopy/app/Resources/dark/filehtml@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage.png +0 -0
- psychopy/app/Resources/dark/fileimage@2x.png +0 -0
- psychopy/app/Resources/dark/fileinfo.png +0 -0
- psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
- psychopy/app/Resources/dark/filejs.png +0 -0
- psychopy/app/Resources/dark/filejs@2x.png +0 -0
- psychopy/app/Resources/dark/filejson.png +0 -0
- psychopy/app/Resources/dark/filejson@2x.png +0 -0
- psychopy/app/Resources/dark/filepkg.png +0 -0
- psychopy/app/Resources/dark/filepkg@2x.png +0 -0
- psychopy/app/Resources/dark/filepsyexp.png +0 -0
- psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/dark/filepy.png +0 -0
- psychopy/app/Resources/dark/filepy@2x.png +0 -0
- psychopy/app/Resources/dark/filetxt.png +0 -0
- psychopy/app/Resources/dark/filetxt@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown.png +0 -0
- psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
- psychopy/app/Resources/dark/filevideo.png +0 -0
- psychopy/app/Resources/dark/filevideo@2x.png +0 -0
- psychopy/app/Resources/dark/find.png +0 -0
- psychopy/app/Resources/dark/find@2x.png +0 -0
- psychopy/app/Resources/dark/loop.png +0 -0
- psychopy/app/Resources/dark/loop@2x.png +0 -0
- psychopy/app/Resources/dark/regex.png +0 -0
- psychopy/app/Resources/dark/regex@2x.png +0 -0
- psychopy/app/Resources/light/case.png +0 -0
- psychopy/app/Resources/light/case@2x.png +0 -0
- psychopy/app/Resources/light/fileaudio.png +0 -0
- psychopy/app/Resources/light/fileaudio@2x.png +0 -0
- psychopy/app/Resources/light/filecss.png +0 -0
- psychopy/app/Resources/light/filecss@2x.png +0 -0
- psychopy/app/Resources/light/filecsv.png +0 -0
- psychopy/app/Resources/light/filecsv@2x.png +0 -0
- psychopy/app/Resources/light/filedesign.png +0 -0
- psychopy/app/Resources/light/filedesign@2x.png +0 -0
- psychopy/app/Resources/light/filefont.png +0 -0
- psychopy/app/Resources/light/filefont@2x.png +0 -0
- psychopy/app/Resources/light/filegit.png +0 -0
- psychopy/app/Resources/light/filegit@2x.png +0 -0
- psychopy/app/Resources/light/filehtml.png +0 -0
- psychopy/app/Resources/light/filehtml@2x.png +0 -0
- psychopy/app/Resources/light/fileimage.png +0 -0
- psychopy/app/Resources/light/fileimage@2x.png +0 -0
- psychopy/app/Resources/light/fileinfo.png +0 -0
- psychopy/app/Resources/light/fileinfo@2x.png +0 -0
- psychopy/app/Resources/light/filejs.png +0 -0
- psychopy/app/Resources/light/filejs@2x.png +0 -0
- psychopy/app/Resources/light/filejson.png +0 -0
- psychopy/app/Resources/light/filejson@2x.png +0 -0
- psychopy/app/Resources/light/filepkg.png +0 -0
- psychopy/app/Resources/light/filepkg@2x.png +0 -0
- psychopy/app/Resources/light/filepsyexp.png +0 -0
- psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/light/filepy.png +0 -0
- psychopy/app/Resources/light/filepy@2x.png +0 -0
- psychopy/app/Resources/light/filetxt.png +0 -0
- psychopy/app/Resources/light/filetxt@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown.png +0 -0
- psychopy/app/Resources/light/fileunknown@2x.png +0 -0
- psychopy/app/Resources/light/filevideo.png +0 -0
- psychopy/app/Resources/light/filevideo@2x.png +0 -0
- psychopy/app/Resources/light/find.png +0 -0
- psychopy/app/Resources/light/find@2x.png +0 -0
- psychopy/app/Resources/light/loop.png +0 -0
- psychopy/app/Resources/light/loop@2x.png +0 -0
- psychopy/app/Resources/light/regex.png +0 -0
- psychopy/app/Resources/light/regex@2x.png +0 -0
- psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
- psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
- psychopy/app/Resources/splash.png +0 -0
- psychopy/app/Resources/splash@2x.png +0 -0
- psychopy/app/__init__.py +49 -8
- psychopy/app/__main__.py +3 -0
- psychopy/app/_psychopyApp.py +134 -125
- psychopy/app/builder/builder.py +42 -22
- psychopy/app/builder/dialogs/__init__.py +44 -11
- psychopy/app/builder/dialogs/dlgsCode.py +1 -1
- psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
- psychopy/app/builder/dialogs/findDlg.py +106 -20
- psychopy/app/builder/dialogs/paramCtrls.py +42 -1
- psychopy/app/builder/validators.py +1 -1
- psychopy/app/coder/codeEditorBase.py +8 -8
- psychopy/app/coder/coder.py +32 -29
- psychopy/app/coder/fileBrowser.py +68 -22
- psychopy/app/coder/folding.py +1 -1
- psychopy/app/coder/psychoParser.py +1 -1
- psychopy/app/coder/repl.py +1 -1
- psychopy/app/coder/sourceTree.py +1 -1
- psychopy/app/connections/__init__.py +1 -1
- psychopy/app/connections/news.py +1 -1
- psychopy/app/connections/sendusage.py +1 -1
- psychopy/app/connections/updates.py +1 -1
- psychopy/app/console.py +1 -1
- psychopy/app/errorDlg.py +1 -1
- psychopy/app/frametracker.py +1 -1
- psychopy/app/idle.py +1 -1
- psychopy/app/jobs.py +5 -2
- psychopy/app/linuxconfig/__init__.py +1 -1
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
- psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
- psychopy/app/pavlovia_ui/__init__.py +1 -1
- psychopy/app/pavlovia_ui/_base.py +1 -1
- psychopy/app/pavlovia_ui/functions.py +1 -1
- psychopy/app/pavlovia_ui/menu.py +1 -1
- psychopy/app/pavlovia_ui/project.py +1 -1
- psychopy/app/pavlovia_ui/search.py +1 -1
- psychopy/app/pavlovia_ui/sync.py +1 -1
- psychopy/app/pavlovia_ui/user.py +1 -1
- psychopy/app/plugin_manager/dialog.py +34 -96
- psychopy/app/plugin_manager/packages.py +10 -14
- psychopy/app/plugin_manager/plugins.py +64 -4
- psychopy/app/preferencesDlg.py +12 -37
- psychopy/app/psychopyApp.py +130 -44
- psychopy/app/ribbon.py +1 -0
- psychopy/app/runner/runner.py +19 -7
- psychopy/app/runner/scriptProcess.py +11 -6
- psychopy/app/stdout/stdOutRich.py +9 -2
- psychopy/app/themes/fonts.py +1 -1
- psychopy/app/themes/icons.py +2 -38
- psychopy/app/ui/__init__.py +1 -1
- psychopy/app/utils.py +3 -3
- psychopy/assets/default.mp3 +0 -0
- psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
- psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
- psychopy/assets/voicekeyThresholdStim.wav +0 -0
- psychopy/clock.py +4 -1
- psychopy/colors.py +2 -0
- psychopy/core.py +1 -1
- psychopy/data/base.py +1 -1
- psychopy/data/experiment.py +151 -46
- psychopy/data/routine.py +27 -1
- psychopy/data/staircase.py +2 -1
- psychopy/data/trial.py +62 -14
- psychopy/data/utils.py +1 -1
- psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
- psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
- psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
- psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
- psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
- psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
- psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
- psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
- psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
- psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
- psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
- psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
- psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
- psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
- psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
- psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
- psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
- psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
- psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
- psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
- psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
- psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
- psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
- psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
- psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
- psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
- psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
- psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
- psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
- psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
- psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
- psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
- psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
- psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
- psychopy/devices/__init__.py +1 -1
- psychopy/event.py +1 -1
- psychopy/exceptions.py +1 -1
- psychopy/experiment/__init__.py +1 -1
- psychopy/experiment/_experiment.py +30 -9
- psychopy/experiment/components/__init__.py +1 -6
- psychopy/experiment/components/_base.py +44 -19
- psychopy/experiment/components/aperture/__init__.py +1 -1
- psychopy/experiment/components/brush/__init__.py +2 -2
- psychopy/experiment/components/button/__init__.py +24 -28
- psychopy/experiment/components/camera/__init__.py +38 -39
- psychopy/experiment/components/code/__init__.py +1 -1
- psychopy/experiment/components/dots/__init__.py +1 -1
- psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
- psychopy/experiment/components/form/__init__.py +3 -3
- psychopy/experiment/components/grating/__init__.py +1 -1
- psychopy/experiment/components/image/__init__.py +1 -1
- psychopy/experiment/components/joyButtons/__init__.py +2 -2
- psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
- psychopy/experiment/components/joystick/__init__.py +3 -3
- psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
- psychopy/experiment/components/keyboard/__init__.py +98 -122
- psychopy/experiment/components/microphone/__init__.py +54 -98
- psychopy/experiment/components/mouse/__init__.py +92 -93
- psychopy/experiment/components/movie/__init__.py +28 -50
- psychopy/experiment/components/parallelOut/__init__.py +3 -3
- psychopy/experiment/components/polygon/__init__.py +2 -3
- psychopy/experiment/components/roi/__init__.py +2 -2
- psychopy/experiment/components/routineSettings/__init__.py +2 -0
- psychopy/experiment/components/serialOut/__init__.py +7 -7
- psychopy/experiment/components/settings/__init__.py +317 -313
- psychopy/experiment/components/settings/eyetracking.py +108 -0
- psychopy/experiment/components/slider/__init__.py +5 -5
- psychopy/experiment/components/sound/__init__.py +168 -78
- psychopy/experiment/components/soundsensor/__init__.py +361 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
- psychopy/experiment/components/static/__init__.py +59 -33
- psychopy/experiment/components/text/__init__.py +2 -6
- psychopy/experiment/components/textbox/__init__.py +3 -7
- psychopy/experiment/components/unknown/__init__.py +2 -0
- psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
- psychopy/experiment/exports.py +1 -1
- psychopy/experiment/flow.py +2 -2
- psychopy/experiment/localization.py +1 -1
- psychopy/experiment/loops.py +43 -10
- psychopy/experiment/params.py +6 -4
- psychopy/experiment/plugins.py +8 -1
- psychopy/experiment/py2js.py +1 -1
- psychopy/experiment/py2js_transpiler.py +1 -1
- psychopy/experiment/routines/__init__.py +1 -1
- psychopy/experiment/routines/_base.py +23 -24
- psychopy/experiment/routines/audioValidator/__init__.py +343 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
- psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
- psychopy/experiment/routines/unknown/__init__.py +2 -0
- psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
- psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
- psychopy/experiment/utils.py +1 -1
- psychopy/gui/__init__.py +1 -1
- psychopy/gui/qtgui.py +15 -6
- psychopy/gui/wxgui.py +1 -1
- psychopy/hardware/__init__.py +0 -1
- psychopy/hardware/base.py +147 -16
- psychopy/hardware/bbtk/__init__.py +10 -16
- psychopy/hardware/brainproducts.py +7 -13
- psychopy/hardware/button.py +21 -2
- psychopy/hardware/buttonbox/__init__.py +1 -1
- psychopy/hardware/camera/__init__.py +16 -3
- psychopy/hardware/cedrus.py +5 -16
- psychopy/hardware/crs/__init__.py +1 -1
- psychopy/hardware/crs/bits.py +36 -33
- psychopy/hardware/crs/colorcal.py +8 -11
- psychopy/hardware/crs/optical.py +7 -10
- psychopy/hardware/crs/shaders.py +18 -5
- psychopy/hardware/emotiv.py +1 -1
- psychopy/hardware/emulator.py +11 -5
- psychopy/hardware/exceptions.py +86 -0
- psychopy/hardware/forp.py +18 -23
- psychopy/hardware/gammasci.py +8 -3
- psychopy/hardware/iolab.py +8 -19
- psychopy/hardware/joystick/__init__.py +865 -266
- psychopy/hardware/joystick/_base.py +251 -0
- psychopy/hardware/joystick/backend_glfw.py +306 -0
- psychopy/hardware/joystick/backend_pyglet.py +309 -0
- psychopy/hardware/joystick/mappings.py +287 -0
- psychopy/hardware/keyboard.py +4 -2
- psychopy/hardware/labhackers.py +1 -1
- psychopy/hardware/labjacks.py +9 -13
- psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
- psychopy/hardware/listener.py +9 -8
- psychopy/hardware/manager.py +24 -35
- psychopy/hardware/microphone.py +534 -154
- psychopy/hardware/minolta.py +14 -4
- psychopy/hardware/mouse/__init__.py +1 -1
- psychopy/hardware/photometer/__init__.py +2 -2
- psychopy/hardware/pr.py +14 -4
- psychopy/hardware/qmix.py +18 -27
- psychopy/hardware/serialdevice.py +43 -12
- psychopy/hardware/soundsensor.py +473 -0
- psychopy/hardware/spatial/__init__.py +231 -0
- psychopy/hardware/speaker.py +298 -36
- psychopy/hardware/triggerbox/__init__.py +1 -1
- psychopy/hardware/triggerbox/base.py +1 -1
- psychopy/hardware/triggerbox/parallel.py +1 -1
- psychopy/info.py +1 -1
- psychopy/iohub/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +2 -1
- psychopy/layout.py +1 -1
- psychopy/liaison.py +91 -39
- psychopy/locale_setup.py +11 -1
- psychopy/localization/__init__.py +1 -1
- psychopy/localization/_localization.py +1 -1
- psychopy/localization/messages.pot +2 -2
- psychopy/logging.py +14 -12
- psychopy/microphone.py +4 -3
- psychopy/misc.py +1 -1
- psychopy/monitors/MonitorCenter.py +3 -3
- psychopy/monitors/__init__.py +1 -1
- psychopy/monitors/calibData.py +1 -1
- psychopy/monitors/calibTools.py +3 -2
- psychopy/platform_specific/__init__.py +1 -1
- psychopy/platform_specific/darwin.py +1 -1
- psychopy/platform_specific/linux.py +1 -1
- psychopy/platform_specific/win32.py +1 -1
- psychopy/plugins/__init__.py +26 -17
- psychopy/plugins/util.py +65 -0
- psychopy/preferences/Darwin.spec +11 -3
- psychopy/preferences/FreeBSD.spec +11 -3
- psychopy/preferences/Linux.spec +11 -3
- psychopy/preferences/Windows.spec +11 -3
- psychopy/preferences/__init__.py +1 -1
- psychopy/preferences/baseNoArch.spec +11 -3
- psychopy/preferences/hints.py +78 -61
- psychopy/preferences/preferences.py +82 -13
- psychopy/projects/__init__.py +1 -1
- psychopy/projects/pavlovia.py +29 -13
- psychopy/scripts/psyexpCompile.py +1 -1
- psychopy/session.py +81 -8
- psychopy/sound/__init__.py +25 -10
- psychopy/sound/_base.py +134 -34
- psychopy/sound/audioclip.py +38 -15
- psychopy/sound/audiodevice.py +1 -1
- psychopy/sound/backend_ptb.py +53 -321
- psychopy/sound/backend_pygame.py +7 -3
- psychopy/sound/backend_pyo.py +53 -22
- psychopy/sound/backend_pysound.py +10 -27
- psychopy/sound/backend_sounddevice.py +33 -21
- psychopy/sound/exceptions.py +1 -1
- psychopy/sound/microphone.py +83 -5
- psychopy/sound/transcribe.py +3 -3
- psychopy/tests/data/test_basic_run.py +1 -0
- psychopy/tests/data/test_sounds/default_16000.wav +0 -0
- psychopy/tests/data/test_sounds/default_192000.wav +0 -0
- psychopy/tests/data/test_sounds/default_22050.wav +0 -0
- psychopy/tests/data/test_sounds/default_32000.wav +0 -0
- psychopy/tests/data/test_sounds/default_44100.wav +0 -0
- psychopy/tests/data/test_sounds/default_48000.wav +0 -0
- psychopy/tests/data/test_sounds/default_8000.wav +0 -0
- psychopy/tests/data/test_sounds/default_96000.wav +0 -0
- psychopy/tests/test_alerts/test_alerttools.py +2 -1
- psychopy/tests/test_app/test_command_line.py +65 -0
- psychopy/tests/test_data/test_TrialHandler2.py +18 -7
- psychopy/tests/test_demos/test_builder_demos.py +1 -1
- psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
- psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
- psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
- psychopy/tests/test_experiment/test_loops.py +12 -4
- psychopy/tests/test_experiment/test_params.py +17 -4
- psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
- psychopy/tests/test_hardware/test_photodiode.py +66 -0
- psychopy/tests/test_liaison/test_Liaison.py +4 -4
- psychopy/tests/test_misc/test_clock.py +2 -0
- psychopy/tests/test_misc/test_color.py +2 -0
- psychopy/tests/test_misc/test_event.py +1 -0
- psychopy/tests/test_plugins/__init__.py +0 -0
- psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
- psychopy/tests/test_sound/test_sound.py +111 -40
- psychopy/tests/test_tools/test_colorspacetools.py +24 -23
- psychopy/tests/test_tools/test_mathtools.py +9 -9
- psychopy/tests/test_tools/test_viewtools.py +101 -0
- psychopy/tests/test_validators/__init__.py +0 -0
- psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
- psychopy/tests/test_visual/test_all_stimuli.py +2 -2
- psychopy/tests/test_visual/test_basevisual.py +37 -7
- psychopy/tests/test_visual/test_button.py +2 -2
- psychopy/tests/test_visual/test_circle.py +10 -2
- psychopy/tests/test_visual/test_dots.py +1 -1
- psychopy/tests/test_visual/test_form.py +13 -13
- psychopy/tests/test_visual/test_gamma.py +3 -3
- psychopy/tests/test_visual/test_image.py +2 -2
- psychopy/tests/test_visual/test_progress.py +2 -2
- psychopy/tests/test_visual/test_roi.py +8 -2
- psychopy/tests/test_visual/test_shape.py +2 -2
- psychopy/tests/test_visual/test_slider.py +2 -2
- psychopy/tests/test_visual/test_target.py +2 -2
- psychopy/tests/test_visual/test_textbox.py +6 -8
- psychopy/tests/test_visual/test_winScalePos.py +6 -5
- psychopy/tests/test_visual/test_window.py +17 -0
- psychopy/tests/utils.py +51 -1
- psychopy/tools/__init__.py +1 -1
- psychopy/tools/arraytools.py +2 -2
- psychopy/tools/attributetools.py +52 -1
- psychopy/tools/audiotools.py +4 -1
- psychopy/tools/colorspacetools.py +6 -4
- psychopy/tools/coordinatetools.py +1 -1
- psychopy/tools/fileerrortools.py +21 -9
- psychopy/tools/filetools.py +2 -2
- psychopy/tools/fontmanager.py +47 -28
- psychopy/tools/gltools.py +2964 -558
- psychopy/tools/imagetools.py +1 -1
- psychopy/tools/mathtools.py +997 -127
- psychopy/tools/monitorunittools.py +7 -1
- psychopy/tools/movietools.py +1 -2
- psychopy/tools/pkgtools.py +157 -127
- psychopy/tools/plottools.py +1 -1
- psychopy/tools/rifttools.py +1 -1
- psychopy/tools/stereotools.py +1 -1
- psychopy/tools/stimulustools.py +172 -2
- psychopy/tools/stringtools.py +22 -2
- psychopy/tools/systemtools.py +1 -1
- psychopy/tools/typetools.py +1 -1
- psychopy/tools/unittools.py +1 -1
- psychopy/tools/versionchooser.py +3 -1
- psychopy/tools/viewtools.py +54 -70
- psychopy/tools/wizard.py +2 -2
- psychopy/validation/__init__.py +6 -0
- psychopy/validation/audio.py +74 -0
- psychopy/validation/visual.py +115 -0
- psychopy/visual/__init__.py +1 -4
- psychopy/visual/aperture.py +9 -6
- psychopy/visual/backends/__init__.py +1 -1
- psychopy/visual/backends/_base.py +1 -1
- psychopy/visual/backends/gamma.py +1 -1
- psychopy/visual/backends/glfwbackend.py +8 -12
- psychopy/visual/backends/pygamebackend.py +1 -1
- psychopy/visual/backends/pygletbackend.py +32 -11
- psychopy/visual/basevisual.py +93 -13
- psychopy/visual/brush.py +1 -1
- psychopy/visual/bufferimage.py +90 -10
- psychopy/visual/button.py +1 -1
- psychopy/visual/circle.py +12 -20
- psychopy/visual/custommouse.py +1 -1
- psychopy/visual/dot.py +80 -14
- psychopy/visual/elementarray.py +84 -10
- psychopy/visual/filters.py +1 -1
- psychopy/visual/form.py +43 -28
- psychopy/visual/grating.py +105 -25
- psychopy/visual/helpers.py +1 -1
- psychopy/visual/image.py +98 -20
- psychopy/visual/line.py +15 -25
- psychopy/visual/movie.py +1 -1
- psychopy/visual/movie2.py +4 -3
- psychopy/visual/movie3.py +4 -3
- psychopy/visual/movies/__init__.py +1 -1
- psychopy/visual/movies/frame.py +1 -1
- psychopy/visual/movies/metadata.py +1 -1
- psychopy/visual/movies/players/__init__.py +1 -1
- psychopy/visual/movies/players/_base.py +1 -1
- psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
- psychopy/visual/nnlvs.py +9 -6
- psychopy/visual/noise.py +4 -16
- psychopy/visual/patch.py +4 -3
- psychopy/visual/pie.py +3 -14
- psychopy/visual/polygon.py +21 -28
- psychopy/visual/radial.py +4 -18
- psychopy/visual/ratingscale.py +4 -3
- psychopy/visual/rect.py +16 -25
- psychopy/visual/rift.py +8 -2
- psychopy/visual/secondorder.py +4 -16
- psychopy/visual/shaders.py +620 -286
- psychopy/visual/shape.py +281 -90
- psychopy/visual/simpleimage.py +1 -1
- psychopy/visual/slider.py +78 -25
- psychopy/visual/stim3d.py +5 -608
- psychopy/visual/text.py +13 -3
- psychopy/visual/textbox2/textbox2.py +188 -56
- psychopy/visual/vlcmoviestim.py +1 -1
- psychopy/visual/window.py +373 -200
- psychopy/web.py +1 -1
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/RECORD +644 -621
- psychopy/.DS_Store +0 -0
- psychopy/__init__.py.orig +0 -65
- psychopy/app/.DS_Store +0 -0
- psychopy/app/Resources/.DS_Store +0 -0
- psychopy/app/Resources/classic/filecsv16.png +0 -0
- psychopy/app/Resources/classic/fileimage16.png +0 -0
- psychopy/app/Resources/classic/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/filecsv16.png +0 -0
- psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage16.png +0 -0
- psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
- psychopy/app/Resources/light/filecsv16.png +0 -0
- psychopy/app/Resources/light/filecsv16@2x.png +0 -0
- psychopy/app/Resources/light/fileimage16.png +0 -0
- psychopy/app/Resources/light/fileimage16@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown16.png +0 -0
- psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/psychopySplash.png +0 -0
- psychopy/app/Resources/psychopySplash@2x.png +0 -0
- psychopy/app/builder/builder.py.orig +0 -3932
- psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
- psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
- psychopy/app/colorpicker/__init__.py.orig +0 -411
- psychopy/app/locale/ar_001/.DS_Store +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
- psychopy/demos/builder/Experiments/.DS_Store +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
- psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
- psychopy/demos/builder/Tools/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/coder/.DS_Store +0 -0
- psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
- psychopy/demos/coder/iohub/.iohpid +0 -1
- psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
- psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
- psychopy/demos/coder/stimuli/.DS_Store +0 -0
- psychopy/experiment/_experiment.py.orig +0 -1032
- psychopy/experiment/components/.DS_Store +0 -0
- psychopy/experiment/components/_base.py.orig +0 -823
- psychopy/experiment/components/form/.DS_Store +0 -0
- psychopy/experiment/components/microphone/__init__.py.orig +0 -490
- psychopy/experiment/components/settings/__init__.py.orig +0 -1337
- psychopy/experiment/components/textbox/__init__.py.orig +0 -310
- psychopy/experiment/components/webcam/.DS_Store +0 -0
- psychopy/experiment/components/webcam/light/.DS_Store +0 -0
- psychopy/experiment/loops.py.orig +0 -829
- psychopy/experiment/params.py.orig +0 -408
- psychopy/experiment/routine.py.orig +0 -503
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
- psychopy/hardware/.DS_Store +0 -0
- psychopy/hardware/brainproducts.py.orig +0 -680
- psychopy/hardware/iolab.py.orig +0 -238
- psychopy/iohub/datastore/__init__.py.orig +0 -443
- psychopy/iohub/datastore/util.py.orig +0 -692
- psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
- psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
- psychopy/preferences/.DS_Store +0 -0
- psychopy/projects/pavlovia.py.orig +0 -1295
- psychopy/tests/.DS_Store +0 -0
- psychopy/tests/data/.DS_Store +0 -0
- psychopy/tests/data/TestCircle_fill_local.png +0 -0
- psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
- psychopy/tests/data/aperture1_norm_local.png +0 -0
- psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_height_local.png +0 -0
- psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_norm_local.png +0 -0
- psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
- psychopy/tests/data/blend_add_height_local.png +0 -0
- psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
- psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
- psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
- psychopy/tests/data/blend_add_norm_local.png +0 -0
- psychopy/tests/data/blend_add_stencil_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
- psychopy/tests/data/circleHex_height_local.png +0 -0
- psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
- psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
- psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
- psychopy/tests/data/circleHex_norm_local.png +0 -0
- psychopy/tests/data/circleHex_stencil_local.png +0 -0
- psychopy/tests/data/color_comparison_local.png +0 -0
- psychopy/tests/data/correctScript/.DS_Store +0 -0
- psychopy/tests/data/dots_height_local.png +0 -0
- psychopy/tests/data/dots_normAddBlend_local.png +0 -0
- psychopy/tests/data/dots_normHexbackground_local.png +0 -0
- psychopy/tests/data/dots_normNoShade_local.png +0 -0
- psychopy/tests/data/dots_norm_local.png +0 -0
- psychopy/tests/data/dots_stencil_local.png +0 -0
- psychopy/tests/data/elarray1_height_local.png +0 -0
- psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
- psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
- psychopy/tests/data/elarray1_norm_local.png +0 -0
- psychopy/tests/data/elarray1_stencil_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
- psychopy/tests/data/gabor1_height_local.png +0 -0
- psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
- psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
- psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
- psychopy/tests/data/gabor1_norm_local.png +0 -0
- psychopy/tests/data/gabor1_stencil_local.png +0 -0
- psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_height_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
- psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
- psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
- psychopy/tests/data/movFrame1_stencil_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/numpyImage_height_local.png +0 -0
- psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
- psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
- psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
- psychopy/tests/data/numpyImage_norm_local.png +0 -0
- psychopy/tests/data/numpyImage_stencil_local.png +0 -0
- psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
- psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
- psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
- psychopy/tests/data/shape2_1_norm_local.png +0 -0
- psychopy/tests/data/shape2_1_stencil_local.png +0 -0
- psychopy/tests/data/text1_height_local.png +0 -0
- psychopy/tests/data/text1_normAddBlend_local.png +0 -0
- psychopy/tests/data/text1_normHexbackground_local.png +0 -0
- psychopy/tests/data/text1_norm_local.png +0 -0
- psychopy/tests/data/text1_stencil_local.png +0 -0
- psychopy/tests/data/wedge1_height_local.png +0 -0
- psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
- psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
- psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
- psychopy/tests/data/wedge1_norm_local.png +0 -0
- psychopy/tests/data/wedge1_stencil_local.png +0 -0
- psychopy/tests/test_app/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
- psychopy/tests/test_data/.DS_Store +0 -0
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
- psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
- psychopy/tests/test_visual/test_image.py.orig +0 -219
- psychopy/visual/basevisual.py.orig +0 -1723
- psychopy/visual/form.py.orig +0 -1181
- psychopy/visual/text.py.orig +0 -752
- psychopy/visual/textbox2/textbox2.py.orig +0 -1315
- psychopy/visual/windowwarp.py.orig +0 -463
- /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
- /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -114,34 +114,35 @@ def test_srgbTF():
|
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
@pytest.mark.colorspacetools
|
|
117
|
-
def
|
|
118
|
-
"""Test the CIE-
|
|
119
|
-
|
|
117
|
+
def test_cielch2rgb():
|
|
118
|
+
"""Test the CIE-LCh to linear RGB function.
|
|
120
119
|
"""
|
|
121
|
-
# preset CIE-
|
|
122
|
-
|
|
123
|
-
[0.0,
|
|
124
|
-
[100.0, 0.0,
|
|
125
|
-
[53.
|
|
126
|
-
[
|
|
127
|
-
[
|
|
128
|
-
[
|
|
129
|
-
[
|
|
130
|
-
[60.
|
|
120
|
+
# preset CIE-LCh colors
|
|
121
|
+
cielchColors = np.array([
|
|
122
|
+
[0.0, 0.0, 0.0], # black
|
|
123
|
+
[100.0, 0.0, 0.0], # white
|
|
124
|
+
[53.241, 104.552, 39.999], # red
|
|
125
|
+
[97.139, 96.905, 102.851], # yellow
|
|
126
|
+
[87.735, 119.776, 136.016], # green
|
|
127
|
+
[91.113, 50.121, 196.376], # cyan
|
|
128
|
+
[32.297, 133.808, 306.285], # blue
|
|
129
|
+
[60.324, 115.541, 328.235] # magenta
|
|
131
130
|
])
|
|
131
|
+
|
|
132
|
+
# test conversion using PsyhoPy RGB [-1:1] values
|
|
132
133
|
rgbExpected = np.array([
|
|
133
|
-
[-1
|
|
134
|
-
[
|
|
135
|
-
[1
|
|
136
|
-
[
|
|
137
|
-
[-1
|
|
138
|
-
[1
|
|
139
|
-
[-1
|
|
140
|
-
[1
|
|
134
|
+
[-1.0, -1.0, -1.0], # black
|
|
135
|
+
[ 1.0, 1.0, 1.0], # white
|
|
136
|
+
[ 1.0, -1.0, -1.0], # red
|
|
137
|
+
[ 1.0, 1.0, -1.0], # yellow
|
|
138
|
+
[-1.0, 1.0, -1.0], # green
|
|
139
|
+
[-1.0, 1.0, 1.0], # cyan
|
|
140
|
+
[-1.0, -1.0, 1.0], # blue
|
|
141
|
+
[ 1.0, -1.0, 1.0] # magenta
|
|
141
142
|
])
|
|
142
143
|
|
|
143
|
-
#
|
|
144
|
-
rgbOutD65 =
|
|
144
|
+
# do the conversion
|
|
145
|
+
rgbOutD65 = cielch2rgb(cielchColors)
|
|
145
146
|
assert np.allclose(rgbOutD65, rgbExpected, atol=0.01)
|
|
146
147
|
|
|
147
148
|
|
|
@@ -570,7 +570,7 @@ def test_invertMatrix():
|
|
|
570
570
|
# check homogeneous inverse
|
|
571
571
|
ident = np.identity(4)
|
|
572
572
|
for i in range(N):
|
|
573
|
-
r = rotationMatrix(angles[i], axes[i, :])
|
|
573
|
+
r = rotationMatrix(angles[i].item(), axes[i, :])
|
|
574
574
|
|
|
575
575
|
assert isOrthogonal(r)
|
|
576
576
|
|
|
@@ -593,7 +593,7 @@ def test_invertMatrix():
|
|
|
593
593
|
inv = np.zeros((4, 4))
|
|
594
594
|
ident = np.identity(4)
|
|
595
595
|
for i in range(N):
|
|
596
|
-
rotationMatrix(angles[i], axes[i, :], out=rout)
|
|
596
|
+
rotationMatrix(angles[i].item(), axes[i, :], out=rout)
|
|
597
597
|
|
|
598
598
|
assert isOrthogonal(rout)
|
|
599
599
|
|
|
@@ -615,23 +615,23 @@ def test_invertMatrix():
|
|
|
615
615
|
eyeOffsets = np.random.uniform(-0.1, 0.1, (N,))
|
|
616
616
|
|
|
617
617
|
for i in range(N):
|
|
618
|
-
scrWidth = scrDims[i, 0]
|
|
619
|
-
scrAspect =
|
|
620
|
-
viewDist = viewDists[i]
|
|
618
|
+
scrWidth = scrDims[i, 0].item()
|
|
619
|
+
scrAspect = scrWidth / scrDims[i, 1].item()
|
|
620
|
+
viewDist = viewDists[i].item()
|
|
621
621
|
|
|
622
622
|
# nearClip some distance between screen and eye
|
|
623
|
-
nearClip = np.random.uniform(0.1, viewDist, (1,))
|
|
623
|
+
nearClip = np.random.uniform(0.1, viewDist, (1,)).item()
|
|
624
624
|
|
|
625
625
|
# nearClip some distance beyond screen
|
|
626
626
|
fcMin = viewDist + nearClip
|
|
627
|
-
farClip = np.random.uniform(fcMin, 1000.0, (1,))
|
|
627
|
+
farClip = np.random.uniform(fcMin, 1000.0, (1,)).item()
|
|
628
628
|
|
|
629
629
|
# get projection matrix
|
|
630
630
|
frustum = computeFrustum(
|
|
631
631
|
scrWidth,
|
|
632
632
|
scrAspect,
|
|
633
633
|
viewDist,
|
|
634
|
-
eyeOffset=eyeOffsets[i],
|
|
634
|
+
eyeOffset=eyeOffsets[i].item(),
|
|
635
635
|
nearClip=nearClip,
|
|
636
636
|
farClip=farClip)
|
|
637
637
|
|
|
@@ -639,7 +639,7 @@ def test_invertMatrix():
|
|
|
639
639
|
assert not isAffine(proj)
|
|
640
640
|
|
|
641
641
|
# create affine view matrix
|
|
642
|
-
r = rotationMatrix(angles[i], axes[i, :])
|
|
642
|
+
r = rotationMatrix(angles[i].item(), axes[i, :])
|
|
643
643
|
assert isOrthogonal(r)
|
|
644
644
|
|
|
645
645
|
t = translationMatrix(trans[i, :])
|
|
@@ -2,11 +2,110 @@
|
|
|
2
2
|
"""Tests for psychopy.tools.viewtools
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from psychopy.tools.mathtools import alignTo, lookAt, distance
|
|
5
6
|
from psychopy.tools.viewtools import *
|
|
6
7
|
import numpy as np
|
|
7
8
|
import pytest
|
|
8
9
|
|
|
9
10
|
|
|
11
|
+
@pytest.mark.viewtools
|
|
12
|
+
def test_visualAngle():
|
|
13
|
+
"""Test visual angle calculation.
|
|
14
|
+
|
|
15
|
+
This tests the visual angle calculation for a few values. The test is
|
|
16
|
+
performed by converting the visual angle back to a distance and checking if
|
|
17
|
+
it is the same as the original distance.
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
# test calculation against value computed by hand
|
|
21
|
+
# obj distance = 0.57m, obj size = 0.01m
|
|
22
|
+
assert np.isclose(visualAngle(0.01, 0.57), 1.0051633) # ~1 degree
|
|
23
|
+
|
|
24
|
+
# test input vectorization
|
|
25
|
+
N = 1000
|
|
26
|
+
np.random.seed(12345)
|
|
27
|
+
distances = np.random.uniform(0.1, 100.0, (N,))
|
|
28
|
+
sizes = np.random.uniform(0.01, 10.0, (N,))
|
|
29
|
+
|
|
30
|
+
a = visualAngle(sizes, distances)
|
|
31
|
+
b = visualAngle(sizes, 0.57)
|
|
32
|
+
c = visualAngle(1.0, distances)
|
|
33
|
+
|
|
34
|
+
# make sure no values are >180 degrees or less than 0
|
|
35
|
+
assert np.all(a <= 180) and np.all(b <= 180) and np.all(c <= 180)
|
|
36
|
+
assert np.all(a >= 0) and np.all(b >= 0) and np.all(c >= 0)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.mark.viewtools
|
|
40
|
+
def test_viewMatrix():
|
|
41
|
+
"""Test view matrix generation.
|
|
42
|
+
|
|
43
|
+
This create a view matrix using `lookAt` and `viewMatrix` and checks if
|
|
44
|
+
they look at the same point.
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
N = 1000
|
|
48
|
+
np.random.seed(12345)
|
|
49
|
+
targets = np.random.uniform(-100., 100., (N, 3,))
|
|
50
|
+
origin = [0, 0, 0]
|
|
51
|
+
orthoProj = orthoProjectionMatrix(-1, 1, -1, 1, 0.1, 100)
|
|
52
|
+
|
|
53
|
+
for i in range(N):
|
|
54
|
+
target = targets[i].tolist()
|
|
55
|
+
|
|
56
|
+
# View matrix generation using a quaternion will be canted, but will
|
|
57
|
+
# center on the same point
|
|
58
|
+
V0 = viewMatrix(origin, alignTo([0, 0, -1], target))
|
|
59
|
+
|
|
60
|
+
# Use `lookAt` to generate a view matrix, same as `gluLookAt`
|
|
61
|
+
V1 = lookAt(origin, target, [0, 1, 0])
|
|
62
|
+
|
|
63
|
+
# Check if the the matricies look at the same point if we project the
|
|
64
|
+
# target to NDC space. They should both be near the very center of the
|
|
65
|
+
# screen
|
|
66
|
+
posOut0 = pointToNdc(target, V0, orthoProj)
|
|
67
|
+
posOut1 = pointToNdc(target, V1, orthoProj)
|
|
68
|
+
|
|
69
|
+
assert np.isclose(posOut0, posOut1).all()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@pytest.mark.viewtools
|
|
73
|
+
def test_projectFrustumToPlane():
|
|
74
|
+
"""Test the projection of the frustum to a plane.
|
|
75
|
+
"""
|
|
76
|
+
N = 1000
|
|
77
|
+
np.random.seed(12345)
|
|
78
|
+
nearClip = 0.025
|
|
79
|
+
scrDims = np.random.uniform(0.01, 10.0, (N, 2,))
|
|
80
|
+
viewDists = np.random.uniform(nearClip, 10.0, (N,))
|
|
81
|
+
eyeOffsets = np.random.uniform(-0.1, 0.1, (N,))
|
|
82
|
+
|
|
83
|
+
for i in range(N):
|
|
84
|
+
scrWidth = scrDims[i, 0]
|
|
85
|
+
scrAspect = scrDims[i, 0] / scrDims[i, 1]
|
|
86
|
+
scrHeight = scrWidth * (1.0 / scrAspect)
|
|
87
|
+
viewDist = viewDists[i]
|
|
88
|
+
|
|
89
|
+
farClip = viewDist
|
|
90
|
+
|
|
91
|
+
frustum = computeFrustum(
|
|
92
|
+
scrWidth,
|
|
93
|
+
scrAspect,
|
|
94
|
+
viewDist,
|
|
95
|
+
eyeOffset=eyeOffsets[i],
|
|
96
|
+
nearClip=nearClip,
|
|
97
|
+
farClip=farClip)
|
|
98
|
+
|
|
99
|
+
frustum = [v.item() for v in frustum]
|
|
100
|
+
|
|
101
|
+
topLeft, bottomLeft, _, topRight = projectFrustumToPlane(
|
|
102
|
+
frustum, viewDist)
|
|
103
|
+
|
|
104
|
+
# should match the screen dimensions
|
|
105
|
+
assert (np.isclose(distance(topLeft, topRight), scrWidth) and
|
|
106
|
+
np.isclose(distance(topLeft, bottomLeft), scrHeight))
|
|
107
|
+
|
|
108
|
+
|
|
10
109
|
@pytest.mark.viewtools
|
|
11
110
|
def test_frustumToProjectionMatrix():
|
|
12
111
|
"""Ensure the `computeFrustum` + `perspectiveProjectionMatrix` and
|
|
@@ -40,6 +139,8 @@ def test_frustumToProjectionMatrix():
|
|
|
40
139
|
eyeOffset=eyeOffsets[i],
|
|
41
140
|
nearClip=nearClip,
|
|
42
141
|
farClip=farClip)
|
|
142
|
+
|
|
143
|
+
frustum = [v.item() for v in frustum] # ensure scalars
|
|
43
144
|
|
|
44
145
|
P = perspectiveProjectionMatrix(*frustum)
|
|
45
146
|
|
|
File without changes
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from psychopy import core, constants, sound, validation
|
|
3
|
+
from psychopy.hardware import microphone, soundsensor, DeviceManager
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.needs_sound
|
|
7
|
+
class TestAudioValidator:
|
|
8
|
+
def setup_class(cls):
|
|
9
|
+
cls.vk = cls.speaker = None
|
|
10
|
+
# find best vk/speaker pair to use
|
|
11
|
+
for profile in DeviceManager.getAvailableDevices(
|
|
12
|
+
"psychopy.hardware.soundsensor.MicrophoneSoundSensorEmulator"
|
|
13
|
+
):
|
|
14
|
+
# setup sound sensor
|
|
15
|
+
try:
|
|
16
|
+
# make sure the mic exists
|
|
17
|
+
if not DeviceManager.getDevice(profile['device']):
|
|
18
|
+
for micProfile in DeviceManager.getAvailableDevices(
|
|
19
|
+
"psychopy.hardware.microphone.MicrophoneDevice"
|
|
20
|
+
):
|
|
21
|
+
if micProfile['index'] == profile['device']:
|
|
22
|
+
DeviceManager.addDevice(**micProfile)
|
|
23
|
+
# create sound sensor emulator
|
|
24
|
+
vk = DeviceManager.addDevice(**profile)
|
|
25
|
+
except Exception as err:
|
|
26
|
+
continue
|
|
27
|
+
# find matching speakers
|
|
28
|
+
foundSpeakers = vk.findSpeakers(channel=0)
|
|
29
|
+
# check that speakers can be initialised
|
|
30
|
+
for speaker in foundSpeakers:
|
|
31
|
+
try:
|
|
32
|
+
sound.Sound("A", speaker=speaker)
|
|
33
|
+
except:
|
|
34
|
+
continue
|
|
35
|
+
else:
|
|
36
|
+
# if successful, we have a matching pair!
|
|
37
|
+
cls.speaker = speaker
|
|
38
|
+
cls.vk = vk
|
|
39
|
+
# skip if no devices were found
|
|
40
|
+
if cls.vk is None or cls.speaker is None:
|
|
41
|
+
pytest.skip()
|
|
42
|
+
# create validator
|
|
43
|
+
cls.validator = validation.AudioValidator(cls.vk)
|
|
44
|
+
|
|
45
|
+
def test_soundHeard(self):
|
|
46
|
+
"""
|
|
47
|
+
Check that the sound sensor validator detects a sound played from an audible speaker.
|
|
48
|
+
"""
|
|
49
|
+
# setup timing
|
|
50
|
+
clock = core.Clock()
|
|
51
|
+
self.validator.resetTimer(clock)
|
|
52
|
+
t = 0
|
|
53
|
+
# setup sound
|
|
54
|
+
snd = sound.Sound("A", speaker=self.speaker)
|
|
55
|
+
snd.tStart = snd.tStop = None
|
|
56
|
+
# set starting statuses
|
|
57
|
+
snd.status = self.validator.status = constants.NOT_STARTED
|
|
58
|
+
# begin a frame loop
|
|
59
|
+
while t < 3:
|
|
60
|
+
t = clock.getTime()
|
|
61
|
+
# validate start
|
|
62
|
+
if self.validator.status == constants.STARTED and snd.status == constants.STARTED:
|
|
63
|
+
self.validator.tStart, self.validator.valid = self.validator.validate(
|
|
64
|
+
state=True,
|
|
65
|
+
t=snd.tStart,
|
|
66
|
+
adjustment=0.12
|
|
67
|
+
)
|
|
68
|
+
if self.validator.tStart:
|
|
69
|
+
self.validator.status = constants.FINISHED
|
|
70
|
+
assert self.validator.valid
|
|
71
|
+
# validate stop
|
|
72
|
+
if self.validator.status == constants.STARTED and snd.status == constants.FINISHED:
|
|
73
|
+
self.validator.tStop, self.validator.valid = self.validator.validate(
|
|
74
|
+
state=False,
|
|
75
|
+
t=snd.tStop,
|
|
76
|
+
adjustment=0
|
|
77
|
+
)
|
|
78
|
+
if self.validator.tStop:
|
|
79
|
+
self.validator.status = constants.FINISHED
|
|
80
|
+
assert self.validator.valid
|
|
81
|
+
# start sound
|
|
82
|
+
if snd.status == constants.NOT_STARTED and t > 1:
|
|
83
|
+
snd.play()
|
|
84
|
+
snd.tStart = t
|
|
85
|
+
snd.status = constants.STARTED
|
|
86
|
+
self.validator.status = constants.STARTED
|
|
87
|
+
# stop sound
|
|
88
|
+
if snd.status == constants.STARTED and t > 2:
|
|
89
|
+
snd.stop()
|
|
90
|
+
snd.tStop = t
|
|
91
|
+
snd.status = constants.FINISHED
|
|
92
|
+
self.validator.status = constants.STARTED
|
|
93
|
+
# make sure the validator got some times
|
|
94
|
+
assert self.validator.tStart is not None
|
|
95
|
+
assert self.validator.tStop is not None
|
|
@@ -227,7 +227,7 @@ class _baseVisualTest():
|
|
|
227
227
|
def test_text(self):
|
|
228
228
|
win = self.win
|
|
229
229
|
#set font
|
|
230
|
-
fontFile = str(
|
|
230
|
+
fontFile = str(utils.TESTS_FONT)
|
|
231
231
|
#using init
|
|
232
232
|
stim = visual.TextStim(win,text=u'\u03A8a', color=[0.5, 1.0, 1.0], ori=15,
|
|
233
233
|
height=0.8*self.scaleFactor, pos=[0,0], font='DejaVu Serif',
|
|
@@ -395,7 +395,7 @@ class _baseVisualTest():
|
|
|
395
395
|
"dots._dotsDir failed to change after dots.setDir()"
|
|
396
396
|
assert prevSignals.sum()!=dots._signalDots.sum(), \
|
|
397
397
|
"dots._signalDots failed to change after dots.setCoherence()"
|
|
398
|
-
assert not numpy.
|
|
398
|
+
assert not numpy.all(prevVerticesPix==dots.verticesPix), \
|
|
399
399
|
"dots.verticesPix failed to change after dots.setPos()"
|
|
400
400
|
|
|
401
401
|
def test_element_array(self):
|
|
@@ -1,14 +1,40 @@
|
|
|
1
1
|
import json
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
2
|
import pytest
|
|
5
|
-
|
|
6
|
-
from psychopy import colors
|
|
7
|
-
from psychopy.monitors import Monitor
|
|
3
|
+
import importlib
|
|
8
4
|
from copy import copy
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from psychopy import visual, layout, event, colors
|
|
7
|
+
from psychopy.tools.stimulustools import serialize, actualize
|
|
8
|
+
from psychopy.monitors import Monitor
|
|
9
9
|
from psychopy.tests import utils
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
class _TestSerializationMixin:
|
|
13
|
+
"""
|
|
14
|
+
Tests that stimuli can be serialized and recreated from serialized form.
|
|
15
|
+
"""
|
|
16
|
+
# placeholders for object and window
|
|
17
|
+
obj = None
|
|
18
|
+
win = None
|
|
19
|
+
|
|
20
|
+
def test_serialization(self):
|
|
21
|
+
# skip if we don't have an object
|
|
22
|
+
if self.obj is None or self.win is None:
|
|
23
|
+
pytest.skip()
|
|
24
|
+
# start by flipping the window
|
|
25
|
+
self.win.flip()
|
|
26
|
+
# serialize object
|
|
27
|
+
params = serialize(self.obj, includeClass=True)
|
|
28
|
+
# substitute win
|
|
29
|
+
params['win'] = self.win
|
|
30
|
+
# recreate object from params
|
|
31
|
+
dupe = actualize(params)
|
|
32
|
+
# check object is same class
|
|
33
|
+
assert isinstance(dupe, type(self.obj))
|
|
34
|
+
# delete duplicate
|
|
35
|
+
del dupe
|
|
36
|
+
|
|
37
|
+
|
|
12
38
|
class _TestColorMixin:
|
|
13
39
|
# Define expected values for different spaces
|
|
14
40
|
colorExemplars = [
|
|
@@ -61,6 +87,10 @@ class _TestColorMixin:
|
|
|
61
87
|
# If this test object has no obj, skip
|
|
62
88
|
if not self.obj:
|
|
63
89
|
return
|
|
90
|
+
|
|
91
|
+
if hasattr(self, 'resetObj'):
|
|
92
|
+
self.resetObj() # reset the stimulus object before this test
|
|
93
|
+
|
|
64
94
|
# Test each case
|
|
65
95
|
for case in self.colorTykes + self.colorExemplars:
|
|
66
96
|
for space, color in case.items():
|
|
@@ -478,7 +508,7 @@ class _TestUnitsMixin:
|
|
|
478
508
|
obj.win = win
|
|
479
509
|
obj.units = objunits
|
|
480
510
|
# Add a label for the units
|
|
481
|
-
label = visual.TextBox2(win, text=f"Window: {winunits}, Slider: {objunits}", font="
|
|
511
|
+
label = visual.TextBox2(win, text=f"Window: {winunits}, Slider: {objunits}", font="Noto Sans",
|
|
482
512
|
anchor="top-center", alignment="center top", padding=0.05, units="norm",
|
|
483
513
|
pos=(0, 1))
|
|
484
514
|
# Add instructions
|
|
@@ -486,7 +516,7 @@ class _TestUnitsMixin:
|
|
|
486
516
|
text=(
|
|
487
517
|
f"Press ENTER if object is functioning as intended, otherwise press "
|
|
488
518
|
f"any other key."
|
|
489
|
-
), font="
|
|
519
|
+
), font="Noto Sans", anchor="top-center", alignment="center bottom",
|
|
490
520
|
padding=0.05, units="norm", pos=(0, -1))
|
|
491
521
|
# Draw loop until button is pressed
|
|
492
522
|
keys = []
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from psychopy import visual
|
|
2
|
-
from psychopy.tests.test_visual.test_basevisual import _TestColorMixin
|
|
2
|
+
from psychopy.tests.test_visual.test_basevisual import _TestColorMixin, _TestSerializationMixin
|
|
3
3
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class TestButton(_TestColorMixin, _TestBoilerplateMixin):
|
|
6
|
+
class TestButton(_TestColorMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
7
7
|
|
|
8
8
|
@classmethod
|
|
9
9
|
def setup_class(self):
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
|
+
import copy
|
|
4
5
|
from psychopy import visual
|
|
5
|
-
from .test_basevisual import _TestColorMixin, _TestUnitsMixin
|
|
6
|
+
from .test_basevisual import _TestColorMixin, _TestUnitsMixin, _TestSerializationMixin
|
|
6
7
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
7
8
|
from .. import utils
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
11
|
+
class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
11
12
|
|
|
12
13
|
@classmethod
|
|
13
14
|
def setup_class(self):
|
|
@@ -24,6 +25,12 @@ class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
|
24
25
|
# Shape has no foreground color
|
|
25
26
|
self.foreUsed = False
|
|
26
27
|
|
|
28
|
+
def resetObj(self):
|
|
29
|
+
"""Reset the stimulus to its initial state.
|
|
30
|
+
"""
|
|
31
|
+
self.obj = visual.Circle(
|
|
32
|
+
self.win, units="pix", pos=(0, 0), size=(128, 128), lineWidth=3)
|
|
33
|
+
|
|
27
34
|
def test_radius(self):
|
|
28
35
|
# Define some use cases
|
|
29
36
|
cases = [
|
|
@@ -64,3 +71,4 @@ class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
|
64
71
|
self.obj.draw()
|
|
65
72
|
# self.win.getMovieFrame(buffer='back').save(Path(utils.TESTS_DATA_PATH) / filename)
|
|
66
73
|
# utils.compareScreenshot(Path(utils.TESTS_DATA_PATH) / filename, self.win, crit=20)
|
|
74
|
+
|
|
@@ -7,7 +7,7 @@ from pathlib import Path
|
|
|
7
7
|
import pytest
|
|
8
8
|
from pandas import DataFrame
|
|
9
9
|
|
|
10
|
-
from psychopy.tests.test_visual.test_basevisual import _TestColorMixin
|
|
10
|
+
from psychopy.tests.test_visual.test_basevisual import _TestColorMixin, _TestSerializationMixin
|
|
11
11
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
12
12
|
from psychopy.visual.window import Window
|
|
13
13
|
from psychopy.visual.form import Form
|
|
@@ -19,7 +19,7 @@ from tempfile import mkdtemp
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
22
|
+
class Test_Form(_TestColorMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
23
23
|
"""Test suite for Form component"""
|
|
24
24
|
|
|
25
25
|
def setup_class(self):
|
|
@@ -129,7 +129,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
129
129
|
'itemWidth': 0.3,
|
|
130
130
|
'responseColor': 'darkred',
|
|
131
131
|
'responseWidth': 0.7,
|
|
132
|
-
'font': '
|
|
132
|
+
'font': 'Noto Sans',
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
135
|
'index': 0,
|
|
@@ -141,7 +141,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
141
141
|
'itemWidth': 0.3,
|
|
142
142
|
'responseColor': 'darkslateblue',
|
|
143
143
|
'responseWidth': 0.7,
|
|
144
|
-
'font': '
|
|
144
|
+
'font': 'Noto Sans',
|
|
145
145
|
},
|
|
146
146
|
],
|
|
147
147
|
'bigItem': [ # Item is bigger than resp
|
|
@@ -155,7 +155,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
155
155
|
'itemWidth': 0.7,
|
|
156
156
|
'responseColor': 'darkred',
|
|
157
157
|
'responseWidth': 0.3,
|
|
158
|
-
'font': '
|
|
158
|
+
'font': 'Noto Sans',
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
161
|
'index': 0,
|
|
@@ -167,7 +167,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
167
167
|
'itemWidth': 0.7,
|
|
168
168
|
'responseColor': 'darkslateblue',
|
|
169
169
|
'responseWidth': 0.3,
|
|
170
|
-
'font': '
|
|
170
|
+
'font': 'Noto Sans',
|
|
171
171
|
},
|
|
172
172
|
],
|
|
173
173
|
}
|
|
@@ -183,7 +183,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
183
183
|
'itemWidth': 0.4,
|
|
184
184
|
'responseColor': 'darkred',
|
|
185
185
|
'responseWidth': 0.8,
|
|
186
|
-
'font': '
|
|
186
|
+
'font': 'Noto Sans',
|
|
187
187
|
},
|
|
188
188
|
{
|
|
189
189
|
'index': 0,
|
|
@@ -195,7 +195,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
195
195
|
'itemWidth': 0.4,
|
|
196
196
|
'responseColor': 'darkslateblue',
|
|
197
197
|
'responseWidth': 0.8,
|
|
198
|
-
'font': '
|
|
198
|
+
'font': 'Noto Sans',
|
|
199
199
|
},
|
|
200
200
|
],
|
|
201
201
|
'bigItemOverflow': [ # Item is bigger than resp, both together flow over form edge
|
|
@@ -209,7 +209,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
209
209
|
'itemWidth': 0.8,
|
|
210
210
|
'responseColor': 'darkred',
|
|
211
211
|
'responseWidth': 0.4,
|
|
212
|
-
'font': '
|
|
212
|
+
'font': 'Noto Sans',
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
'index': 0,
|
|
@@ -221,7 +221,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
221
221
|
'itemWidth': 0.8,
|
|
222
222
|
'responseColor': 'darkslateblue',
|
|
223
223
|
'responseWidth': 0.4,
|
|
224
|
-
'font': '
|
|
224
|
+
'font': 'Noto Sans',
|
|
225
225
|
},
|
|
226
226
|
],
|
|
227
227
|
}
|
|
@@ -262,7 +262,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
262
262
|
'itemWidth': 0.7,
|
|
263
263
|
'responseColor': 'darkred',
|
|
264
264
|
'responseWidth': 0.3,
|
|
265
|
-
'font': '
|
|
265
|
+
'font': 'Noto Sans',
|
|
266
266
|
})
|
|
267
267
|
# Create form
|
|
268
268
|
survey = Form(self.win, units="height", size=(1, 1), fillColor="white", items=items)
|
|
@@ -281,7 +281,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
281
281
|
'itemWidth': 0.7,
|
|
282
282
|
'responseColor': 'darkred',
|
|
283
283
|
'responseWidth': 0.3,
|
|
284
|
-
'font': '
|
|
284
|
+
'font': 'Noto Sans',
|
|
285
285
|
}]
|
|
286
286
|
# Typical points on slider to test
|
|
287
287
|
exemplars = [
|
|
@@ -360,7 +360,7 @@ class Test_Form(_TestColorMixin, _TestBoilerplateMixin):
|
|
|
360
360
|
|
|
361
361
|
def test_font(self):
|
|
362
362
|
exemplars = [
|
|
363
|
-
{"file": "form_font_demographics.xlsx", "font": "
|
|
363
|
+
{"file": "form_font_demographics.xlsx", "font": "Noto Sans",
|
|
364
364
|
"screenshot": "form_font_demographics.png"},
|
|
365
365
|
]
|
|
366
366
|
tykes = [
|
|
@@ -54,7 +54,7 @@ def test_monitorGetGamma():
|
|
|
54
54
|
mon.setGamma(gammaVal)
|
|
55
55
|
#create window using that monitor
|
|
56
56
|
win = visual.Window([100,100], monitor=mon, autoLog=False)
|
|
57
|
-
assert numpy.
|
|
57
|
+
assert numpy.all(win.gamma==gammaVal)
|
|
58
58
|
win.close()
|
|
59
59
|
|
|
60
60
|
|
|
@@ -69,7 +69,7 @@ def test_monitorGetGammaGrid():
|
|
|
69
69
|
mon = monitors.Monitor('test')
|
|
70
70
|
mon.setGammaGrid(newGrid)
|
|
71
71
|
win = visual.Window([100,100], monitor=mon, autoLog=False)
|
|
72
|
-
assert numpy.
|
|
72
|
+
assert numpy.all(win.gamma==numpy.array([2.0, 2.0, 2.0]))
|
|
73
73
|
win.close()
|
|
74
74
|
|
|
75
75
|
|
|
@@ -87,7 +87,7 @@ def test_monitorGetGammaAndGrid():
|
|
|
87
87
|
mon.setGamma([3,3,3])
|
|
88
88
|
#create window using that monitor
|
|
89
89
|
win = visual.Window([100,100], monitor=mon, autoLog=False)
|
|
90
|
-
assert numpy.
|
|
90
|
+
assert numpy.all(win.gamma==numpy.array([2.0, 2.0, 2.0]))
|
|
91
91
|
win.close()
|
|
92
92
|
|
|
93
93
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
3
|
from psychopy import visual, colors, core
|
|
4
|
-
from .test_basevisual import _TestUnitsMixin
|
|
4
|
+
from .test_basevisual import _TestUnitsMixin, _TestSerializationMixin
|
|
5
5
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
6
6
|
from psychopy.tests import utils
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
|
-
class TestImage(_TestUnitsMixin, _TestBoilerplateMixin):
|
|
9
|
+
class TestImage(_TestUnitsMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
10
10
|
"""
|
|
11
11
|
Test that images render as expected. Note: In BaseVisual tests, image colors will look different than
|
|
12
12
|
seems intuitive as foreColor will be set to `"blue"`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from psychopy import visual
|
|
2
|
-
from .test_basevisual import _TestColorMixin, _TestUnitsMixin
|
|
2
|
+
from .test_basevisual import _TestColorMixin, _TestUnitsMixin, _TestSerializationMixin
|
|
3
3
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
4
4
|
from psychopy.tests import utils
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class TestProgress(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
8
|
+
class TestProgress(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
9
9
|
|
|
10
10
|
@classmethod
|
|
11
11
|
def setup_class(cls):
|