boris-behav-obs 8.27.4__py2.py3-none-any.whl → 8.27.5__py2.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.
boris/mpv2.py CHANGED
@@ -2,7 +2,7 @@
2
2
  # vim: ts=4 sw=4 et
3
3
  #
4
4
  # Python MPV library module
5
- # Copyright (C) 2017-2022 Sebastian Götte <code@jaseg.net>
5
+ # Copyright (C) 2017-2024 Sebastian Götte <code@jaseg.net>
6
6
  #
7
7
  # python-mpv inherits the underlying libmpv's license, which can be either GPLv2 or later (default) or LGPLv2.1 or
8
8
  # later. For details, see the mpv copyright page here: https://github.com/mpv-player/mpv/blob/master/Copyright
@@ -17,13 +17,14 @@
17
17
  #
18
18
  # You can find copies of the GPLv2 and LGPLv2.1 licenses in the project repository's LICENSE.GPL and LICENSE.LGPL files.
19
19
 
20
- __version__ = '1.0.3'
20
+ __version__ = '1.0.7'
21
21
 
22
22
  from ctypes import *
23
23
  import ctypes.util
24
24
  import threading
25
25
  import queue
26
26
  import os
27
+ import os.path
27
28
  import sys
28
29
  from warnings import warn
29
30
  from functools import partial, wraps
@@ -35,14 +36,30 @@ import traceback
35
36
 
36
37
  if os.name == 'nt':
37
38
  # Note: mpv-2.dll with API version 2 corresponds to mpv v0.35.0. Most things should work with the fallback, too.
38
- dll = ctypes.util.find_library('mpv-2.dll') or ctypes.util.find_library('mpv-1.dll')
39
- if dll is None:
40
- raise OSError('Cannot find mpv-1.dll or mpv-2.dll in your system %PATH%. One way to deal with this is to ship '
41
- 'the dll with your script and put the directory your script is in into %PATH% before '
42
- '"import mpv": os.environ["PATH"] = os.path.dirname(__file__) + os.pathsep + os.environ["PATH"] '
43
- 'If mpv-1.dll is located elsewhere, you can add that path to os.environ["PATH"].')
44
- backend = CDLL(dll)
39
+ names = ['mpv-2.dll', 'libmpv-2.dll', 'mpv-1.dll']
40
+ for name in names:
41
+ dll = ctypes.util.find_library(name)
42
+ if dll:
43
+ break
44
+ else:
45
+ for name in names:
46
+ dll = os.path.join(os.path.dirname(__file__), name)
47
+ if os.path.isfile(dll):
48
+ break
49
+ else:
50
+ raise OSError('Cannot find mpv-1.dll, mpv-2.dll or libmpv-2.dll in your system %PATH%. One way to deal with this is to ship the dll with your script and put the directory your script is in into %PATH% before "import mpv": os.environ["PATH"] = os.path.dirname(__file__) + os.pathsep + os.environ["PATH"] If mpv-1.dll is located elsewhere, you can add that path to os.environ["PATH"].')
51
+
52
+ try:
53
+ # flags argument: LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
54
+ # cf. https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa
55
+ backend = CDLL(dll, 0x00001000 | 0x00000100)
56
+ except Exception as e:
57
+ if not os.path.isabs(dll): # can only be find_library, not the "look next to mpv.py" thing
58
+ raise OSError(f'ctypes.find_library found mpv.dll at {dll}, but ctypes.CDLL could not load it. It looks like find_library found mpv.dll under a relative path entry in %PATH%. Please make sure all paths in %PATH% are absolute. Instead of trying to load mpv.dll from the current working directory, put it somewhere next to your script and add that path to %PATH% using os.environ["PATH"] = os.path.dirname(__file__) + os.pathsep + os.environ["PATH"]') from e
59
+ else:
60
+ raise OSError(f'ctypes.find_library found mpv.dll at {dll}, but ctypes.CDLL could not load it.') from e
45
61
  fs_enc = 'utf-8'
62
+
46
63
  else:
47
64
  import locale
48
65
  lc, enc = locale.getlocale(locale.LC_NUMERIC)
@@ -52,10 +69,7 @@ else:
52
69
 
53
70
  sofile = ctypes.util.find_library('mpv')
54
71
  if sofile is None:
