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
|
@@ -63,7 +63,7 @@ class TestComponents():
|
|
|
63
63
|
pass
|
|
64
64
|
|
|
65
65
|
def test_component_attribs(self):
|
|
66
|
-
with io.open(self.baselineProfile, 'r', encoding='utf-8-sig') as f:
|
|
66
|
+
with io.open(self.baselineProfile, 'r', encoding='utf-8-sig', errors='ignore') as f:
|
|
67
67
|
target = f.read()
|
|
68
68
|
targetLines = target.splitlines()
|
|
69
69
|
targetTag = {}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from psychopy.experiment.components.routineSettings import RoutineSettingsComponent
|
|
5
|
+
from psychopy.tests.test_experiment.test_components.test_base_components import BaseComponentTests
|
|
6
|
+
from psychopy.tests import utils
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestRoutineSettingsComponent(BaseComponentTests):
|
|
10
|
+
comp = RoutineSettingsComponent
|
|
11
|
+
|
|
12
|
+
def test_disabled_code_muting(self):
|
|
13
|
+
"""
|
|
14
|
+
RoutineSettings doesn't work like a normal Component w/r/t disabling, so skip this test
|
|
15
|
+
"""
|
|
16
|
+
pytest.skip()
|
|
@@ -29,7 +29,7 @@ def test_all_components():
|
|
|
29
29
|
|
|
30
30
|
def test_all_have_depth():
|
|
31
31
|
# Define components which shouldn't have depth
|
|
32
|
-
exceptions = ("PanoramaComponent",)
|
|
32
|
+
exceptions = ("PanoramaComponent", "FaceAPIComponent")
|
|
33
33
|
# Create experiment
|
|
34
34
|
exp = experiment.Experiment()
|
|
35
35
|
rt = experiment.routines.Routine(exp=exp, name="testRoutine")
|
|
@@ -3,7 +3,9 @@ import esprima
|
|
|
3
3
|
import re
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
+
import esprima.error_handler
|
|
6
7
|
import pytest
|
|
8
|
+
import tempfile
|
|
7
9
|
|
|
8
10
|
from psychopy import experiment
|
|
9
11
|
from psychopy.experiment.loops import TrialHandler
|
|
@@ -27,7 +29,7 @@ def _find_global_resource_in_js_experiment(script, resource):
|
|
|
27
29
|
return present
|
|
28
30
|
|
|
29
31
|
# Extract resources def at start of experiment
|
|
30
|
-
resourcesStr = re.search("(?<=resources: \[)[^\]]*", script).group(0)
|
|
32
|
+
resourcesStr = re.search(r"(?<=resources: \[)[^\]]*", script).group(0)
|
|
31
33
|
# Return bool for whether specified resource is present
|
|
32
34
|
return resource in resourcesStr
|
|
33
35
|
|
|
@@ -43,6 +45,7 @@ class BaseComponentTests:
|
|
|
43
45
|
"""
|
|
44
46
|
# make blank experiment
|
|
45
47
|
exp = experiment.Experiment()
|
|
48
|
+
exp.name = "Test" + self.comp.__name__ + "MinimalExp"
|
|
46
49
|
# add a Routine
|
|
47
50
|
rt = exp.addRoutine(routineName='TestRoutine')
|
|
48
51
|
exp.flow.addRoutine(rt, 0)
|
|
@@ -68,6 +71,16 @@ class BaseComponentTests:
|
|
|
68
71
|
|
|
69
72
|
# --- Heritable tests ---
|
|
70
73
|
|
|
74
|
+
def test_syntax_errors(self):
|
|
75
|
+
"""
|
|
76
|
+
Create a basic implementation of this Component with everything set to defaults and check
|
|
77
|
+
whether the resulting code has syntax errors
|
|
78
|
+
"""
|
|
79
|
+
# create minimal experiment
|
|
80
|
+
comp, rt, exp = self.make_minimal_experiment()
|
|
81
|
+
# check syntax
|
|
82
|
+
utils.checkSyntax(exp, targets=self.comp.targets)
|
|
83
|
+
|
|
71
84
|
def test_icons(self):
|
|
72
85
|
"""
|
|
73
86
|
Check that Component has icons for each app theme and that these point to real files
|
|
@@ -169,11 +182,11 @@ class BaseComponentTests:
|
|
|
169
182
|
# define cases and expected start/dur
|
|
170
183
|
cases = [
|
|
171
184
|
# blank start
|
|
172
|
-
{'startVal': "", 'stopVal': "1", 'startTime': None, 'duration': 1},
|
|
185
|
+
{'name': "NoStart", 'startVal': "", 'stopVal': "1", 'startTime': None, 'duration': 1},
|
|
173
186
|
# blank stop
|
|
174
|
-
{'startVal': "0", 'stopVal': "", 'startTime': 0, 'duration': FOREVER},
|
|
187
|
+
{'name': "NoStop", 'startVal': "0", 'stopVal': "", 'startTime': 0, 'duration': FOREVER},
|
|
175
188
|
# blank both
|
|
176
|
-
{'startVal': "", 'stopVal': "", 'startTime': None, 'duration': FOREVER},
|
|
189
|
+
{'name': "NoStartStop", 'startVal': "", 'stopVal': "", 'startTime': None, 'duration': FOREVER},
|
|
177
190
|
]
|
|
178
191
|
# run all cases
|
|
179
192
|
for case in cases:
|
|
@@ -187,23 +200,19 @@ class BaseComponentTests:
|
|
|
187
200
|
assert duration == case['duration']
|
|
188
201
|
# check that it's never non-slip safe
|
|
189
202
|
assert not nonSlipSafe
|
|
190
|
-
#
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
#
|
|
194
|
-
script = exp.writeScript(target="PsychoPy")
|
|
195
|
-
file.write_text(script, encoding="utf-8")
|
|
196
|
-
# check for syntax errors
|
|
203
|
+
# update experiment name to indicate what case we're in
|
|
204
|
+
case['name'] = self.comp.__name__ + case['name']
|
|
205
|
+
exp.name = "Test%(name)sExp" % case
|
|
206
|
+
# check that it still writes syntactially valid code
|
|
197
207
|
try:
|
|
198
|
-
|
|
199
|
-
except
|
|
200
|
-
# save script
|
|
201
|
-
case['fail'] = Path(utils.TESTS_FAILS_PATH) / "test_blank_timing_script.py"
|
|
202
|
-
case['fail'].write_text(script, encoding="utf-8")
|
|
208
|
+
utils.checkSyntax(exp, targets=self.comp.targets)
|
|
209
|
+
except SyntaxError as err:
|
|
203
210
|
# raise error
|
|
211
|
+
case['err'] = err
|
|
204
212
|
raise AssertionError(
|
|
205
213
|
"Syntax error in compiled Builder code when startVal was '%(startVal)s' and "
|
|
206
|
-
"stopVal was '%(stopVal)s'. Failed script saved in
|
|
214
|
+
"stopVal was '%(stopVal)s'. Failed script saved in psychopy/tests/fails. "
|
|
215
|
+
"Original error: %(err)s" % case
|
|
207
216
|
)
|
|
208
217
|
|
|
209
218
|
def test_disabled_default_val(self):
|
|
@@ -5,9 +5,10 @@ from pathlib import Path
|
|
|
5
5
|
from tempfile import mkdtemp
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
|
+
import pandas as pd
|
|
8
9
|
|
|
9
10
|
from ..utils import TESTS_DATA_PATH
|
|
10
|
-
from psychopy import experiment, core
|
|
11
|
+
from psychopy import experiment, core, logging
|
|
11
12
|
|
|
12
13
|
from psychopy import prefs, core
|
|
13
14
|
prefs.hardware['audioLib'] = ['ptb', 'sounddevice']
|
|
@@ -54,13 +55,16 @@ class TestLoops:
|
|
|
54
55
|
|
|
55
56
|
# Run Python script to generate data file
|
|
56
57
|
stdout, stderr = core.shellCall([sys.executable, str(pyScriptFile)], stderr=True)
|
|
58
|
+
# print stdout so the test suite can see it
|
|
57
59
|
print(stdout)
|
|
58
|
-
|
|
60
|
+
# log any errors so the test suite can see them
|
|
61
|
+
if stderr:
|
|
62
|
+
logging.error(stderr)
|
|
63
|
+
# error if data didn't save
|
|
59
64
|
if not datafile.is_file():
|
|
60
65
|
raise RuntimeError("Data file wasn't saved. PsychoPy StdErr below:\n" + stderr)
|
|
61
66
|
# Load data file
|
|
62
|
-
|
|
63
|
-
data = np.recfromcsv(f, case_sensitive=True)
|
|
67
|
+
data = pd.read_csv(str(datafile)).values.tolist()
|
|
64
68
|
|
|
65
69
|
# Store
|
|
66
70
|
cls.cases[filename] = {
|
|
@@ -71,6 +75,10 @@ class TestLoops:
|
|
|
71
75
|
'stdout': stdout,
|
|
72
76
|
'stderr': stderr,
|
|
73
77
|
}
|
|
78
|
+
|
|
79
|
+
def teardown_class(cls):
|
|
80
|
+
# delete temp folder
|
|
81
|
+
shutil.rmtree(cls.tempDir)
|
|
74
82
|
|
|
75
83
|
def test_output_length(self):
|
|
76
84
|
"""
|
|
@@ -91,9 +91,9 @@ class TestStyle:
|
|
|
91
91
|
phrase = re.sub(pattern=(
|
|
92
92
|
f"(?<= )({pattern})(?= )" # space before and after
|
|
93
93
|
f"|(?<= )({pattern})$" # space before and line end after
|
|
94
|
-
f"|(?<= )({pattern})(?=[
|
|
94
|
+
f"|(?<= )({pattern})(?=[^\\w\\s]+)" # space before and punctuation after
|
|
95
95
|
f"|^({pattern})(?= )" # line start before and space after
|
|
96
|
-
f"|^({pattern})(?=[
|
|
96
|
+
f"|^({pattern})(?=[^\\w\\s]+)" # line start before and punctuation after
|
|
97
97
|
f"|^({pattern})$" # line start before and line end after
|
|
98
98
|
), string=phrase, repl=repl)
|
|
99
99
|
|
|
@@ -174,8 +174,8 @@ def test_param_str():
|
|
|
174
174
|
"js": f"{_q}Hello there{_q}"},
|
|
175
175
|
# Enforced string
|
|
176
176
|
{"obj": Param("\\, | or /", "str", canBePath=False),
|
|
177
|
-
"py": f"{_q}{_sl},
|
|
178
|
-
"js": f"{_q}{_sl},
|
|
177
|
+
"py": f"{_q}{_sl}, \\| or /{_q}",
|
|
178
|
+
"js": f"{_q}{_sl}, \\| or /{_q}"},
|
|
179
179
|
# Dollar string
|
|
180
180
|
{"obj": Param("$win.color", "str"),
|
|
181
181
|
"py": f"win.color",
|
|
@@ -270,6 +270,19 @@ def test_param_str():
|
|
|
270
270
|
{'obj': Param("$left", "list"),
|
|
271
271
|
'py': r"left",
|
|
272
272
|
'js': r"left"},
|
|
273
|
+
# f strings as code with a newline (GitHub issue #3476)
|
|
274
|
+
# (uncomment when JS resolves as described below)
|
|
275
|
+
# {'obj': Param("$f\"I would like a \\n line break here\"", "str"),
|
|
276
|
+
# 'py': r"f\"I would like a \\n line break here\"",
|
|
277
|
+
# 'js': r"`I would like a \\n line break here`"},
|
|
278
|
+
# backslash in file path (GitHub issue #3734)
|
|
279
|
+
{'obj': Param("path\\to\\resource", "str", canBePath=True),
|
|
280
|
+
'py': r"'path/to/resource'",
|
|
281
|
+
'js': r"'path/to/resource'"},
|
|
282
|
+
# dollar sign in string (GitHub issue #4259)
|
|
283
|
+
{'obj': Param("$Math.E+'$'", "str"),
|
|
284
|
+
'py': r"Math\.E\+'\$'",
|
|
285
|
+
'js': r"\(Math.E \+ \"\$\"\)"},
|
|
273
286
|
]
|
|
274
287
|
|
|
275
288
|
# Take note of what the script target started as
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from . import _TestDisabledMixin, _TestBaseStandaloneRoutinesMixin
|
|
2
2
|
from psychopy import experiment
|
|
3
|
-
from psychopy.experiment.routines.
|
|
3
|
+
from psychopy.experiment.routines.visualValidator import VisualValidatorRoutine
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class TestEyetrackerCalibrationRoutine(_TestBaseStandaloneRoutinesMixin, _TestDisabledMixin):
|
|
7
7
|
def setup_method(self):
|
|
8
8
|
self.exp = experiment.Experiment()
|
|
9
|
-
self.rt =
|
|
9
|
+
self.rt = VisualValidatorRoutine(exp=self.exp, name="testVisualValidatorRoutine")
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from psychopy import core, visual
|
|
3
|
+
from psychopy.tests.utils import RUNNING_IN_VM
|
|
4
|
+
from psychopy.hardware.lightsensor import BaseLightSensorGroup, LightSensorResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DummyPhotodiode(BaseLightSensorGroup):
|
|
8
|
+
|
|
9
|
+
def __init__(self, channels=1, threshold=None, pos=None, size=None, units=None):
|
|
10
|
+
# make a basic timer
|
|
11
|
+
self.timer = core.Clock()
|
|
12
|
+
# queue of messages that can be manually added
|
|
13
|
+
self.queue = []
|
|
14
|
+
# initialise base
|
|
15
|
+
BaseLightSensorGroup.__init__(
|
|
16
|
+
self, channels=channels, threshold=threshold, pos=pos, size=size, units=units
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def dispatchMessages(self):
|
|
20
|
+
for msg in self.queue:
|
|
21
|
+
self.responses = self.parseMessage(msg)
|
|
22
|
+
|
|
23
|
+
def parseMessage(self, message):
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
message : tuple[float, bool, int, float]
|
|
29
|
+
Raw message, in the format:
|
|
30
|
+
- float: Timestamp
|
|
31
|
+
- bool: True/False lightsensor state
|
|
32
|
+
- int: Channel in question
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
LightSensorResponse
|
|
37
|
+
Photodiode response
|
|
38
|
+
"""
|
|
39
|
+
# split message
|
|
40
|
+
t, value, channel = message
|
|
41
|
+
# make obj
|
|
42
|
+
return LightSensorResponse(
|
|
43
|
+
t, value, channel, threshold=self.threshold[channel]
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
def _setThreshold(self, threshold, channel):
|
|
47
|
+
self.threshold[channel] = threshold
|
|
48
|
+
|
|
49
|
+
def resetTimer(self, clock=None):
|
|
50
|
+
self.timer.reset()
|
|
51
|
+
|
|
52
|
+
class TestPhotodiode:
|
|
53
|
+
|
|
54
|
+
def setup_class(self):
|
|
55
|
+
self.lightsensor = DummyPhotodiode()
|
|
56
|
+
self.win = visual.Window()
|
|
57
|
+
|
|
58
|
+
def test_handle_no_response(self):
|
|
59
|
+
"""
|
|
60
|
+
If no response (as will be the case here), should try n times and then give up.
|
|
61
|
+
"""
|
|
62
|
+
# this one takes a while and isn't all that helpful if you can't watch it, so skip under vm
|
|
63
|
+
if RUNNING_IN_VM:
|
|
64
|
+
pytest.skip()
|
|
65
|
+
# try to find the lightsensor, knowing full well it'll get nothing as this is a dummy
|
|
66
|
+
self.lightsensor.findSensor(win=self.win, retryLimit=2)
|
|
@@ -191,10 +191,10 @@ class TestLiaison:
|
|
|
191
191
|
Test that attribute strings (e.g. "session.win") are actualized by Liaison to be the
|
|
192
192
|
object they represent.
|
|
193
193
|
"""
|
|
194
|
-
# add screen buffer
|
|
194
|
+
# add screen buffer lightsensor
|
|
195
195
|
runInLiaison(
|
|
196
196
|
self.server, self.protocol, "DeviceManager", "addDevice",
|
|
197
|
-
"psychopy.hardware.
|
|
197
|
+
"psychopy.hardware.lightsensor.ScreenBufferSampler", "screenBuffer",
|
|
198
198
|
"session.win"
|
|
199
199
|
)
|
|
200
200
|
# get screen buffer photodidoe
|
|
@@ -238,7 +238,7 @@ class TestLiaison:
|
|
|
238
238
|
def test_device_JSON(self):
|
|
239
239
|
cases = {
|
|
240
240
|
'testMic': "psychopy.hardware.microphone.MicrophoneDevice",
|
|
241
|
-
'testPhotodiode': "psychopy.hardware.
|
|
241
|
+
'testPhotodiode': "psychopy.hardware.lightsensor.ScreenBufferSampler",
|
|
242
242
|
'testButtonBox': "psychopy.hardware.button.KeyboardButtonBox"
|
|
243
243
|
}
|
|
244
244
|
for deviceName, deviceClass in cases.items():
|
|
@@ -272,4 +272,4 @@ class TestLiaison:
|
|
|
272
272
|
# make sure error looks correct in JSON format
|
|
273
273
|
result = self.protocol.messages[-1]
|
|
274
274
|
assert result['type'] == "hardware_error"
|
|
275
|
-
assert "psychopy.hardware.
|
|
275
|
+
assert "psychopy.hardware.exceptions.ManagedDeviceError" in result['msg']
|
|
@@ -6,6 +6,7 @@ import numpy as np
|
|
|
6
6
|
from psychopy.clock import wait, StaticPeriod, CountdownTimer
|
|
7
7
|
from psychopy.visual import Window
|
|
8
8
|
from psychopy.tools import systemtools
|
|
9
|
+
from psychopy.tests import skip_under_vm
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
def test_StaticPeriod_finish_on_time():
|
|
@@ -36,6 +37,7 @@ def test_StaticPeriod_recordFrameIntervals():
|
|
|
36
37
|
win.close()
|
|
37
38
|
|
|
38
39
|
|
|
40
|
+
@skip_under_vm
|
|
39
41
|
def test_StaticPeriod_screenHz():
|
|
40
42
|
"""Test if screenHz parameter is respected, i.e., if after completion of the
|
|
41
43
|
StaticPeriod, 1/screenHz seconds are still remaining, so the period will
|
|
@@ -6,6 +6,7 @@ tests in a setting where you can view the output if you have photosensitive
|
|
|
6
6
|
epilepsy.
|
|
7
7
|
|
|
8
8
|
"""
|
|
9
|
+
from psychopy.alerts import addAlertHandler
|
|
9
10
|
from psychopy.alerts._errorHandler import _BaseErrorHandler
|
|
10
11
|
from psychopy.tests import utils
|
|
11
12
|
from psychopy import visual, colors
|
|
@@ -44,6 +45,7 @@ class Test_Window:
|
|
|
44
45
|
def setup_class(self):
|
|
45
46
|
self.win = visual.Window([128,128], pos=[50,50], allowGUI=False, autoLog=False)
|
|
46
47
|
self.error = _BaseErrorHandler()
|
|
48
|
+
addAlertHandler(self.error)
|
|
47
49
|
|
|
48
50
|
@classmethod
|
|
49
51
|
def teardown_class(self):
|
|
File without changes
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
from http.client import RemoteDisconnected
|
|
2
|
+
import importlib
|
|
3
|
+
import pytest
|
|
4
|
+
import requests
|
|
5
|
+
from psychopy import logging
|
|
6
|
+
from psychopy.plugins import PluginStub
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_plugin_stub_docs():
|
|
10
|
+
"""
|
|
11
|
+
Test that links (docsHome and docsRef) are combined correctly in the docstring of PluginStub
|
|
12
|
+
"""
|
|
13
|
+
cases = [
|
|
14
|
+
# docsHome with no docsRef
|
|
15
|
+
{
|
|
16
|
+
'plugin': "psychopy-test",
|
|
17
|
+
'docsHome': "https://psychopy.org",
|
|
18
|
+
'docsRef': "",
|
|
19
|
+
'ans': {
|
|
20
|
+
'docsHome': "https://psychopy.org",
|
|
21
|
+
'docsLink': "https://psychopy.org/",
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
# docsHome included in docsRef
|
|
25
|
+
{
|
|
26
|
+
'plugin': "psychopy-test",
|
|
27
|
+
'docsHome': "https://psychopy.org",
|
|
28
|
+
'docsRef': "https://psychopy.org/test",
|
|
29
|
+
'ans': {
|
|
30
|
+
'docsHome': "https://psychopy.org",
|
|
31
|
+
'docsLink': "https://psychopy.org/test",
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
# docsRef without /
|
|
35
|
+
{
|
|
36
|
+
'plugin': "psychopy-test",
|
|
37
|
+
'docsHome': "https://psychopy.org",
|
|
38
|
+
'docsRef': "test",
|
|
39
|
+
'ans': {
|
|
40
|
+
'docsHome': "https://psychopy.org",
|
|
41
|
+
'docsLink': "https://psychopy.org/test",
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
# docsHome with /
|
|
45
|
+
{
|
|
46
|
+
'plugin': "psychopy-test",
|
|
47
|
+
'docsHome': "https://psychopy.org/",
|
|
48
|
+
'docsRef': "/test",
|
|
49
|
+
'ans': {
|
|
50
|
+
'docsHome': "https://psychopy.org",
|
|
51
|
+
'docsLink': "https://psychopy.org/test",
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
for case in cases:
|
|
57
|
+
# subclass PluginStub with the given values
|
|
58
|
+
class TestPluginStub(
|
|
59
|
+
PluginStub,
|
|
60
|
+
plugin=case['plugin'],
|
|
61
|
+
docsHome=case['docsHome'],
|
|
62
|
+
docsRef=case['docsRef'],
|
|
63
|
+
):
|
|
64
|
+
pass
|
|
65
|
+
# check for the necessary strings in its docstr
|
|
66
|
+
assert case['plugin'] in TestPluginStub.__doc__
|
|
67
|
+
assert "<%(docsHome)s>" % case['ans'] in TestPluginStub.__doc__
|
|
68
|
+
assert "<%(docsLink)s>" % case['ans'] in TestPluginStub.__doc__
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_plugin_stub_links():
|
|
72
|
+
# import modules with PluginStubs in them
|
|
73
|
+
knownStubModules = [
|
|
74
|
+
"psychopy.microphone",
|
|
75
|
+
"psychopy.hardware.cedrus",
|
|
76
|
+
"psychopy.hardware.emulator",
|
|
77
|
+
"psychopy.hardware.gammasci",
|
|
78
|
+
"psychopy.hardware.minolta",
|
|
79
|
+
"psychopy.hardware.minolta",
|
|
80
|
+
"psychopy.hardware.pr",
|
|
81
|
+
"psychopy.hardware.crs.bits",
|
|
82
|
+
"psychopy.hardware.crs.optical",
|
|
83
|
+
"psychopy.hardware.crs.shaders",
|
|
84
|
+
"psychopy.visual.movie2",
|
|
85
|
+
"psychopy.visual.movie3",
|
|
86
|
+
"psychopy.visual.noise",
|
|
87
|
+
"psychopy.visual.patch",
|
|
88
|
+
"psychopy.visual.radial",
|
|
89
|
+
"psychopy.visual.ratingscale",
|
|
90
|
+
"psychopy.visual.secondorder",
|
|
91
|
+
"psychopy.hardware.brainproducts",
|
|
92
|
+
"psychopy.hardware.forp",
|
|
93
|
+
"psychopy.hardware.iolab",
|
|
94
|
+
"psychopy.hardware.labjacks",
|
|
95
|
+
"psychopy.hardware.qmix",
|
|
96
|
+
"psychopy.hardware.bbtk",
|
|
97
|
+
"psychopy.sound.backend_pyo",
|
|
98
|
+
"psychopy.sound.backend_sounddevice",
|
|
99
|
+
"psychopy.visual.backends.glfwbackend",
|
|
100
|
+
]
|
|
101
|
+
for stubModule in knownStubModules:
|
|
102
|
+
importlib.import_module(stubModule)
|
|
103
|
+
# check for an internet connection in general
|
|
104
|
+
resp = requests.get("https://psychopy.org")
|
|
105
|
+
if not resp.ok:
|
|
106
|
+
pytest.skip()
|
|
107
|
+
# iterate through subclasses of PluginStub
|
|
108
|
+
for cls in PluginStub.__subclasses__():
|
|
109
|
+
# skip PluginStubs from the test suite
|
|
110
|
+
if cls.__module__.startswith("psychopy.tests"):
|
|
111
|
+
continue
|
|
112
|
+
# get pages from web
|
|
113
|
+
try:
|
|
114
|
+
docsHome = requests.get(cls.docsHome)
|
|
115
|
+
docsLink = requests.get(cls.docsLink)
|
|
116
|
+
except RemoteDisconnected:
|
|
117
|
+
# skip test if there's a connection error
|
|
118
|
+
pytest.skip()
|
|
119
|
+
# check that we got some content
|
|
120
|
+
assert docsHome.ok, (
|
|
121
|
+
f"No documentation found at {cls.docsHome} (PluginStub for {cls.__module__}:{cls.__name__})"
|
|
122
|
+
)
|
|
123
|
+
assert docsLink.ok, (
|
|
124
|
+
f"No documentation found at {cls.docsLink} (PluginStub for {cls.__module__}:{cls.__name__})"
|
|
125
|
+
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Test PsychoPy sound.py using pygame backend; will fail if have already used pyo
|
|
2
2
|
"""
|
|
3
3
|
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
from psychopy import prefs, core, plugins
|
|
5
6
|
prefs.hardware['audioLib'] = ['ptb', 'sounddevice']
|
|
6
7
|
|
|
@@ -8,6 +9,7 @@ import pytest
|
|
|
8
9
|
import shutil
|
|
9
10
|
from tempfile import mkdtemp
|
|
10
11
|
from psychopy import sound #, microphone
|
|
12
|
+
from psychopy.hardware import DeviceManager, speaker
|
|
11
13
|
|
|
12
14
|
import numpy
|
|
13
15
|
|
|
@@ -16,52 +18,121 @@ import numpy
|
|
|
16
18
|
from psychopy.tests.utils import TESTS_PATH, TESTS_DATA_PATH
|
|
17
19
|
|
|
18
20
|
@pytest.mark.needs_sound
|
|
19
|
-
class
|
|
20
|
-
@classmethod
|
|
21
|
+
class TestSounds:
|
|
21
22
|
def setup_class(self):
|
|
22
23
|
self.contextName='ptb'
|
|
23
24
|
self.tmp = mkdtemp(prefix='psychopy-tests-sound')
|
|
25
|
+
# create just one instance for each speaker
|
|
26
|
+
self.speakers = {}
|
|
27
|
+
for profile in DeviceManager.getAvailableDevices(
|
|
28
|
+
"psychopy.hardware.speaker.SpeakerDevice"
|
|
29
|
+
):
|
|
30
|
+
self.speakers[profile['index']] = speaker.SpeakerDevice(profile['index'])
|
|
31
|
+
# if there's no devices, skip everything
|
|
32
|
+
if not len(self.speakers):
|
|
33
|
+
pytest.skip()
|
|
24
34
|
|
|
25
|
-
@classmethod
|
|
26
35
|
def teardown_class(self):
|
|
36
|
+
for i, spk in self.speakers.items():
|
|
37
|
+
spk.close()
|
|
38
|
+
# delete temp dir
|
|
27
39
|
if hasattr(self, 'tmp'):
|
|
28
40
|
shutil.rmtree(self.tmp, ignore_errors=True)
|
|
29
41
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
def test_playback(self):
|
|
43
|
+
"""
|
|
44
|
+
Check that Sound can be initialised with a variety of values
|
|
45
|
+
"""
|
|
46
|
+
# check values which should work
|
|
47
|
+
cases = [
|
|
48
|
+
# default stim
|
|
49
|
+
"default.mp3",
|
|
50
|
+
"default.wav",
|
|
51
|
+
# extant file
|
|
52
|
+
Path(TESTS_DATA_PATH) / "Electronic_Chime-KevanGC-495939803.wav",
|
|
53
|
+
# notes
|
|
54
|
+
"A",
|
|
55
|
+
440,
|
|
56
|
+
'440',
|
|
57
|
+
[1,2,3,4],
|
|
58
|
+
numpy.array([1,2,3,4]),
|
|
59
|
+
]
|
|
60
|
+
# try on every speaker
|
|
61
|
+
for i, spk in self.speakers.items():
|
|
62
|
+
for case in cases:
|
|
63
|
+
snd = sound.Sound(
|
|
64
|
+
value=case,
|
|
65
|
+
secs=0.1,
|
|
66
|
+
speaker=spk,
|
|
67
|
+
)
|
|
68
|
+
snd.play()
|
|
69
|
+
snd.stop()
|
|
70
|
+
|
|
71
|
+
def test_error(self):
|
|
72
|
+
"""
|
|
73
|
+
Check that various invalid values raise the correct error
|
|
74
|
+
"""
|
|
75
|
+
# check values which should error
|
|
76
|
+
cases = [
|
|
77
|
+
{'val': "'this is not a file name'", 'secs': .1, 'err': ValueError},
|
|
78
|
+
{'val': "-1", 'secs': .1, 'err': ValueError},
|
|
79
|
+
]
|
|
80
|
+
# try on every speaker
|
|
81
|
+
for i, spk in self.speakers.items():
|
|
82
|
+
for case in cases:
|
|
83
|
+
with pytest.raises(case['err']):
|
|
84
|
+
snd = sound.Sound(
|
|
85
|
+
value=case['val'],
|
|
86
|
+
secs=0.1,
|
|
87
|
+
speaker=spk,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def test_sample_rate_mismatch(self):
|
|
91
|
+
"""
|
|
92
|
+
Check that Sound can handle a mismatch of sample rates between a file and a speaker
|
|
93
|
+
"""
|
|
94
|
+
# specify some common sample rates
|
|
95
|
+
sampleRates = (
|
|
96
|
+
8000,
|
|
97
|
+
16000,
|
|
98
|
+
22050,
|
|
99
|
+
32000,
|
|
100
|
+
44100,
|
|
101
|
+
48000,
|
|
102
|
+
96000,
|
|
103
|
+
192000,
|
|
104
|
+
)
|
|
105
|
+
# iterate through speakers
|
|
106
|
+
for i, spk in self.speakers.items():
|
|
107
|
+
for sr in sampleRates:
|
|
108
|
+
# try to play sound on speaker
|
|
109
|
+
try:
|
|
110
|
+
snd = sound.Sound(
|
|
111
|
+
value=Path(TESTS_DATA_PATH) / "test_sounds" / f"default_{sr}.wav",
|
|
112
|
+
speaker=spk,
|
|
113
|
+
secs=-1,
|
|
114
|
+
)
|
|
115
|
+
snd.play()
|
|
116
|
+
except Exception as err:
|
|
117
|
+
# include sample rate of sound and speaker in error message
|
|
118
|
+
raise ValueError(
|
|
119
|
+
f"Failed to play sound at sample rate {sr} on speaker {i} (sample rate "
|
|
120
|
+
f"{spk.sampleRateHz}), original error: {err}"
|
|
121
|
+
)
|
|
122
|
+
# doesn't need to *actually* play, just check that it doesn't error
|
|
123
|
+
snd.stop()
|
|
43
124
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
s.
|
|
56
|
-
|
|
57
|
-
s.
|
|
58
|
-
core.wait(s.getDuration()*2+.1)
|
|
59
|
-
s.play(loops=-1)
|
|
60
|
-
s.stop()
|
|
61
|
-
|
|
62
|
-
def test_methods(self):
|
|
63
|
-
s = sound.Sound(secs=0.1)
|
|
64
|
-
v = s.getVolume()
|
|
65
|
-
assert v == 1
|
|
66
|
-
assert s.setVolume(0.5) == 0.5
|
|
67
|
-
#assert s.setLoops(2) == 2
|
|
125
|
+
def test_volume(self):
|
|
126
|
+
"""
|
|
127
|
+
Test that Sound can handle setting/getting its volume
|
|
128
|
+
"""
|
|
129
|
+
# make a basic sound
|
|
130
|
+
s = sound.Sound(value="A", secs=0.1)
|
|
131
|
+
# set volume
|
|
132
|
+
s.setVolume(1)
|
|
133
|
+
# check it
|
|
134
|
+
assert s.getVolume() == 1
|
|
135
|
+
# set to a different value
|
|
136
|
+
s.setVolume(0.5)
|
|
137
|
+
# check it
|
|
138
|
+
assert s.getVolume() == 0.5
|