psychopy 2024.1.0__py3-none-any.whl → 2024.1.1__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.

Files changed (39) hide show
  1. psychopy/__init__.py +2 -2
  2. psychopy/app/builder/builder.py +3 -0
  3. psychopy/app/plugin_manager/plugins.py +81 -58
  4. psychopy/app/utils.py +2 -2
  5. psychopy/experiment/routines/counterbalance/__init__.py +1 -1
  6. {psychopy-2024.1.0.dist-info → psychopy-2024.1.1.dist-info}/METADATA +1 -1
  7. {psychopy-2024.1.0.dist-info → psychopy-2024.1.1.dist-info}/RECORD +11 -39
  8. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  9. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  10. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  11. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  12. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  13. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  14. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  15. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  16. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  17. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  18. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  19. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  20. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  21. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  22. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  23. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  24. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  25. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  26. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  27. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  28. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  29. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  30. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  31. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  32. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  33. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  34. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  35. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  36. {psychopy-2024.1.0.dist-info → psychopy-2024.1.1.dist-info}/WHEEL +0 -0
  37. {psychopy-2024.1.0.dist-info → psychopy-2024.1.1.dist-info}/entry_points.txt +0 -0
  38. {psychopy-2024.1.0.dist-info → psychopy-2024.1.1.dist-info}/licenses/AUTHORS.md +0 -0
  39. {psychopy-2024.1.0.dist-info → psychopy-2024.1.1.dist-info}/licenses/LICENSE +0 -0
psychopy/__init__.py CHANGED
@@ -12,14 +12,14 @@
12
12
  import os
13
13
  import sys
14
14
 
15
- __version__ = '2024.1.0'
15
+ __version__ = '2024.1.1'
16
16
  __license__ = 'GPL v3'
17
17
  __author__ = 'Open Science Tools Ltd'
18
18
  __author_email__ = 'support@opensciencetools.org'
19
19
  __maintainer_email__ = 'support@opensciencetools.org'
20
20
  __url__ = 'https://www.psychopy.org/'
21
21
  __download_url__ = 'https://github.com/psychopy/psychopy/releases/'
22
- __git_sha__ = 'n/a'
22
+ __git_sha__ = '5b4d38cde'
23
23
  __build_platform__ = 'n/a'
24
24
 