55
- raise OSError("Cannot find libmpv in the usual places. Depending on your distro, you may try installing an "
56
- "mpv-devel or mpv-libs package. If you have libmpv around but this script can't find it, consult "
57
- "the documentation for ctypes.util.find_library which this script uses to look up the library "
58
- "filename.")
72
+ raise OSError("Cannot find libmpv in the usual places. Depending on your distro, you may try installing an mpv-devel or mpv-libs package. If you have libmpv around but this script can't find it, consult the documentation for ctypes.util.find_library which this script uses to look up the library filename.")
59
73
  backend = CDLL(sofile)
60
74
  fs_enc = sys.getfilesystemencoding()
61
75
 
@@ -443,9 +457,14 @@ class MpvEventLogMessage(Structure):
443
457
  return lazy_decoder(self._text)
444
458
 
445
459
  class MpvEventEndFile(Structure):
446
- _fields_ = [('reason', c_int),
447
- ('error', c_int)]
448
-
460
+ _fields_ = [
461
+ ('reason', c_int),
462
+ ('error', c_int),
463
+ ('playlist_entry_id', c_ulonglong),
464
+ ('playlist_insert_id', c_ulonglong),
465
+ ('playlist_insert_num_entries', c_int),
466
+ ]
467
+
449
468
  EOF = 0
450
469
  RESTARTED = 1
451
470
  ABORTED = 2
@@ -894,6 +913,8 @@ class MPV(object):
894
913
  self._event_thread.start()
895
914
  else:
896
915
  self._event_thread = None
916
+ if (m := re.search(r'(\d+)\.(\d+)\.(\d+)', self.mpv_version)):
917
+ self.mpv_version_tuple = tuple(map(int, m.groups()))
897
918
 
898
919
  @contextmanager
899
920
  def _enqueue_exceptions(self):
@@ -1035,30 +1056,38 @@ class MPV(object):
1035
1056
  rv = cond(val)
1036
1057
  if rv:
1037
1058
  result.set_result(rv)
1059
+
1060
+ except InvalidStateError:
1061
+ pass
1062
+
1038
1063
  except Exception as e:
1039
1064
  try:
1040
1065
  result.set_exception(e)
1041
- except InvalidStateError:
1066
+ except:
1042
1067
  pass
1043
- except InvalidStateError:
1044
- pass
1045
- self.observe_property(name, observer)
1046
- err_unregister = self._set_error_handler(result)
1047
1068
 
1048
1069
  try:
1049
1070
  result.set_running_or_notify_cancel()
1071
+
1072
+ self.observe_property(name, observer)
1073
+ err_unregister = self._set_error_handler(result)
1050
1074
  if catch_errors:
1051
1075
  self._exception_futures.add(result)
1052
1076
 
1053
1077
  yield result
1054
1078
 
1055
- rv = cond(getattr(self, name.replace('-', '_')))
1056
- if level_sensitive and rv:
1057
- result.set_result(rv)
1079
+ if level_sensitive:
1080
+ rv = cond(getattr(self, name.replace('-', '_')))
1081
+ if rv:
1082
+ result.set_result(rv)
1083
+ return
1084
+
1085
+ self.check_core_alive()
1086
+ result.result(timeout)
1087
+
1088
+ except InvalidStateError:
1089
+ pass
1058
1090
 
1059
- else:
1060
- self.check_core_alive()
1061
- result.result(timeout)
1062
1091
  finally:
1063
1092
  err_unregister()
1064
1093
  self.unobserve_property(name, observer)
@@ -1325,9 +1354,16 @@ class MPV(object):
1325
1354
  def _encode_options(options):
1326
1355
  return ','.join('{}={}'.format(_py_to_mpv(str(key)), str(val)) for key, val in options.items())
1327
1356
 
1328
- def loadfile(self, filename, mode='replace', **options):
1357
+ def loadfile(self, filename, mode='replace', index=None, **options):
1329
1358
  """Mapped mpv loadfile command, see man mpv(1)."""
1330
- self.command('loadfile', filename.encode(fs_enc), mode, MPV._encode_options(options))
1359
+ if self.mpv_version_tuple >= (0, 38, 0):
1360
+ if index is None:
1361
+ index = -1
1362
+ self.command('loadfile', filename.encode(fs_enc), mode, index, MPV._encode_options(options))
1363
+ else:
1364
+ if index is not None:
1365
+ warn(f'The index argument to the loadfile command is only supported on mpv >= 0.38.0')
1366
+ self.command('loadfile', filename.encode(fs_enc), mode, MPV._encode_options(options))
1331
1367
 
1332
1368
  def loadlist(self, playlist, mode='replace'):
1333
1369
  """Mapped mpv loadlist command, see man mpv(1)."""
@@ -1359,11 +1395,17 @@ class MPV(object):
1359
1395
 
1360
1396
  def quit(self, code=None):
1361
1397
  """Mapped mpv quit command, see man mpv(1)."""
1362
- self.command('quit', code)
1398
+ if code is not None:
1399
+ self.command('quit', code)
1400
+ else:
1401
+ self.command('quit')
1363
1402
 
1364
1403
  def quit_watch_later(self, code=None):
1365
1404
  """Mapped mpv quit_watch_later command, see man mpv(1)."""
1366
- self.command('quit_watch_later', code)
1405
+ if code is not None:
1406
+ self.command('quit_watch_later', code)
1407
+ else:
1408
+ self.command('quit_watch_later')
1367
1409
 
1368
1410
  def stop(self, keep_playlist=False):
1369
1411
  """Mapped mpv stop command, see man mpv(1)."""
@@ -1448,7 +1490,7 @@ class MPV(object):
1448
1490
  """Mapped mpv discnav command, see man mpv(1)."""
1449
1491
  self.command('discnav', command)
1450
1492
 
1451
- def mouse(x, y, button=None, mode='single'):
1493
+ def mouse(self, x, y, button=None, mode='single'):
1452
1494
  """Mapped mpv mouse command, see man mpv(1)."""
1453
1495
  if button is None:
1454
1496
  self.command('mouse', x, y, mode)
@@ -1813,9 +1855,6 @@ class MPV(object):
1813
1855
  pass
1814
1856
  else:
1815
1857
  warnings.warn(f'Unhandled exception {e} inside stream open callback for URI {uri}\n{traceback.format_exc()}')
1816
-
1817
-
1818
-
1819
1858
  return ErrorCode.LOADING_FAILED
1820
1859
 
1821
1860
  cb_info.contents.cookie = None
@@ -1945,6 +1984,55 @@ class MPV(object):
1945
1984
  return cb
1946
1985
  return register
1947
1986
 
1987
+ @contextmanager
1988
+ def play_context(self):
1989
+ """ Context manager for streaming bytes straight into libmpv.
1990
+
1991
+ This is a convenience wrapper around python_stream. play_context returns a write method, which you can use in
1992
+ the body of the context manager to feed libmpv bytes. All bytes you feed in with write() in the body of a single
1993
+ call of this context manager are treated as one single file. A queue is used internally, so this function is
1994
+ thread-safe. The queue is unlimited, so it cannot block and is safe to call from async code. You can use this
1995
+ function to stream chunked data, e.g. from the network.
1996
+
1997
+ Use it like this:
1998
+
1999
+ with m.play_context() as write:
2000
+ with open(TESTVID, 'rb') as f:
2001
+ while (chunk := f.read(65536)): # Get some chunks of bytes
2002
+ write(chunk)
2003
+ """
2004
+ q = queue.Queue()
2005
+
2006
+ frame = sys._getframe()
2007
+ stream_name = f'__python_mpv_play_generator_{hash(frame)}'
2008
+ EOF = frame # Get some unique object as EOF marker
2009
+ @self.python_stream(stream_name)
2010
+ def reader():
2011
+ while (chunk := q.get()) is not EOF:
2012
+ if chunk:
2013
+ yield chunk
2014
+ reader.unregister()
2015
+
2016
+ def write(chunk):
2017
+ q.put(chunk)
2018
+
2019
+ # Start playback before yielding, the first call to reader() will block until write is called at least once.
2020
+ self.play(f'python://{stream_name}')
2021
+ yield write
2022
+ q.put(EOF)
2023
+
2024
+ def play_bytes(self, data):
2025
+ """ Play the given bytes object as a single file. """
2026
+ frame = sys._getframe()
2027
+ stream_name = f'__python_mpv_play_generator_{hash(frame)}'
2028
+
2029
+ @self.python_stream(stream_name)
2030
+ def reader():
2031
+ yield data
2032
+ reader.unregister() # unregister itself
2033
+
2034
+ self.play(f'python://{stream_name}')
2035
+
1948
2036
  def python_stream_catchall(self, cb):