25
25
  __all__ = ["gui", "misc", "visual", "core",
@@ -2239,6 +2239,9 @@ class RoutineCanvas(wx.ScrolledWindow, handlers.ThemeMixin):
2239
2239
  # if max came from routine settings, mark as hard stop
2240
2240
  rtMax, rtMaxIsNum = self.routine.settings.getDuration()
2241
2241
  hardStop = rtMaxIsNum and rtMax == maxTime
2242
+ # handle no max
2243
+ if maxTime is None:
2244
+ maxTime = 10
2242
2245
 
2243
2246
  return maxTime, hardStop
2244
2247
 
@@ -1,3 +1,5 @@
1
+ from pathlib import Path
2
+
1
3
  import wx
2
4
  from wx.lib import scrolledpanel
3
5
  import webbrowser
@@ -167,7 +169,7 @@ class PluginInfo:
167
169
  if ext in pil.registered_extensions():
168
170
  content = requests.get(self._requestedIcon).content
169
171
  writeOut = os.path.join(appPluginCacheDir, fname)
170
- with open(writeOut, 'wb') as f:
172
+ with open(writeOut, 'wb', encoding='utf-8') as f:
171
173
  f.write(content)
172
174
  self._icon = utils.ImageData(os.path.join(
173
175
  appPluginCacheDir, fname))
@@ -479,6 +481,16 @@ class PluginBrowserList(scrolledpanel.ScrolledPanel, handlers.ThemeMixin):
479
481
  self.sizer.Add(self.badItemLbl, border=9, flag=wx.ALL | wx.EXPAND)
480
482
  self.badItemSizer = wx.BoxSizer(wx.VERTICAL)
481
483
  self.sizer.Add(self.badItemSizer, border=3, flag=wx.ALL | wx.EXPAND)
484
+ # ctrl to display when plugins can't be retrieved
485
+ self.errorCtrl = utils.MarkdownCtrl(
486
+ self, value=_translate(
487
+ "Could not retrieve plugins. Try restarting the PsychoPy app and make sure you "
488
+ "are connected to the internet."
489
+ ),
490
+ style=wx.TE_READONLY
491
+ )
492
+ self.sizer.Add(self.errorCtrl, proportion=1, border=3, flag=wx.ALL | wx.EXPAND)
493
+ self.errorCtrl.Hide()
482
494
 
483
495
  # Bind deselect
484
496
  self.Bind(wx.EVT_LEFT_DOWN, self.onDeselect)
@@ -492,17 +504,19 @@ class PluginBrowserList(scrolledpanel.ScrolledPanel, handlers.ThemeMixin):
492
504
  self.initState[item.info.pipname] = {"installed": item.info.installed, "active": item.info.active}
493
505
 
494
506
  def populate(self):
495
- # Get all plugin details
507
+ # get all plugin details
496
508
  items = getAllPluginDetails()
497
- # Start off assuming no headings
509
+ # start off assuming no headings
498
510
  self.badItemLbl.Hide()
499
- # Put installed packages at top of list
511
+ # put installed packages at top of list
500
512
  items.sort(key=lambda obj: obj.installed, reverse=True)
501
513
  for item in items:
502
514
  item.setParent(self)
503
515
  self.appendItem(item)
504
-
505
- # Layout
516
+ # if we got no items, display error message
517
+ if not len(items):
518
+ self.errorCtrl.Show()
519
+ # layout
506
520
  self.Layout()
507
521
  self.SetupScrolling()
508
522
 
@@ -697,7 +711,7 @@ class PluginDetailsPanel(wx.Panel, handlers.ThemeMixin):
697
711
  # Add placeholder for when there's no plugin selected
698
712
  self.placeholder = utils.MarkdownCtrl(
699
713
  self, value=_translate("Select a plugin to view details."),
700
- style=wx.TE_MULTILINE | wx.BORDER_NONE | wx.TE_NO_VSCROLL
714
+ style=wx.TE_READONLY
701
715
  )
702
716
  self.border.Add(
703
717
  self.placeholder,
@@ -840,7 +854,6 @@ class PluginDetailsPanel(wx.Panel, handlers.ThemeMixin):
840
854
  self.sizer.ShowItems(value is not None)
841
855
  # Show/hide placeholder according to None
842
856
  self.placeholder.Show(value is None)
843
- self.placeholder.editBtn.Hide()
844
857
  # Handle None
845
858
  if value is None:
846
859
  value = PluginInfo(
@@ -1145,6 +1158,8 @@ def markActive(pluginItem, pluginPanel, active=True):
1145
1158
 
1146
1159
  # store plugin objects for later use
1147
1160
  _pluginObjects = None
1161
+ # persistent variable to keep track of whether we need to update plugins
1162
+ redownloadPlugins = True
1148
1163
 
1149
1164
 
1150
1165
  def getAllPluginDetails():
@@ -1175,7 +1190,7 @@ def getAllPluginDetails():
1175
1190
  pass
1176
1191
 
1177
1192
  # where the database is expected to be
1178
- pluginDatabaseFile = os.path.join(appPluginCacheDir, 'plugins.json')
1193
+ pluginDatabaseFile = Path(appPluginCacheDir) / "plugins.json"
1179
1194
 
1180
1195
  def downloadPluginDatabase(srcURL="https://psychopy.org/plugins.json"):
1181
1196
  """Downloads the plugin database from the server and returns the text
@@ -1188,23 +1203,35 @@ def getAllPluginDetails():
1188
1203
 
1189
1204
  Returns
1190
1205
  -------
1191
- str or None
1192
- The plugin database as a string, or None if the download failed.
1206
+ list or None
1207
+ The plugin database as a list, or None if the download failed.
1193
1208
 
1194
1209
  """
1210
+ global redownloadPlugins
1211
+ # if plugins already up to date, skip
1212
+ if not redownloadPlugins:
1213
+ return None
1214
+ # download database from website
1195
1215
  try:
1196
1216
  resp = requests.get(srcURL)
1197
- if resp.status_code == 404:
1198
- return None
1199
- value = resp.text
1200
- # confirm json is valid
1201
- try:
1202
- json.loads(value)
1203
- return value
1204
- except json.decoder.JSONDecodeError:
1205
- return None
1206
1217
  except requests.exceptions.ConnectionError:
1218
+ # if connection to website fails, return nothing
1219
+ return None
1220
+ # if download failed, return nothing
1221
+ if resp.status_code == 404:
1207
1222
  return None
1223
+ # otherwise get as a string
1224
+ value = resp.text
1225
+ # attempt to parse JSON
1226
+ try:
1227
+ database = json.loads(value)
1228
+ except json.decoder.JSONDecodeError:
1229
+ # if JSON parse fails, return nothing
1230
+ return None
1231
+ # if we made it this far, mark plugins as not needing update
1232
+ redownloadPlugins = False
1233
+
1234
+ return database
1208
1235
 
1209
1236
  def readLocalPluginDatabase(srcFile):
1210
1237
  """Read the local plugin database file (if it exists) and return the
@@ -1212,20 +1239,25 @@ def getAllPluginDetails():
1212
1239
 
1213
1240
  Parameters
1214
1241
  ----------
1215
- srcFile : str
1242
+ srcFile : pathlib.Path
1216
1243
  The expected path to the plugin database file.
1217
1244
 
1218
1245
  Returns
1219
1246
  -------
1220
- str or None
1221
- The plugin database as a string, or None if the file doesn't exist.
1247
+ list or None
1248
+ The plugin database as a list, or None if the file doesn't exist.
1222
1249
 
1223
1250
  """
1224
- if os.path.exists(srcFile):
1225
- with open(srcFile, 'r') as f:
1226
- return f.read()
1227
-
1228
- return None
1251
+ # if source file doesn't exist, return nothing
1252
+ if not srcFile.is_file():
1253
+ return None
1254
+ # attempt to parse JSON
1255
+ try:
1256
+ with srcFile.open("r", encoding="utf-8") as f:
1257
+ return json.load(f)
1258
+ except json.decoder.JSONDecodeError:
1259
+ # if JSON parse fails, return nothing
1260
+ return None
1229
1261
 
1230
1262
  def deletePluginDlgCache():
1231
1263
  """Delete the local plugin database file and cached files related to
@@ -1238,47 +1270,38 @@ def getAllPluginDetails():
1238
1270
 
1239
1271
  # get a copy of the plugin database from the server, check if it's newer
1240
1272
  # than the local copy, and if so, replace the local copy
1241
- refreshPlugins = False # database has changed
1242
- serverPluginDatabase = downloadPluginDatabase() # text
1243
- localPluginDatabase = readLocalPluginDatabase(pluginDatabaseFile) # text
1273
+
1274
+ # get remote database
1275
+ serverPluginDatabase = downloadPluginDatabase()
1276
+ # get local database
1277
+ localPluginDatabase = readLocalPluginDatabase(pluginDatabaseFile)
1278
+
1244
1279
  if serverPluginDatabase is not None:
1245
- if localPluginDatabase is None:
1280
+ # if we have a database from the remote, use it
1281
+ pluginDatabase = serverPluginDatabase
1282
+ # if the file contents has changed, delete cached icons and etc.
1283
+ if str(pluginDatabase) != str(localPluginDatabase):
1246
1284
  deletePluginDlgCache()
1247
- # write the new plugin database file
1248
- with open(pluginDatabaseFile, 'w') as f: # save the file
1249
- f.write(serverPluginDatabase)
1250
- localPluginDatabase = json.loads(serverPluginDatabase)
1251
- else:
1252
- # exists, but does it need updating?
1253
- localPluginDatabase = json.loads(localPluginDatabase)
1254
- serverPluginDatabase = json.loads(serverPluginDatabase)
1255
- if localPluginDatabase != serverPluginDatabase:
1256
- # clear the old cache
1257
- deletePluginDlgCache()
1258
- # write the new plugin database file
1259
- with open(pluginDatabaseFile, 'w') as f: # save the file
1260
- json.dump(serverPluginDatabase, f, indent=True)
1261
- localPluginDatabase = serverPluginDatabase
1262
- refreshPlugins = True
1285
+ # write new contents to file
1286
+ with pluginDatabaseFile.open("w", encoding='utf-8') as f:
1287
+ json.dump(pluginDatabase, f, indent=True)
1288
+
1289
+ elif localPluginDatabase is not None:
1290
+ # otherwise use cached
1291
+ pluginDatabase = localPluginDatabase
1263
1292
  else:
1264
- # no server connection, use local copy
1265
- if localPluginDatabase is None:
1266
- # no local copy, so no plugins
1267
- return []
1268
- else:
1269
- # use local copy
1270
- localPluginDatabase = json.loads(localPluginDatabase)
1271
- refreshPlugins = True
1293
+ # if we have neither, treat as blank list
1294
+ pluginDatabase = []
1272
1295
 
1273
1296
  # check if we need to update plugin objects, if not return the cached data
1274
1297
  global _pluginObjects
1275
- requiresRefresh = refreshPlugins or _pluginObjects is None
1298
+ requiresRefresh = _pluginObjects is None
1276
1299
  if not requiresRefresh:
1277
1300
  return _pluginObjects
1278
1301
 
1279
1302
  # Create PluginInfo objects from info list
1280
1303
  objs = []
1281
- for info in localPluginDatabase:
1304
+ for info in pluginDatabase:
1282
1305
  objs.append(PluginInfo(**info))
1283
1306
 
1284
1307
  # Add info objects for local plugins which aren't found online
psychopy/app/utils.py CHANGED
@@ -448,7 +448,7 @@ class MarkdownCtrl(wx.Panel, handlers.ThemeMixin):
448
448
  Path to markdown file to edit via this control.
449
449
  style : wx.Style
450
450
  Style tags for this control. Accepts the following:
451
- - wx.READONLY: Hides all button controls and shows only the rendered HTML
451
+ - wx.TE_READONLY: Hides all button controls and shows only the rendered HTML
452
452
  - wx.RIGHT: Arranges buttons vertically along the right hand side
453
453
  - wx.BOTTOM: Arranges buttons horizontally along the bottom
454
454
  - wx.BU_NOTEXT: Don't show any label on the buttons
@@ -511,7 +511,7 @@ class MarkdownCtrl(wx.Panel, handlers.ThemeMixin):
511
511
  if value is None and self.file is not None:
512
512
  self.load()
513
513
  elif value is not None:
514
- self.rawTextCtrl.SetValue(value)
514
+ self.setValue(value)
515
515
 
516
516
  # Set initial view
517
517
  self.showHTML()
@@ -304,7 +304,7 @@ class CounterbalanceRoutine(BaseStandaloneRoutine):
304
304
 
305
305
  def writeExperimentEndCodeJS(self, buff):
306
306
  code = (
307
- "if (%(name)s) {\n"
307
+ "if (%(name)s && !%(name)s.finished) {\n"
308
308
  " await psychoJS.shelf.counterbalanceConfirm(\n"
309
309
  " ['%(name)s', '@designer', '@experiment'],\n"
310
310
  " %(name)s.participantToken,\n"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: psychopy
3
- Version: 2024.1.0
3
+ Version: 2024.1.1
4
4
  Summary: PsychoPy provides easy, precise, flexible experiments in behavioural sciences
5
5
  Author-Email: Open Science Tools Ltd <support@opensciencetools.org>
6
6
  Maintainer-Email: Open Science Tools Ltd <support@opensciencetools.org>
@@ -1,12 +1,12 @@
1
- psychopy-2024.1.0.dist-info/METADATA,sha256=2z11EOZEphIGhWSgR2i248dIpfDofkwxzEgkjVRI6P0,6993
2
- psychopy-2024.1.0.dist-info/WHEEL,sha256=N2J68yzZqJh3mI_Wg92rwhw0rtJDFpZj9bwQIMJgaVg,90
3
- psychopy-2024.1.0.dist-info/entry_points.txt,sha256=1LXVqRMSILrbEagrzpJDtmXyEPHX3GnpBJ85TEnxuoI,56
4
- psychopy-2024.1.0.dist-info/licenses/AUTHORS.md,sha256=MmZf-GmSBscBa_z7ePoqYxbaGe6XOJnld_s6JIQGfS4,2395
5
- psychopy-2024.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1
+ psychopy-2024.1.1.dist-info/METADATA,sha256=zUijfemacGr9bXUNBeUGNQkqKGdSM5awhhCx2rQOFF0,6993
2
+ psychopy-2024.1.1.dist-info/WHEEL,sha256=N2J68yzZqJh3mI_Wg92rwhw0rtJDFpZj9bwQIMJgaVg,90
3
+ psychopy-2024.1.1.dist-info/entry_points.txt,sha256=1LXVqRMSILrbEagrzpJDtmXyEPHX3GnpBJ85TEnxuoI,56
4
+ psychopy-2024.1.1.dist-info/licenses/AUTHORS.md,sha256=MmZf-GmSBscBa_z7ePoqYxbaGe6XOJnld_s6JIQGfS4,2395
5
+ psychopy-2024.1.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
6
6
  psychopy/CHANGELOG.txt,sha256=bRyB9AEemUO4KBYhtBOIWOaXFmX9X3pHgMMF9QyeITA,203527
7
7
  psychopy/LICENSE.txt,sha256=d2HeFOYbuXc2LZobE1EkFq3lYV5ge3YSaTL3y1r7KQc,746
8
8
  psychopy/LICENSES.txt,sha256=T59KljDkUEEtd40IHWS-S0OTSjzqueGD6oNmgqpRIf0,3145
9
- psychopy/__init__.py,sha256=KpD0sy79-0QyF2v_sFHLrUZ7HRQdkTjA_6n9szpU6Yk,2751
9
+ psychopy/__init__.py,sha256=aibpoTnjMICDqqixasA_viOH0p0mOjs3Dc8j1oDOSmI,2757
10
10
  psychopy/alerts/__init__.py,sha256=buvC7HFn71FhIp1D4XGXkZLeNLk22uO9TSQsxLlYZqU,2178
11
11
  psychopy/alerts/_alerts.py,sha256=VcJltIdkBmRvM7GkgBXsGJkON9vRLuhgH3_rux2f-KQ,5951
12
12
  psychopy/alerts/_errorHandler.py,sha256=JNkdx3OJv0PeAeARG09Rgne7dH-aGgUdxdoriDd4KW4,1501
@@ -913,7 +913,7 @@ psychopy/app/__init__.py,sha256=cBd_ZxGr-FJr49vO-_Wv0djECCZPSEqNWRpFVS7JW1A,7742
913
913
  psychopy/app/_psychopyApp.py,sha256=ZRSmDL163NLMsHG4zZjKM_D2w4hTq0GbqZFiLgvUjDI,48168
914
914
  psychopy/app/appData.spec,sha256=h0mN8oarz5seNu_tSB6hnBy3kBjqqSBEnoQQ0l1yoNU,1859
915
915
  psychopy/app/builder/__init__.py,sha256=bwsF6j9s50qNjECYjh9NNvOS4ZMK8vfXfT0M3vJS-Qo,119
916
- psychopy/app/builder/builder.py,sha256=UaQsFCeEe5RER9HOifWasmb2v4zGQgMYqBEnnisqkBA,189588
916
+ psychopy/app/builder/builder.py,sha256=D0yzCxGPqL4xzQXoNZQWghKz3U0jxnUeq0pYp9MNjQk,189665
917
917
  psychopy/app/builder/dialogs/__init__.py,sha256=fbHQJfv-kknzfWejx9157LZ2xLTMA1fWVzkL3UK5-UM,86980
918
918
  psychopy/app/builder/dialogs/dlgsCode.py,sha256=e6L80eZjVidfL3UwCLsGpha1uBJkfi3gUrn2Tf4bxcM,24236
919
919
  psychopy/app/builder/dialogs/dlgsConditions.py,sha256=Q0yQaZCuWAMXKYboe4wiOrfFJxhr6rrhzvV00ZU16F8,29203
@@ -943,67 +943,39 @@ psychopy/app/idle.py,sha256=-AKlkrIPjtzLiXm4QNUy3AD4A9gqTlyBDe8kVWpUXf4,4237
943
943
  psychopy/app/jobs.py,sha256=U1krlJ5vrRY1LCc3KprNG2E4MLGHFRthkJ0zUQB1JWY,20441
944
944
  psychopy/app/linuxconfig/__init__.py,sha256=FJeDg2aVNtgWrlKHg1HiQz5dwLVnxINH492SQ6fLtl4,4338
945
945
  psychopy/app/linuxconfig/ui.py,sha256=6BiDBJEEPl8slXJ8ts0an5skU5mMVJCJj-IkrAgO1Ho,3061
946
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo,sha256=CBkp7--iXbR-5TGTGK5zWNH_FijL4BjmWNQItWwxhh4,7571
947
946
  psychopy/app/locale/ar_001/LC_MESSAGE/messages.po,sha256=T9d5nwxVrnkxzWPQ9SQNODOvOHinI5jhQ4AdMgQGKr4,252733
948
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo,sha256=zaeTGAnWr9diRZmitwPyJ8IU1WhuyCttgeYOY4Rm4XY,540
949
947
  psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po,sha256=Rtyl0S0VLvFwezLyaDn28-__iCqba6nZ9R2_0Rmez6M,698
950
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo,sha256=U4pW_8wnHVv4x7Z57g47_Yy_jS7HSq_XU98c4BS_UCQ,542
951
948
  psychopy/app/locale/da_DK/LC_MESSAGE/messages.po,sha256=3yf22BaoI7rnku17NNAi7UZ_2506OgubJOxZR0DEu-0,700
952
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo,sha256=-MvCnNaMk7LYFhqs4hn2B907_Jz4IISibT4f28KrSsk,31250
953
949
  psychopy/app/locale/de_DE/LC_MESSAGE/messages.po,sha256=yfcmLaTwuv8Gdyqe4Mu144llz9741KpKmALprj0i_IY,262120
954
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo,sha256=ICwkBJeuS7RYjA2tOYc6lfFx_ajRicxBW8VNaPYRnT4,605
955
950
  psychopy/app/locale/el_GR/LC_MESSAGE/messages.po,sha256=EZN5UAWi122lq5ckiglmHCoxPdAyBWHkfBR3NQx-jg8,767
956
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo,sha256=7aFTUKWZAxetKvDG1kKY5BjyNRGYUU43mRyuADCfyXQ,609
957
951
  psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po,sha256=7eS-D53gujKJrsyn1f5CabW_KG8_3gEkdW13VDWyH5w,771
958
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo,sha256=cWyxEwr4OUX_jAQnNZuJ5FaDvW8YFfeqPD-HY6bd5ik,447
959
952
  psychopy/app/locale/en_US/LC_MESSAGE/messages.po,sha256=BXJr9M4kzi1SI4cm-JK1dB9apmiuY89FxjN7HZJpH9c,577
960
953
  psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo,sha256=BcKBhhD1i8gfttuxUa0BY5v5mN7afDLHiF7R1IsHPYA,202308
961
954
  psychopy/app/locale/es_CO/LC_MESSAGE/messages.po,sha256=ddVNDGBBXz2qRXWSwUwEKG1rmfLqThGbWX4HMQR8X-Q,337432
962
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo,sha256=ZhU6TYbDu5ANaEwSZfiWDstR1ao2c_oBFOQBrZ8bNAI,198678
963
955
  psychopy/app/locale/es_ES/LC_MESSAGE/messages.po,sha256=s7keJifOGV4stEFvliugjPRjDteII84TTsIZEPXY5Cg,335984
964
956
  psychopy/app/locale/es_US/LC_MESSAGE/messages.mo,sha256=B6RSjUHgrQccLq9N5bP9LiTOTZr1BvEhpZ4Dvd5cUgo,202308
965
957
  psychopy/app/locale/es_US/LC_MESSAGE/messages.po,sha256=4gNoe0X85Jz4eDetGllIXdtylgssbTUQKQY__eBsXRw,337432
966
958
  psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo,sha256=iVqKHOf8F42v9CbkWU8yXgsELCVXiLrQKTyZHUUzffY,2901
967
959
  psychopy/app/locale/et_EE/LC_MESSAGE/messages.po,sha256=jP4Biwg14L7_z50H5j_4cpvu6l099N_Bf05tQPEEft0,248658
968
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo,sha256=DQWfAcBOG763IfRf5Q0AyzqkSagk-tV4ZY71HDKCexQ,767
969
960
  psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po,sha256=bOLZSDfVr7NZI-aGtYmMirjoUJKfGFbPNq3r34755Ow,130675
970
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo,sha256=wFSU9HnXm7dbkSiH4agqyL5PPWFaum9qty2nVFgx8uM,539
971
961
  psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po,sha256=ohwQfXPtpeHoxt-brOmYh5Kt_gvwBPFGiVExWEENiJA,697
972
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo,sha256=3NKVrSlh9ChpmRZiPf4Wk3rV_Yl84gRYY_DF5FFw9Tg,12007
973
962
  psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po,sha256=JKie1K2nGxDgaYR-vQObef9E8PYHfg_3ogEWkM7wuVQ,252027
974
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo,sha256=raemMFRUGfPw2pQ-eLSvD9ZwyXGNaUae9zkYr331PsA,744
975
963
  psychopy/app/locale/he_IL/LC_MESSAGE/messages.po,sha256=A4FxrS55WJ7ReOgI-jmrU-bB_8NZwyFjbQUK4j93THY,247452
976
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo,sha256=sCp3HJTZLl6p2gjRuriSk6sWcV7XASeKTYMAUdQwx4c,602
977
964
  psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po,sha256=Pg40TtFegHhgQW6PbQ1aO7srEjHF3bWIt27TJ9vpwoA,247819
978
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo,sha256=YL0OkWylqScel5-55e0UOTbrS3t4vSGV3fSixt4SfGE,588
979
965
  psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po,sha256=lUwWIx2w6yCg1oSFolOAGoWTYq6gilECmOe8MzmSU1c,750
980
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo,sha256=ZKMzzkn-3x5ctpBDJv25-S-4Q9dlaVD8MDgCBhJDbpg,625
981
966
  psychopy/app/locale/it_IT/LC_MESSAGE/messages.po,sha256=Hn2PHcXpyupdKp1vWZLV0T5Th1hSyaY59d7f0mVNE0c,247774
982
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo,sha256=7Y2yJxnsKvfD9ujLaliQqh3zrRpxGZ7QZeouuWZKvGI,214412
983
967
  psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po,sha256=Bp9TkRPcEHxktSHXae3nj_QNy1HnW2xekUrZouDcNe8,410174
984
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo,sha256=aH0Bw3Wg0KaxWPYu9pNfA8zLizw2fCg6YP191aL63Us,561
985
968
  psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po,sha256=Og8xPQ0fmSCKOMp-rFBiPDAACi56C8LdjH7mFuVTwoA,719
986
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo,sha256=IbykycFb3cwbl7OOa9-iJemo7ep92PiV5pEtPse4SrA,2213
987
969
  psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po,sha256=i4P--lYS4svecjAVdaMaKIANC_j8iY61Pjrt3cZJZwk,221410
988
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo,sha256=iphLHkkW0WXGSBHN0VFXyWagI-undbEVcgiL8AnGX3w,582
989
970
  psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po,sha256=Q6-Cn4EFX1diXTNptwoLSyyIk1CnTa-vWszCg3zLDWo,744
990
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo,sha256=KoQtO44sWs76FG7fN7fa9qFFsqtm6ZJ1Nd5fEH8kTws,588
991
971
  psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po,sha256=6JYAOTu1oPF2ZvXWb7SjcMfcGVYCRLzfQYTDFF3YGVU,750
992
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo,sha256=EmQWSWTc_F5xRTn_8orE-8eAdA2aVQtNwB7LH8zhTcs,645
993
972
  psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po,sha256=ABgtPUNVifLF9Qs1EbNAYXecFS23eGbU2sF8eTBekF0,807
994
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo,sha256=s7p2APggh8Rt0lO262_2rrA6Yt2nHwauloSy2BrQmsE,541
995
973
  psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po,sha256=GPYLZBdIgFZCssEAGpH0oiVT0ksXQ7R3oqvrDIjqhj0,699
996
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo,sha256=Fd2zXwwfqQpMuZlcejM57-Aa8v3zP_pSFjjSAhI1I_o,644
997
974
  psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po,sha256=jMlwnqWAt2UMyxidsnBZJVijpVDB8kpkxEDnXMGwrgk,806
998
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo,sha256=9NZMgGTc0ssPZNWo-pzpxFlzg46AM_WKlg3z7KMlRLM,563
999
975
  psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po,sha256=5L5NMHyllNwE6yaqQ6PFA_LepNpctUShQCN5OgxEFTU,721
1000
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo,sha256=YbpKMGvm-OzJNXyTx1XLd5dP8isLpHTNMTN6jGYARWo,500
1001
976
  psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po,sha256=LkvtiQBjdU6t91hEA2ofV4elnORE_BHF_8_lgyL7rcY,220729
1002
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo,sha256=H3kvnfuWtVI7lkbh56lFqIMbZumSg8pQlGSR62-ARtg,694
1003
977
  psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po,sha256=f1xDpk-tnajxvxr1ouuA6RBeGOxW4r3JpKG71QWvTbU,247318
1004
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo,sha256=EwHcz8BX0mUyHsm4NJWG4_YF4tcPwOMFuVutZ8Oh1p4,149804
1005
978
  psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po,sha256=ERNvLk1FioO5iyg8FbLf3_iebUE4lblwMkhr30NU13A,254179
1006
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo,sha256=0WPRl-gAaOOGKYVOhy5Ca8gFJG90HDgfMZRFd6WfpUM,56195
1007
979
  psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po,sha256=-vpQJVCZdwEWgdR4btjcZyhQmeDSdSuguaX_QEACHZY,210597
1008
980
  psychopy/app/pavlovia_ui/__init__.py,sha256=5jb31EYcx76wrTkoQqx_iAGgdPk9n2naMcNn2TLDVBM,896
1009
981
  psychopy/app/pavlovia_ui/_base.py,sha256=wAV1htCHAGsnqWNlfX4yVsuKoixoefTcORu1U6-zdeE,8567
@@ -1017,7 +989,7 @@ psychopy/app/plugin_manager/__init__.py,sha256=bSD1HYo2TXCFMith4-erfzv_PHP6p-qhB
1017
989
  psychopy/app/plugin_manager/dialog.py,sha256=YW5OfmQ79cPOZ40Vx1yctKy5gDth4Q4qQw1VOw4Dm_I,15102
1018
990
  psychopy/app/plugin_manager/output.py,sha256=BUfmvr7EGkDJlj97wku-GKI_vhzx2mNGCAepUHlzyRc,4045
1019
991
  psychopy/app/plugin_manager/packages.py,sha256=gykd4LcQJVU5jexhYsoQDeplXBpFo1GQOOS_Yzmz56Q,20072
1020
- psychopy/app/plugin_manager/plugins.py,sha256=6VFzL_OyZNmKF3kHr8_p8-zQmq6sujn0g0_tYneLXAU,46845
992
+ psychopy/app/plugin_manager/plugins.py,sha256=go32HSpoFtpdVEI5b90eGRHx0fc2x3NkplXWfsmpW14,47543
1021
993
  psychopy/app/plugin_manager/utils.py,sha256=2xEcau7amzOXs9P2QZbLeuvN_437ttyCWYCKC-lCGG4,4267
1022
994
  psychopy/app/preferencesDlg.py,sha256=rEZ187UgAeuiyFv9EnSbz9YCZJZtq5unUxxab63QghM,31998
1023
995
  psychopy/app/psychopyApp.py,sha256=71Hn-zIRzukQmFhN4H6UMCTf6DQFE5eQ8JdFIMaeh0o,3369
@@ -1049,7 +1021,7 @@ psychopy/app/themes/spec/PsychopyLight.json,sha256=HKaiptTsu_NoqOY0nvzAVrrEOK5GY
1049
1021
  psychopy/app/themes/ui.py,sha256=poTSCTSBY1Gw5ZM1LvsUSi7uIDlAi8IZaF1jD_E9Hoc,2517
1050
1022
  psychopy/app/ui/__init__.py,sha256=eguN9DmNAlZhvyzcXGv0V-KvVqgZO0DlPiI4WzEQ1hE,5578
1051
1023
  psychopy/app/urls.py,sha256=1tNr7Kv6k-nosQZ2e08RDrqditkV8dtMMVatb1ShkUw,1352
1052
- psychopy/app/utils.py,sha256=7A7bLURXNzz_7mjPzUEHaN2H9SHk3bBLN2y29jZxOR0,59398
1024
+ psychopy/app/utils.py,sha256=xUpabzQo0tXETP4zd3ZRbdn5irND9JdUWd1Defy_SdI,59389
1053
1025
  psychopy/app/viewer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1054
1026
  psychopy/clock.py,sha256=BnNBNNEPEXsUVlOI0kOv1nIwwaKfxTWlnQHNr0yieg0,21188
1055
1027
  psychopy/colors.py,sha256=9hFeCAMM1LetszN-xDVmbU94MOiJI4RRE9VdcarkUDA,41078
@@ -1609,7 +1581,7 @@ psychopy/experiment/questPlusTemplate.xltx,sha256=8c1yt6el4v_iE79FoelLX267TpFrPs
1609
1581
  psychopy/experiment/questTemplate.xltx,sha256=p0FzYmMWJH0uaGRFlAdPT4uSzNBHpV7uPM0gZN5yYds,20668
1610
1582
  psychopy/experiment/routines/__init__.py,sha256=mQTjLeu5H7K_EGp_WZ7I5jXDKNgPF4ViJz00aG_pV-g,3672
1611
1583
  psychopy/experiment/routines/_base.py,sha256=4oqz2jCcwUxYsz6wgKHYhmdVuB3GyVb4YJEpfV-ZYBg,34588
1612
- psychopy/experiment/routines/counterbalance/__init__.py,sha256=Xqbc5DoiTix1r27VIVOIHNa6t0ykNkksUIsupzhOsNc,12581
1584
+ psychopy/experiment/routines/counterbalance/__init__.py,sha256=NuH3o-tm0aF6zlfdD1eEd0vh79zgbdHlf47tYp7CrAk,12603
1613
1585
  psychopy/experiment/routines/counterbalance/classic/counterbalance.png,sha256=ficKpm9rX1A-YIzgFNfM6EbwAklenfKeOwP74ktCgfo,3977
1614
1586
  psychopy/experiment/routines/counterbalance/classic/counterbalance@2x.png,sha256=UwSvAzg0Y9k1jEtkvbzr277tApPB08o4gFRuhhN5NpA,10628
1615
1587
  psychopy/experiment/routines/counterbalance/counterbalanceItems.xltx,sha256=Ht1ZE6c800RGF1LxE6WjWGujNwsMQ04pw6j_VZu86uE,18707
@@ -2947,4 +2919,4 @@ psychopy/voicekey/parallel_vks.py,sha256=I6a07GvN0Q2k9xidl9YbEUDORG2v9l2H_5Owbpw
2947
2919
  psychopy/voicekey/signal.py,sha256=Mk363qVsvJampVDfsOTdGq7lPESlKmogmNFqasdghJE,1013
2948
2920
  psychopy/voicekey/vk_tools.py,sha256=pFvOvF9b9CfS-JkZ_fv38LxI59hJXQqiz9ymcrJiAFc,8483
2949
2921
  psychopy/web.py,sha256=ohiFb7lW1-0pH_62cR-z8ufZ5Nta2jRIjGS4_zosX_U,10228
2950
- psychopy-2024.1.0.dist-info/RECORD,,
2922
+ psychopy-2024.1.1.dist-info/RECORD,,