1949
2037
  """ Register a catch-all python stream to be called when no name matches can be found. Use this decorator on a
1950
2038
  function that takes a name argument and returns a (generator, size) tuple (with size being None if unknown).
@@ -2002,7 +2090,10 @@ class MPV(object):
2002
2090
  def _set_property(self, name, value):
2003
2091
  self.check_core_alive()
2004
2092
  ename = name.encode('utf-8')
2005
- if isinstance(value, (list, set, dict)):
2093
+ if isinstance(value, dict):
2094
+ _1, _2, _3, pointer = _make_node_str_map(value)
2095
+ _mpv_set_property(self.handle, ename, MpvFormat.NODE, pointer)
2096
+ elif isinstance(value, (list, set)):
2006
2097
  _1, _2, _3, pointer = _make_node_str_list(value)
2007
2098
  _mpv_set_property(self.handle, ename, MpvFormat.NODE, pointer)
2008
2099
  else:
@@ -38,7 +38,11 @@ from PyQt5.QtWidgets import (
38
38
  from PyQt5.QtCore import pyqtSignal, QEvent, Qt
39
39
  from PyQt5.QtGui import QIcon
40
40
 
41
+ from . import mpv2 as mpv
42
+
43
+ """
41
44
  try:
45
+ # import last version of python-mpv
42
46
  from . import mpv2 as mpv
43
47
 
44
48
  # check if MPV API v. 1
@@ -57,6 +61,7 @@ except OSError: # libmpv not found
57
61
  msg = "LIBMPV library not found!\n"
58
62
  logging.critical(msg)
59
63
  sys.exit()
64
+ """
60
65
 
61
66
 
62
67
  class Clickable_label(QLabel):
boris/utilities.py CHANGED
@@ -45,6 +45,9 @@ from PIL.ImageQt import Image
45
45
 
46
46
  from . import config as cfg
47
47
 
48
+ from . import mpv2 as mpv
49
+
50
+ """
48
51
  try:
49
52
  from . import mpv2 as mpv
50
53
 
@@ -59,9 +62,10 @@ try:
59
62
 
60
63
  except RuntimeError: # libmpv found but version too old
61
64
  from . import mpv as mpv
65
+ """
62
66
 
63
67
 
64
- def mpv_lib_version() -> Tuple[str, str]:
68
+ def mpv_lib_version() -> Tuple[str, str, str]:
65
69
  """
66
70
  Version of MPV library
67
71
 
@@ -74,7 +78,7 @@ def mpv_lib_version() -> Tuple[str, str]:
74
78
  if sys.platform.startswith("win"):
75
79
  mpv_lib_file = mpv.dll
76
80
 
77
- return (".".join([str(x) for x in mpv._mpv_client_api_version()]), mpv_lib_file)
81
+ return (".".join([str(x) for x in mpv._mpv_client_api_version()]), mpv_lib_file, mpv.MPV_VERSION)
78
82
 
79
83
 
80
84
  def python_mpv_script_version() -> str:
boris/version.py CHANGED
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "8.27.4"
24
- __version_date__ = "2024-08-20"
23
+ __version__ = "8.27.5"
24
+ __version_date__ = "2024-08-21"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boris-behav-obs
3
- Version: 8.27.4
3
+ Version: 8.27.5
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -693,7 +693,7 @@ Classifier: Programming Language :: Python :: 3.11
693
693
  Classifier: Programming Language :: Python :: 3.12
694
694
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
695
695
  Classifier: Operating System :: OS Independent
696
- Requires-Python: >=3.8
696
+ Requires-Python: >=3.12
697
697
  Description-Content-Type: text/x-rst
698
698
  License-File: LICENSE.TXT
699
699
  Requires-Dist: exifread>=3.0.0
@@ -1,6 +1,6 @@
1
1
  boris/__init__.py,sha256=vEqzYsbV0DwIWYPXIv3OXrBBFW71dpYRSL63Dedv4xE,773
2
2
  boris/__main__.py,sha256=_cKab_aODdiWYjyf6mWu57D-84izlVDPAm13QxH-cCg,764
3
- boris/about.py,sha256=S8S1EiQhfQhlacQKuRIp-yhVkWnZ1BS7X5t9EOtCoZA,5259
3
+ boris/about.py,sha256=vQVg7Y-DePzzMGp7-88p27D62GHcFJhLCyVl4D2rpwc,5369
4
4
  boris/add_modifier.py,sha256=dtP1xZCwO0QlUJVir0JP2ShL5WrOvH26vQfwGwu683Q,26465
5
5
  boris/add_modifier_ui.py,sha256=ZKXDcpavvzF5X8gkTuza1WYsw3x9TB-qQjrhn1fka5c,10537
6
6
  boris/advanced_event_filtering.py,sha256=ScKwLy5zELU8R9WOS5wVZPk4OtWG1Cn4XeMxyHzG1Rc,15180
@@ -21,7 +21,7 @@ boris/core_qrc.py,sha256=5YMpr7ckI4TbXaeSyCMhNJBAlrGPeLes62RedU3EbWs,865287
21
21
  boris/core_ui.py,sha256=Z_6Ehp93fRVnPGyKRtgX2GcXRXb8QZojXipHSpJ_f3M,69854
22
22
  boris/db_functions.py,sha256=YyI2LMSFn772aMGdkOIpfXbPuoSWEvDckZZKevwvB-4,13326
23
23
  boris/dev.py,sha256=9pUElbjl9g17rFUJXX5aVSu55_iIKIuDxNdrB0DI_d0,3671
24
- boris/dialog.py,sha256=9x9fSRUVhsxqcit_cNtnjnQMWuM6VB2c3EQ6-G3JDmo,41217
24
+ boris/dialog.py,sha256=LPoVwflYkCWYLXazWz_ByHz3-tqey47tnxndYbsKSdM,41275
25
25
  boris/duration_widget.py,sha256=FHnDDg6RBtORCZDG9gkpjxP9ivZ3Rb4uYWCdEkBl-a4,6930
26
26
  boris/edit_event.py,sha256=cvZ4j2rcck8q5Rd6n5d6JGQ0wZMduVQls2UDylCuQqY,7578
27
27
  boris/edit_event_ui.py,sha256=X98eKSS0urd0eGce-q2_gkPx79GvO1XbJUEjxGCMUCI,6984
@@ -43,8 +43,9 @@ boris/measurement_widget.py,sha256=NI2d9qftFTtnUzy-aOtKhx3w63-mqDIJ4rz1l_8_Zos,4
43
43
  boris/media_file.py,sha256=ofOoGyrqEcm6HZQxnyObdmcLlKS0TrcPQNPNf8EG1BM,4766
44
44
  boris/menu_options.py,sha256=izzYx-Rc7powf8PqhAXD3XMPYvBoVZqOYbS1jaW4sII,7094
45
45
  boris/modifiers_coding_map.py,sha256=XBTubBHw6Sayw5jUNaWR_jVIw6ttaJcbhbmUSF6_lx4,4566
46
+ boris/mpv-1.0.3.py,sha256=EXRtzQqFjOn4wMC6482Ilq3fNQ9N1GRP1VxwLzdeaBY,88077
46
47
  boris/mpv.py,sha256=EfzIHjPbgewG4w3smEtqEUPZoVwYmMQkL4Q8ZyW-a58,76410
47
- boris/mpv2.py,sha256=EXRtzQqFjOn4wMC6482Ilq3fNQ9N1GRP1VxwLzdeaBY,88077
48
+ boris/mpv2.py,sha256=IUI4t4r9GYX7G5OXTjd3RhMMOkDdfal_15buBgksLsk,92152
48
49
  boris/observation.py,sha256=pHP68WnjA1rZsefo6zNtmwaXcjwjpItZCQrefqwOCCQ,52832
49
50
  boris/observation_operations.py,sha256=eW5DPoU_21EQEWUUmOvqe6flgHxgTcFkGaJjfS6yWJo,100276
50
51
  boris/observation_ui.py,sha256=dfk7pS2DlaiEgMjouH0-_t6kPgMwovQbloHtc3ZoCmY,30278
@@ -52,7 +53,7 @@ boris/observations_list.py,sha256=rMuEVa3QccA89vjARcEVtSlLnr5s0sfihUlcwciV3OM,10
52
53
  boris/otx_parser.py,sha256=Ul5GokK46azx60P6-pk8wbSPUqUR9O4WLV42z3rE40s,16367
53
54
  boris/param_panel.py,sha256=XpFuoNtVuPx_3EieYt0JaQ2J3Bk4ZyMa4RgJha_10oE,7473
54
55
  boris/param_panel_ui.py,sha256=R6Yfxd7m41_Mo5XCD9wlyAprrEKdCyBZm0jicwh_cGk,11704
55
- boris/player_dock_widget.py,sha256=Pl2GB-a2XmiKiPPsun9_Q8otXXrugV1tdCEW3YMP_VE,5642
56
+ boris/player_dock_widget.py,sha256=fSGrGTKX4uHuUODyOh5n8ojxdW0wW7PQI1d2md9GBQI,5717
56
57
  boris/plot_data_module.py,sha256=OazYAPHker30s1oYYKkSa0IXSj-DbB1-Qgcau0x-Il8,16582
57
58
  boris/plot_events.py,sha256=HAKrdS3qf0A_PG1pGo0FRyk62femDxfxGss3w8CrlUw,23541
58
59
  boris/plot_events_rt.py,sha256=UfO1NKSqBR7j-vnfG8CKuOcdg5o8QQI_0eYdcz29Ufc,8358
@@ -75,8 +76,8 @@ boris/synthetic_time_budget.py,sha256=m3QJ0Ju4av7WzMUKFIvxJd5x4iNVTXc4-j9tWa3MIO
75
76
  boris/time_budget_functions.py,sha256=L-0PuPWYR33UMfqmxpcCVH-w4mLLrtZ8b8kBTmBwlsI,50299
76
77
  boris/time_budget_widget.py,sha256=9WV-iKYSl1f3HBrGcL-eHDjUswrFQh6-WUcffTtce1Y,42852
77
78
  boris/transitions.py,sha256=2zucdoa2jTpWtM6nWHr8lOvjXkrQmo9j71fz_fMLALU,11998
78
- boris/utilities.py,sha256=07qXAQ6aGyiSC2h6RMJ031OlXYy05-KTLJtnQtXn6FU,48724
79
- boris/version.py,sha256=fs3Hih6V9-QWHmasEF1Pyx9fUiAoLh6LqowVIuNvHwc,788
79
+ boris/utilities.py,sha256=pNWZAy7Fsu3PrbijjQMDUZRbwkaEoJ6M0FXW6KPuB3E,48781
80
+ boris/version.py,sha256=YXTx_S6TE0W60X50lKbdjPVdTMpqns6gZpv7J9BOAKU,788
80
81
  boris/video_equalizer.py,sha256=QpVgmdqX_E4HnMa2f_Qo_fKJTl9nBoTQd_ykv9RWlIQ,5862
81
82
  boris/video_equalizer_ui.py,sha256=A2_Sz9AAVnJygTRUeK_YXxf-WWQpxSSlFw0MjkxiwSg,9762
82
83
  boris/video_operations.py,sha256=96jR-3snNn9VeEURRD6rCwvOL2sSHXoqlP_gYFwgO8A,9379
@@ -105,9 +106,9 @@ boris/qdarkstyle/utils/__init__.py,sha256=Nlma8-zbHoJc5n2NVT7OvwxPG5765JnsmMeGzr
105
106
  boris/qdarkstyle/utils/__main__.py,sha256=J1biUyDzfutKU1n9NdH9WnD0gFHaF-OJA4Q-n6Q2ehs,3309
106
107
  boris/qdarkstyle/utils/images.py,sha256=af-BJllzWgVoVz6QMvhFcKqvF3mo44AThaBjuAuHtNE,14444
107
108
  boris/qdarkstyle/utils/scss.py,sha256=n7WNo6pPRft8-dU7_gfjB_jA-JZAy50-S792RwR7Ri0,9366
108
- boris_behav_obs-8.27.4.dist-info/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
109
- boris_behav_obs-8.27.4.dist-info/METADATA,sha256=sJFqhkz8Uj1lgAcSntH461AuI4YUlExjdalt79XyxWw,45533
110
- boris_behav_obs-8.27.4.dist-info/WHEEL,sha256=OWYSMTYHNOLxNw0Mxija-Qn3HdviNLu4kabRWA1yLB4,109
111
- boris_behav_obs-8.27.4.dist-info/entry_points.txt,sha256=fuO7JxKFLOm6xp6m3JHRA1UO_QW1dYU-F0IooA1NqQs,37
112
- boris_behav_obs-8.27.4.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
113
- boris_behav_obs-8.27.4.dist-info/RECORD,,
109
+ boris_behav_obs-8.27.5.dist-info/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
110
+ boris_behav_obs-8.27.5.dist-info/METADATA,sha256=y_09uj0lyQmY7L6H8cxTpcTj_r7yWA6O6gX06KOO4aw,45534
111
+ boris_behav_obs-8.27.5.dist-info/WHEEL,sha256=GUeE9LxUgRABPG7YM0jCNs9cBsAIx0YAkzCB88PMLgc,109
112
+ boris_behav_obs-8.27.5.dist-info/entry_points.txt,sha256=fuO7JxKFLOm6xp6m3JHRA1UO_QW1dYU-F0IooA1NqQs,37
113
+ boris_behav_obs-8.27.5.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
114
+ boris_behav_obs-8.27.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (73.0.0)
2
+ Generator: setuptools (73.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any