From e8c9f42ccb55cdf90e1f1249705ce5a5188b5e03 Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Mon, 14 Oct 2024 15:35:30 +0100 Subject: [PATCH 01/16] Replace np.NaN with np.nan --- iblrig/base_choice_world.py | 11 ++++++----- iblrig/ephys.py | 2 +- iblrig/hardware.py | 6 +++--- iblrig/online_plots.py | 2 +- .../task_validation.py | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/iblrig/base_choice_world.py b/iblrig/base_choice_world.py index ea9be2a86..4381ba5a4 100644 --- a/iblrig/base_choice_world.py +++ b/iblrig/base_choice_world.py @@ -130,11 +130,12 @@ def __init__(self, *args, delay_secs=0, **kwargs): self.trials_table = self.TrialDataModel.preallocate_dataframe(NTRIALS_INIT) self.ambient_sensor_table = pd.DataFrame( { - 'Temperature_C': np.zeros(NTRIALS_INIT) * np.NaN, - 'AirPressure_mb': np.zeros(NTRIALS_INIT) * np.NaN, - 'RelativeHumidity': np.zeros(NTRIALS_INIT) * np.NaN, + 'Temperature_C': np.zeros(NTRIALS_INIT) * np.nan, + 'AirPressure_mb': np.zeros(NTRIALS_INIT) * np.nan, + 'RelativeHumidity': np.zeros(NTRIALS_INIT) * np.nan, } ) + self.settings = ChoiceWorldSettings() @staticmethod def extra_parser(): @@ -771,7 +772,7 @@ def trial_completed(self, bpod_data): self.trials_table.at[self.trial_num, 'response_time'] = response_time # get the trial outcome state_names = ['correct', 'error', 'no_go', 'omit_correct', 'omit_error', 'omit_no_go'] - raw_outcome = {sn: ~np.isnan(bpod_data['States timestamps'].get(sn, [[np.NaN]])[0][0]) for sn in state_names} + raw_outcome = {sn: ~np.isnan(bpod_data['States timestamps'].get(sn, [[np.nan]])[0][0]) for sn in state_names} try: outcome = next(k for k in raw_outcome if raw_outcome[k]) # Update response buffer -1 for left, 0 for nogo, and 1 for rightward @@ -820,7 +821,7 @@ class BiasedChoiceWorldSession(ActiveChoiceWorldSession): def __init__(self, **kwargs): super().__init__(**kwargs) self.blocks_table = pd.DataFrame( - {'probability_left': np.zeros(NBLOCKS_INIT) * np.NaN, 'block_length': np.zeros(NBLOCKS_INIT, dtype=np.int16) * -1} + {'probability_left': np.zeros(NBLOCKS_INIT) * np.nan, 'block_length': np.zeros(NBLOCKS_INIT, dtype=np.int16) * -1} ) def new_block(self): diff --git a/iblrig/ephys.py b/iblrig/ephys.py index 6dd194413..a08d95747 100644 --- a/iblrig/ephys.py +++ b/iblrig/ephys.py @@ -60,7 +60,7 @@ def neuropixel24_micromanipulator_coordinates(ref_shank, pname, ba=None, shank_s shank = { 'x': x, 'y': y, - 'z': np.NaN, + 'z': np.nan, 'phi': ref_shank['phi'], 'theta': ref_shank['theta'], 'depth': ref_shank['depth'], diff --git a/iblrig/hardware.py b/iblrig/hardware.py index 036ced4ae..117e433b6 100644 --- a/iblrig/hardware.py +++ b/iblrig/hardware.py @@ -206,9 +206,9 @@ def define_rotary_encoder_actions(self, module: BpodModule | None = None) -> Non def get_ambient_sensor_reading(self): if self.ambient_module is None: return { - 'Temperature_C': np.NaN, - 'AirPressure_mb': np.NaN, - 'RelativeHumidity': np.NaN, + 'Temperature_C': np.nan, + 'AirPressure_mb': np.nan, + 'RelativeHumidity': np.nan, } self.ambient_module.start_module_relay() self.bpod_modules.module_write(self.ambient_module, 'R') diff --git a/iblrig/online_plots.py b/iblrig/online_plots.py index b93275548..64296ea2a 100644 --- a/iblrig/online_plots.py +++ b/iblrig/online_plots.py @@ -103,7 +103,7 @@ def update_trial(self, trial_data, bpod_data) -> None: # update psychometrics using online statistics method indexer = (trial_data.stim_probability_left, signed_contrast) if indexer not in self.psychometrics.index: - self.psychometrics.loc[indexer, :] = np.NaN + self.psychometrics.loc[indexer, :] = np.nan self.psychometrics.loc[indexer, ('count')] = 0 self.psychometrics.loc[indexer, ('count')] += 1 self.psychometrics.loc[indexer, ('response_time')], self.psychometrics.loc[indexer, ('response_time_std')] = online_std( diff --git a/iblrig_tasks/_iblrig_tasks_neuroModulatorChoiceWorld/task_validation.py b/iblrig_tasks/_iblrig_tasks_neuroModulatorChoiceWorld/task_validation.py index 8cde9b6bb..ce05e3163 100644 --- a/iblrig_tasks/_iblrig_tasks_neuroModulatorChoiceWorld/task_validation.py +++ b/iblrig_tasks/_iblrig_tasks_neuroModulatorChoiceWorld/task_validation.py @@ -21,7 +21,7 @@ task_data['bpod_delay'] = 0 for i, bp in enumerate(bpod_data): sts = bp['States timestamps'] - task_data.at[i, 'bpod_valve_time'] = np.diff(sts.get('reward', np.NaN)) + task_data.at[i, 'bpod_valve_time'] = np.diff(sts.get('reward', np.nan)) task_data.at[i, 'bpod_delay'] = np.nansum( np.r_[ np.diff(sts['delay_reward'])[0] if 'delay_reward' in sts else 0, From f65da2093c7b36f653abdc0c0d9108652233f2de Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Mon, 14 Oct 2024 15:36:14 +0100 Subject: [PATCH 02/16] Update base_choice_world.py --- iblrig/base_choice_world.py | 1 - 1 file changed, 1 deletion(-) diff --git a/iblrig/base_choice_world.py b/iblrig/base_choice_world.py index 4381ba5a4..038a76610 100644 --- a/iblrig/base_choice_world.py +++ b/iblrig/base_choice_world.py @@ -135,7 +135,6 @@ def __init__(self, *args, delay_secs=0, **kwargs): 'RelativeHumidity': np.zeros(NTRIALS_INIT) * np.nan, } ) - self.settings = ChoiceWorldSettings() @staticmethod def extra_parser(): From aafc830a3181a7144cb5a8ab6da22f8ea5e15f2a Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Wed, 16 Oct 2024 14:34:45 +0100 Subject: [PATCH 03/16] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 283cedd7f..05408a877 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ XDG_CACHE_HOME/ app.log /.idea/* /venv/ +/.venv/ *.autosave iblrig/_version.py *.code-workspace @@ -46,4 +47,4 @@ devices/camera_recordings/*.layout .pdm-python /dist *~ -docs/source/api/* \ No newline at end of file +docs/source/api/* From 93cff54ba1a2150967e23e69793b66706802133f Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Thu, 17 Oct 2024 11:34:45 +0100 Subject: [PATCH 04/16] log session version --- iblrig/base_tasks.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iblrig/base_tasks.py b/iblrig/base_tasks.py index d2a11c311..346adf449 100644 --- a/iblrig/base_tasks.py +++ b/iblrig/base_tasks.py @@ -119,7 +119,10 @@ def __init__( self._logger = None self._setup_loggers(level=log_level) if not isinstance(self, EmptySession): - log.info(f'Running iblrig {iblrig.__version__}, pybpod version {pybpodapi.__version__}') + log.info(f'iblrig version {iblrig.__version__}') + log.info(f'pybpod version {pybpodapi.__version__}') + log.info(f'Session protocol: {self.protocol_name} ({f"version {self.version})" if self.version is not None else "undefined version"})') + log.info(f'Session call: {" ".join(sys.argv)}') self.interactive = interactive self._one = one From 2ada9966eb86f162f6895c365d79a8ade86e150f Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Thu, 17 Oct 2024 16:41:54 +0100 Subject: [PATCH 05/16] fixing typo --- docs/source/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/installation.rst b/docs/source/installation.rst index efba77d19..5d6642d0c 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -260,5 +260,5 @@ Then switch to the desired version, for example `8.15.5`: .. code-block:: powershell - git checkout tag/8.15.5 + git checkout tags/8.15.5 pip install --upgrade -e . From 800ad2948a957076adecb2f9d4d9eb0656d295ff Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Thu, 17 Oct 2024 18:34:52 +0100 Subject: [PATCH 06/16] correct gain for rotary encoder thresholds in trainingChoiceWorld --- CHANGELOG.md | 2 + iblrig/base_choice_world.py | 13 +++-- iblrig/base_tasks.py | 48 ++++++----------- iblrig/hardware.py | 94 ++++++++++++++++++++++------------ iblrig/pydantic_definitions.py | 1 + 5 files changed, 91 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07978501e..f7aad5081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Changelog 8.24.3 ------ * fix: create the `raw_ephys_data` folder even if there are no probes (when running behavior sessions on ephys rig) +* fix: correct gain for rotary encoder thresholds in trainingChoiceWorld +* overhaul of rotary encoder object * move some Qt related code to `iblqt` repository 8.24.2 diff --git a/iblrig/base_choice_world.py b/iblrig/base_choice_world.py index 038a76610..e45f86c81 100644 --- a/iblrig/base_choice_world.py +++ b/iblrig/base_choice_world.py @@ -479,6 +479,10 @@ def next_trial(self): def default_reward_amount(self): return self.task_params.REWARD_AMOUNT_UL + @property + def stimulus_gain(self) -> float: + return self.task_params.STIM_GAIN + def draw_next_trial_info(self, pleft=0.5, **kwargs): """Draw next trial variables. @@ -491,15 +495,12 @@ def draw_next_trial_info(self, pleft=0.5, **kwargs): quiescent_period = self.task_params.QUIESCENT_PERIOD + misc.truncated_exponential( scale=0.35, min_value=0.2, max_value=0.5 ) - stim_gain = ( - self.session_info.ADAPTIVE_GAIN_VALUE if self.task_params.get('ADAPTIVE_GAIN', False) else self.task_params.STIM_GAIN - ) self.trials_table.at[self.trial_num, 'quiescent_period'] = quiescent_period self.trials_table.at[self.trial_num, 'contrast'] = contrast self.trials_table.at[self.trial_num, 'stim_phase'] = random.uniform(0, 2 * math.pi) self.trials_table.at[self.trial_num, 'stim_sigma'] = self.task_params.STIM_SIGMA self.trials_table.at[self.trial_num, 'stim_angle'] = self.task_params.STIM_ANGLE - self.trials_table.at[self.trial_num, 'stim_gain'] = stim_gain + self.trials_table.at[self.trial_num, 'stim_gain'] = self.stimulus_gain self.trials_table.at[self.trial_num, 'stim_freq'] = self.task_params.STIM_FREQ self.trials_table.at[self.trial_num, 'stim_reverse'] = self.task_params.STIM_REVERSE self.trials_table.at[self.trial_num, 'trial_num'] = self.trial_num @@ -929,6 +930,10 @@ def __init__(self, training_phase=-1, adaptive_reward=-1.0, adaptive_gain=None, def default_reward_amount(self): return self.session_info.get('ADAPTIVE_REWARD_AMOUNT_UL', self.task_params.REWARD_AMOUNT_UL) + @property + def stimulus_gain(self) -> float: + return self.session_info.get('ADAPTIVE_GAIN_VALUE') + def get_subject_training_info(self): """ Get the previous session's according to this session parameters and deduce the diff --git a/iblrig/base_tasks.py b/iblrig/base_tasks.py index 346adf449..83827f065 100644 --- a/iblrig/base_tasks.py +++ b/iblrig/base_tasks.py @@ -24,7 +24,6 @@ import numpy as np import pandas as pd -import serial import yaml from pythonosc import udp_client @@ -36,7 +35,7 @@ from iblrig import net, path_helper, sound from iblrig.constants import BASE_PATH, BONSAI_EXE, PYSPIN_AVAILABLE from iblrig.frame2ttl import Frame2TTL -from iblrig.hardware import SOFTCODE, Bpod, MyRotaryEncoder, sound_device_factory +from iblrig.hardware import SOFTCODE, Bpod, RotaryEncoderModule, sound_device_factory from iblrig.hifi import HiFi from iblrig.path_helper import load_pydantic_yaml from iblrig.pydantic_definitions import HardwareSettings, RigSettings, TrialDataModel @@ -121,7 +120,10 @@ def __init__( if not isinstance(self, EmptySession): log.info(f'iblrig version {iblrig.__version__}') log.info(f'pybpod version {pybpodapi.__version__}') - log.info(f'Session protocol: {self.protocol_name} ({f"version {self.version})" if self.version is not None else "undefined version"})') + log.info( + f'Session protocol: {self.protocol_name} ' + f'({f"version {self.version})" if self.version is not None else "undefined version"})' + ) log.info(f'Session call: {" ".join(sys.argv)}') self.interactive = interactive @@ -992,38 +994,22 @@ def start_mixin_frame2ttl(self): log.info('Frame2TTL: Thresholds set.') -class RotaryEncoderMixin(BaseSession): +class RotaryEncoderMixin(BaseSession, HasBpod): """Rotary encoder interface for state machine.""" - def init_mixin_rotary_encoder(self, *args, **kwargs): - self.device_rotary_encoder = MyRotaryEncoder( - all_thresholds=self.task_params.STIM_POSITIONS + self.task_params.QUIESCENCE_THRESHOLDS, - gain=self.task_params.STIM_GAIN, - com=self.hardware_settings.device_rotary_encoder['COM_ROTARY_ENCODER'], - connect=False, - ) + device_rotary_encoder: RotaryEncoderModule + + def init_mixin_rotary_encoder(self): + thresholds_deg = self.task_params.STIM_POSITIONS + self.task_params.QUIESCENCE_THRESHOLDS + gain = self.task_params.STIM_GAIN + self.device_rotary_encoder = RotaryEncoderModule(self.hardware_settings.device_rotary_encoder, thresholds_deg, gain) def start_mixin_rotary_encoder(self): - if self.hardware_settings['device_rotary_encoder']['COM_ROTARY_ENCODER'] is None: - raise ValueError( - 'The value for device_rotary_encoder:COM_ROTARY_ENCODER in ' - 'settings/hardware_settings.yaml is null. Please ' - 'provide a valid port name.' - ) - try: - self.device_rotary_encoder.connect() - except serial.serialutil.SerialException as e: - raise serial.serialutil.SerialException( - f'The rotary encoder COM port {self.device_rotary_encoder.RE_PORT} is already in use. This is usually' - f' due to a Bonsai process currently running on the computer. Make sure all Bonsai windows are' - f' closed prior to running the task' - ) from e - except Exception as e: - raise Exception( - "The rotary encoder couldn't connect. If the bpod is glowing in green," - 'disconnect and reconnect bpod from the computer' - ) from e - log.info('Rotary encoder module loaded: OK') + self.device_rotary_encoder.gain = getattr(self, 'stimulus_gain', self.task_params.STIM_GAIN) + self.device_rotary_encoder.open() + self.device_rotary_encoder.write_parameters() + self.device_rotary_encoder.close() + log.info('Rotary Encoder Module loaded: OK') class ValveMixin(BaseSession, HasBpod): diff --git a/iblrig/hardware.py b/iblrig/hardware.py index 117e433b6..a15f2dbe1 100644 --- a/iblrig/hardware.py +++ b/iblrig/hardware.py @@ -18,12 +18,14 @@ import sounddevice as sd from annotated_types import Ge, Le from pydantic import PositiveFloat, PositiveInt, validate_call +from serial.serialutil import SerialException from serial.tools import list_ports +from iblrig.pydantic_definitions import HardwareSettingsRotaryEncoder from iblrig.tools import static_vars from iblutil.util import Bunch -from pybpod_rotaryencoder_module.module import RotaryEncoder -from pybpod_rotaryencoder_module.module_api import RotaryEncoderModule +from pybpod_rotaryencoder_module.module import RotaryEncoder as PybpodRotaryEncoder +from pybpod_rotaryencoder_module.module_api import RotaryEncoderModule as PybpodRotaryEncoderModule from pybpodapi.bpod.bpod_io import BpodIO from pybpodapi.bpod_modules.bpod_module import BpodModule from pybpodapi.state_machine import StateMachine @@ -193,7 +195,9 @@ def define_rotary_encoder_actions(self, module: BpodModule | None = None) -> Non { 'rotary_encoder_reset': ( module_port, - self._define_message(module, [RotaryEncoder.COM_SETZEROPOS, RotaryEncoder.COM_ENABLE_ALLTHRESHOLDS]), + self._define_message( + module, [PybpodRotaryEncoder.COM_SETZEROPOS, PybpodRotaryEncoder.COM_ENABLE_ALLTHRESHOLDS] + ), ), 'bonsai_hide_stim': (module_port, self._define_message(module, [ord('#'), 1])), 'bonsai_show_stim': (module_port, self._define_message(module, [ord('#'), 8])), @@ -320,35 +324,61 @@ def register_softcodes(self, softcode_dict: dict[int, Callable]) -> None: self.softcode_handler_function = lambda code: softcode_dict[code]() -class MyRotaryEncoder: - def __init__(self, all_thresholds, gain, com, connect=False): - self.RE_PORT = com - self.WHEEL_PERIM = 31 * 2 * np.pi # = 194,778744523 - self.deg_mm = 360 / self.WHEEL_PERIM - self.mm_deg = self.WHEEL_PERIM / 360 - self.factor = 1 / (self.mm_deg * gain) - self.SET_THRESHOLDS = [x * self.factor for x in all_thresholds] - self.ENABLE_THRESHOLDS = [(x != 0) for x in self.SET_THRESHOLDS] - # ENABLE_THRESHOLDS needs 8 bools even if only 2 thresholds are set - while len(self.ENABLE_THRESHOLDS) < 8: - self.ENABLE_THRESHOLDS.append(False) - - # Names of the RE events generated by Bpod - self.ENCODER_EVENTS = [f'RotaryEncoder1_{x}' for x in list(range(1, len(all_thresholds) + 1))] - # Dict mapping threshold crossings with name ov RE event - self.THRESHOLD_EVENTS = dict(zip(all_thresholds, self.ENCODER_EVENTS, strict=False)) - if connect: - self.connect() - - def connect(self): - if self.RE_PORT == 'COM#': - return - m = RotaryEncoderModule(self.RE_PORT) - m.set_zero_position() # Not necessarily needed - m.set_thresholds(self.SET_THRESHOLDS) - m.enable_thresholds(self.ENABLE_THRESHOLDS) - m.enable_evt_transmission() - m.close() +class RotaryEncoderModule(PybpodRotaryEncoderModule): + _name = 'Rotary Encoder Module' + + ENCODER_EVENTS = list() + THRESHOLD_EVENTS = dict() + + def __init__(self, settings: HardwareSettingsRotaryEncoder, thresholds_deg: list[float], gain: float): + super().__init__() + self.settings = settings + + self._wheel_degree_per_mm = 360.0 / (self.settings.WHEEL_DIAMETER_MM * np.pi) + self.thresholds_deg = thresholds_deg + self.gain = gain + self.ENCODER_EVENTS = [f'RotaryEncoder1_{x + 1}' for x in range(len(thresholds_deg))] + self.THRESHOLD_EVENTS = dict(zip(thresholds_deg, self.ENCODER_EVENTS, strict=False)) + + def open(self, _=None): + if self.settings.COM_ROTARY_ENCODER is None: + raise ValueError( + 'The value for device_rotary_encoder:COM_ROTARY_ENCODER in settings/hardware_settings.yaml is null. ' + 'Please provide a valid port name.' + ) + try: + super().open(self.settings.COM_ROTARY_ENCODER) + except SerialException as e: + raise SerialException( + f'The {self._name} on port {self.settings.COM_ROTARY_ENCODER} is already in use. This is ' + f'usually due to a Bonsai process running on the computer. Make sure all Bonsai windows are closed ' + f'prior to running the task.' + ) from e + except Exception as e: + raise Exception(f'The {self._name} on port {self.settings.COM_ROTARY_ENCODER} did not return the handshake.') from e + log.debug(f'Successfully opened serial connection to {self._name} on port {self.settings.COM_ROTARY_ENCODER}') + + def write_parameters(self): + scaled_thresholds_deg = [x / self.gain * self._wheel_degree_per_mm for x in self.thresholds_deg] + enabled = [(x < len(scaled_thresholds_deg)) for x in range(8)] + + log.info( + f'Thresholds for {self._name} scaled to {", ".join([f"{x:0.2f}°" for x in scaled_thresholds_deg])} ' + f'using gain of {self.gain:0.1f}°/mm and wheel diameter of {self.settings.WHEEL_DIAMETER_MM:0.1f}mm.' + ) + + self.set_zero_position() + self.set_thresholds(scaled_thresholds_deg) + self.enable_thresholds(enabled) + self.enable_evt_transmission() + + def close(self): + if hasattr(self, 'arcom'): + log.debug(f'Closing serial connection to {self._name} on port {self.settings.COM_ROTARY_ENCODER}') + super().close() + + def __del__(self): + self.close() def sound_device_factory(output: Literal['xonar', 'harp', 'hifi', 'sysdefault'] = 'sysdefault', samplerate: int | None = None): diff --git a/iblrig/pydantic_definitions.py b/iblrig/pydantic_definitions.py index 0d68312a4..f1d4c5eea 100644 --- a/iblrig/pydantic_definitions.py +++ b/iblrig/pydantic_definitions.py @@ -107,6 +107,7 @@ class HardwareSettingsFrame2TTL(BunchModel): class HardwareSettingsRotaryEncoder(BunchModel): COM_ROTARY_ENCODER: str | None + WHEEL_DIAMETER_MM: float = 62.0 class HardwareSettingsScreen(BunchModel): From 5cd11df29f88c830980db084064e042ba3a2e6fe Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Thu, 17 Oct 2024 18:48:41 +0100 Subject: [PATCH 07/16] update requirements --- pdm.lock | 482 ++++++++++++++++++++++++------------------------- pyproject.toml | 8 +- 2 files changed, 245 insertions(+), 245 deletions(-) diff --git a/pdm.lock b/pdm.lock index 19aea9bce..c3a06439d 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "ci", "dev", "doc", "project-extraction", "test", "typing"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:b6dae76706b27d84b1d5a0b19339dc1bf662b247155da409b620193225fcf399" +content_hash = "sha256:60948b73e6c0cf6b0e4e0fd3ce6557231ad52be77ce8672a875515b803095306" [[metadata.targets]] requires_python = "==3.10.*" @@ -47,7 +47,7 @@ files = [ [[package]] name = "anyio" -version = "4.6.0" +version = "4.6.2.post1" requires_python = ">=3.9" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["dev", "doc"] @@ -58,8 +58,8 @@ dependencies = [ "typing-extensions>=4.1; python_version < \"3.11\"", ] files = [ - {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, - {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, ] [[package]] @@ -132,23 +132,23 @@ files = [ [[package]] name = "boto3" -version = "1.35.30" +version = "1.35.42" requires_python = ">=3.8" summary = "The AWS SDK for Python" groups = ["default"] dependencies = [ - "botocore<1.36.0,>=1.35.30", + "botocore<1.36.0,>=1.35.42", "jmespath<2.0.0,>=0.7.1", "s3transfer<0.11.0,>=0.10.0", ] files = [ - {file = "boto3-1.35.30-py3-none-any.whl", hash = "sha256:d89c3459db89c5408e83219ab849ffd0146bc4285e75cdc67c6e45d390a12df2"}, - {file = "boto3-1.35.30.tar.gz", hash = "sha256:d2851aec8e9dc6937977acbe9a5124ecc31b3ad5f50a10cd9ae52636da3f52fa"}, + {file = "boto3-1.35.42-py3-none-any.whl", hash = "sha256:e1f36f8be453505cebcc3da178ea081b2a06c0e5e1cdee774f1067599b8d9c3e"}, + {file = "boto3-1.35.42.tar.gz", hash = "sha256:a5b00f8b82dce62870759f04861747944da834d64a64355970120c475efdafc0"}, ] [[package]] name = "botocore" -version = "1.35.30" +version = "1.35.42" requires_python = ">=3.8" summary = "Low-level, data-driven core of boto 3." groups = ["default"] @@ -159,8 +159,8 @@ dependencies = [ "urllib3<1.27,>=1.25.4; python_version < \"3.10\"", ] files = [ - {file = "botocore-1.35.30-py3-none-any.whl", hash = "sha256:3bb9f9dde001608671ea74681ac3cec06bbbb10cba8cb8c1387a25e843075ce0"}, - {file = "botocore-1.35.30.tar.gz", hash = "sha256:ab5350e8a50e48d371fa2d517d65c29a40c43788cb9a15387f93eac5a23df0fd"}, + {file = "botocore-1.35.42-py3-none-any.whl", hash = "sha256:05af0bb8b9cea7ce7bc589c332348d338a21b784e9d088a588fd10ec145007ff"}, + {file = "botocore-1.35.42.tar.gz", hash = "sha256:af348636f73dc24b7e2dc760a34d08c8f2f94366e9b4c78d877307b128abecef"}, ] [[package]] @@ -248,28 +248,28 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["default", "dev", "doc"] files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -289,13 +289,13 @@ files = [ [[package]] name = "cloudpickle" -version = "3.0.0" +version = "3.1.0" requires_python = ">=3.8" summary = "Pickler class to extend the standard pickle.Pickler functionality" groups = ["default"] files = [ - {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, - {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, + {file = "cloudpickle-3.1.0-py3-none-any.whl", hash = "sha256:fe11acda67f61aaaec473e3afe030feb131d78a43461b718185363384f1ba12e"}, + {file = "cloudpickle-3.1.0.tar.gz", hash = "sha256:81a929b6e3c7335c863c771d673d105f02efdb89dfaba0c90495d1c64796601b"}, ] [[package]] @@ -386,49 +386,49 @@ files = [ [[package]] name = "coverage" -version = "7.6.1" -requires_python = ">=3.8" +version = "7.6.3" +requires_python = ">=3.9" summary = "Code coverage measurement for Python" groups = ["dev", "test"] files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, + {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, + {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, + {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, + {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, ] [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.3" extras = ["toml"] -requires_python = ">=3.8" +requires_python = ">=3.9" summary = "Code coverage measurement for Python" groups = ["dev", "test"] dependencies = [ - "coverage==7.6.1", + "coverage==7.6.3", "tomli; python_full_version <= \"3.11.0a6\"", ] files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, + {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, + {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, + {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, + {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, ] [[package]] @@ -494,7 +494,7 @@ files = [ [[package]] name = "dask" -version = "2024.9.1" +version = "2024.10.0" requires_python = ">=3.10" summary = "Parallel PyData with Task Scheduling" groups = ["default"] @@ -509,8 +509,8 @@ dependencies = [ "toolz>=0.10.0", ] files = [ - {file = "dask-2024.9.1-py3-none-any.whl", hash = "sha256:3757bb6c976f0436fef6bd6ad32f8983ee5ce7d8a738a1f643e208cd390ec794"}, - {file = "dask-2024.9.1.tar.gz", hash = "sha256:06eccc6a68d2882bcd9de24548fa96e8d0da7fbfff0baed3f3c2a526b73dfbb4"}, + {file = "dask-2024.10.0-py3-none-any.whl", hash = "sha256:1ddc27c7967e134b4f8296a488521485a5ac4927cc63e2abfa0b24227b93217f"}, + {file = "dask-2024.10.0.tar.gz", hash = "sha256:dfd3efec5d8d8340fb647d0347637133030cad261b714623cc27de286e9db037"}, ] [[package]] @@ -529,17 +529,17 @@ files = [ [[package]] name = "debugpy" -version = "1.8.6" +version = "1.8.7" requires_python = ">=3.8" summary = "An implementation of the Debug Adapter Protocol for Python" groups = ["dev", "doc"] files = [ - {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, - {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, - {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, - {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, - {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, - {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, ] [[package]] @@ -555,13 +555,13 @@ files = [ [[package]] name = "docutils" -version = "0.20.1" -requires_python = ">=3.7" +version = "0.21.2" +requires_python = ">=3.9" summary = "Docutils -- Python Documentation Utilities" groups = ["dev", "doc"] files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -671,7 +671,7 @@ files = [ [[package]] name = "globus-sdk" -version = "3.45.0" +version = "3.46.0" requires_python = ">=3.8" summary = "Globus SDK for Python" groups = ["default"] @@ -680,11 +680,11 @@ dependencies = [ "importlib-resources>=5.12.0; python_version < \"3.9\"", "pyjwt[crypto]<3.0.0,>=2.0.0", "requests<3.0.0,>=2.19.1", - "typing-extensions>=4.0; python_version < \"3.10\"", + "typing-extensions>=4.0; python_version < \"3.11\"", ] files = [ - {file = "globus_sdk-3.45.0-py3-none-any.whl", hash = "sha256:bf3d523f5ac690539ab97e45195f44689f2df537ec5af73e77e2eaba4c1721e3"}, - {file = "globus_sdk-3.45.0.tar.gz", hash = "sha256:80da09d3ca254a63e1aa6d2f7cf86bc3252cf62f4321378a09199283b9df87fb"}, + {file = "globus_sdk-3.46.0-py3-none-any.whl", hash = "sha256:3e97ba898f410e7618314c7cc41b4c7afe5b551614f6f2255e15cf9aaca50954"}, + {file = "globus_sdk-3.46.0.tar.gz", hash = "sha256:eb5e1a3e724b6afe89277f2e3aed6d4959d7d3c4b05ed51f084eaa60ee6a4d25"}, ] [[package]] @@ -749,7 +749,7 @@ files = [ [[package]] name = "ibl-neuropixel" -version = "1.3.2" +version = "1.4.0" requires_python = ">=3.8" summary = "Collection of tools for Neuropixel 1.0 and 2.0 probes data" groups = ["default"] @@ -764,8 +764,8 @@ dependencies = [ "scipy>=1.11", ] files = [ - {file = "ibl_neuropixel-1.3.2-py3-none-any.whl", hash = "sha256:6a4bbd618cc94679d26ed6e291aff258fdc7e31706d9cce74dc6a6edb307523a"}, - {file = "ibl_neuropixel-1.3.2.tar.gz", hash = "sha256:264573fa7bd5a1dc01a2bfd06f1c1f878de79c3211279d565990c9ec33791252"}, + {file = "ibl_neuropixel-1.4.0-py3-none-any.whl", hash = "sha256:c5e529662fcf0040078e1746bc90304b80b107b2e91030a3b2d381f3b7b9c84f"}, + {file = "ibl_neuropixel-1.4.0.tar.gz", hash = "sha256:78f46b3174f8e3ed1307ed805673419ea4973d8497152f774c1f582fe891720c"}, ] [[package]] @@ -789,12 +789,12 @@ files = [ [[package]] name = "ibllib" -version = "2.38.0" +version = "2.39.1" requires_python = ">=3.8" summary = "IBL libraries" groups = ["default"] dependencies = [ - "ONE-api~=2.7rc1", + "ONE-api~=2.9.rc0", "boto3", "click>=7.0.0", "colorlog>=4.0.2", @@ -803,7 +803,7 @@ dependencies = [ "graphviz", "ibl-neuropixel>=1.0.1", "iblatlas>=0.5.3", - "iblutil>=1.9.0", + "iblutil>=1.11.0", "imagecodecs", "matplotlib>=3.0.3", "mtscomp>=1.0.1", @@ -828,8 +828,8 @@ dependencies = [ "tqdm>=4.32.1", ] files = [ - {file = "ibllib-2.38.0-py3-none-any.whl", hash = "sha256:78dbf3ca23ba22a9a0a121826f965975cb0f592b13ef083eaaf6084b6e328e55"}, - {file = "ibllib-2.38.0.tar.gz", hash = "sha256:25a7d5a32e7c15eb4d462ed7164af7a437412666d7aa9af75063bb33818332c1"}, + {file = "ibllib-2.39.1-py3-none-any.whl", hash = "sha256:261e7798befb5daed08d70f10918a9739003e38026357875ea2d6dcc912fcc4e"}, + {file = "ibllib-2.39.1.tar.gz", hash = "sha256:79ede021deb02b98810efc0d70b10913db7c53109c4cfe2c18028d5d214a449b"}, ] [[package]] @@ -854,7 +854,7 @@ dependencies = [ [[package]] name = "iblqt" -version = "0.1.1" +version = "0.2.0" requires_python = ">=3.10" summary = "A collection of extensions to the Qt framework." groups = ["default"] @@ -865,13 +865,13 @@ dependencies = [ "qtpy>=2.4.1", ] files = [ - {file = "iblqt-0.1.1-py3-none-any.whl", hash = "sha256:1a3c62dc7092e4cb1a6cf16029afc6938e7da7d0d1e957b901d3b031de2c8f78"}, - {file = "iblqt-0.1.1.tar.gz", hash = "sha256:d3d38c9db707dce62e58dce4bafe0ed7093684fd0868cddc46c1cfca98117249"}, + {file = "iblqt-0.2.0-py3-none-any.whl", hash = "sha256:19c0bed7f768df941f963be73ed985d571333b89a5d1ea1801a30632ef445946"}, + {file = "iblqt-0.2.0.tar.gz", hash = "sha256:533ce276dc1a00cf23c0f7daf154eda2bbe56516cde05923c744d91a2a75b17e"}, ] [[package]] name = "iblutil" -version = "1.12.1" +version = "1.13.0" requires_python = ">=3.8" summary = "IBL utilities" groups = ["default"] @@ -885,8 +885,8 @@ dependencies = [ "tqdm>=4.32.1", ] files = [ - {file = "iblutil-1.12.1-py3-none-any.whl", hash = "sha256:4f095730886773958e84b067f9ad7f452dcd85d4d5f442a54aa2e3a086a9b6ae"}, - {file = "iblutil-1.12.1.tar.gz", hash = "sha256:87af10ada660ad71ff0769fe356f30617b51da062fba147d3b354211adb04096"}, + {file = "iblutil-1.13.0-py3-none-any.whl", hash = "sha256:14a1d3bef30564d633433b3f9dbf8c3ec7c2bb3dfea2d1cd077107f31a986209"}, + {file = "iblutil-1.13.0.tar.gz", hash = "sha256:cc16a1fcc3e82fe2d6425e2b24fc2952e1d49824bfbf6a7a7d7feb502fdae7f1"}, ] [[package]] @@ -922,8 +922,8 @@ files = [ [[package]] name = "imageio" -version = "2.35.1" -requires_python = ">=3.8" +version = "2.36.0" +requires_python = ">=3.9" summary = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." groups = ["default"] dependencies = [ @@ -931,8 +931,8 @@ dependencies = [ "pillow>=8.3.2", ] files = [ - {file = "imageio-2.35.1-py3-none-any.whl", hash = "sha256:6eb2e5244e7a16b85c10b5c2fe0f7bf961b40fcb9f1a9fd1bd1d2c2f8fb3cd65"}, - {file = "imageio-2.35.1.tar.gz", hash = "sha256:4952dfeef3c3947957f6d5dedb1f4ca31c6e509a476891062396834048aeed2a"}, + {file = "imageio-2.36.0-py3-none-any.whl", hash = "sha256:471f1eda55618ee44a3c9960911c35e647d9284c68f077e868df633398f137f0"}, + {file = "imageio-2.36.0.tar.gz", hash = "sha256:1c8f294db862c256e9562354d65aa54725b8dafed7f10f02bb3ec20ec1678850"}, ] [[package]] @@ -1000,7 +1000,7 @@ files = [ [[package]] name = "ipython" -version = "8.27.0" +version = "8.28.0" requires_python = ">=3.10" summary = "IPython: Productive Interactive Computing" groups = ["default", "dev", "doc"] @@ -1018,8 +1018,8 @@ dependencies = [ "typing-extensions>=4.6; python_version < \"3.12\"", ] files = [ - {file = "ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c"}, - {file = "ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e"}, + {file = "ipython-8.28.0-py3-none-any.whl", hash = "sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35"}, + {file = "ipython-8.28.0.tar.gz", hash = "sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a"}, ] [[package]] @@ -1093,17 +1093,16 @@ files = [ [[package]] name = "jsonschema-specifications" -version = "2023.12.1" -requires_python = ">=3.8" +version = "2024.10.1" +requires_python = ">=3.9" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["dev", "doc"] dependencies = [ - "importlib-resources>=1.4.0; python_version < \"3.9\"", "referencing>=0.31.0", ] files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [[package]] @@ -1266,22 +1265,22 @@ files = [ [[package]] name = "markupsafe" -version = "2.1.5" -requires_python = ">=3.7" +version = "3.0.1" +requires_python = ">=3.9" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["dev", "doc"] files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, + {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, ] [[package]] @@ -1374,7 +1373,7 @@ files = [ [[package]] name = "mypy" -version = "1.11.2" +version = "1.12.0" requires_python = ">=3.8" summary = "Optional static typing for Python" groups = ["dev", "typing"] @@ -1384,13 +1383,13 @@ dependencies = [ "typing-extensions>=4.6.0", ] files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed"}, + {file = "mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469"}, + {file = "mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e"}, + {file = "mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a"}, + {file = "mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff"}, + {file = "mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266"}, + {file = "mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d"}, ] [[package]] @@ -1493,13 +1492,13 @@ files = [ [[package]] name = "networkx" -version = "3.3" +version = "3.4.1" requires_python = ">=3.10" summary = "Python package for creating and manipulating graphs and networks" groups = ["default"] files = [ - {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, - {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, + {file = "networkx-3.4.1-py3-none-any.whl", hash = "sha256:e30a87b48c9a6a7cc220e732bffefaee585bdb166d13377734446ce1a0620eed"}, + {file = "networkx-3.4.1.tar.gz", hash = "sha256:f9df45e85b78f5bd010993e897b4f1fdb242c11e015b101bd951e5c0e29982d8"}, ] [[package]] @@ -1729,30 +1728,30 @@ files = [ [[package]] name = "pillow" -version = "10.4.0" -requires_python = ">=3.8" +version = "11.0.0" +requires_python = ">=3.9" summary = "Python Imaging Library (Fork)" groups = ["default", "dev", "doc"] files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, ] [[package]] @@ -2023,13 +2022,13 @@ files = [ [[package]] name = "pyparsing" -version = "3.1.4" -requires_python = ">=3.6.8" +version = "3.2.0" +requires_python = ">=3.9" summary = "pyparsing module - Classes and methods to define and execute parsing grammars" groups = ["default"] files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [[package]] @@ -2251,13 +2250,14 @@ files = [ [[package]] name = "pywin32" -version = "306" +version = "308" summary = "Python for Window Extensions" groups = ["dev", "doc"] marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, ] [[package]] @@ -2392,34 +2392,34 @@ files = [ [[package]] name = "ruff" -version = "0.6.8" +version = "0.7.0" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["dev", "test"] files = [ - {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"}, - {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"}, - {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"}, - {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"}, - {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"}, - {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"}, - {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, + {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"}, + {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"}, + {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"}, + {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"}, + {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"}, + {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"}, + {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"}, ] [[package]] name = "s3transfer" -version = "0.10.2" +version = "0.10.3" requires_python = ">=3.8" summary = "An Amazon S3 Transfer Manager" groups = ["default"] @@ -2427,8 +2427,8 @@ dependencies = [ "botocore<2.0a.0,>=1.33.2", ] files = [ - {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, - {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, + {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, + {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, ] [[package]] @@ -2516,13 +2516,13 @@ files = [ [[package]] name = "setuptools" -version = "75.1.0" +version = "75.2.0" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["dev", "doc"] files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [[package]] @@ -2577,7 +2577,7 @@ files = [ [[package]] name = "sounddevice" -version = "0.5.0" +version = "0.5.1" requires_python = ">=3.7" summary = "Play and Record Sound with Python" groups = ["default"] @@ -2585,11 +2585,11 @@ dependencies = [ "CFFI>=1.0", ] files = [ - {file = "sounddevice-0.5.0-py3-none-any.whl", hash = "sha256:8a734043ab1f751cb20f6f25d8f07408a1aadf2eeca923061849d38bb59f9e3d"}, - {file = "sounddevice-0.5.0-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:73eb7cb1e8ab1e1ba09c228239e9d0b160006de380921687e44610ad9a19ac32"}, - {file = "sounddevice-0.5.0-py3-none-win32.whl", hash = "sha256:919de43040e8737258370ddf929a9cd1a3d6c493ca173bab70a3c7cb15c71e97"}, - {file = "sounddevice-0.5.0-py3-none-win_amd64.whl", hash = "sha256:f28b7ef16f293d7b048a614dd087dfe39c3e313d94a50539bb52022b7ef27ece"}, - {file = "sounddevice-0.5.0.tar.gz", hash = "sha256:0de95277654b3d403d9c15ded3c6cedf307e9b27cc9ce7bd995a2891d0c955af"}, + {file = "sounddevice-0.5.1-py3-none-any.whl", hash = "sha256:e2017f182888c3f3c280d9fbac92e5dbddac024a7e3442f6e6116bd79dab8a9c"}, + {file = "sounddevice-0.5.1-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:d16cb23d92322526a86a9490c427bf8d49e273d9ccc0bd096feecd229cde6031"}, + {file = "sounddevice-0.5.1-py3-none-win32.whl", hash = "sha256:d84cc6231526e7a08e89beff229c37f762baefe5e0cc2747cbe8e3a565470055"}, + {file = "sounddevice-0.5.1-py3-none-win_amd64.whl", hash = "sha256:4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1"}, + {file = "sounddevice-0.5.1.tar.gz", hash = "sha256:09ca991daeda8ce4be9ac91e15a9a81c8f81efa6b695a348c9171ea0c16cb041"}, ] [[package]] @@ -2652,7 +2652,7 @@ files = [ [[package]] name = "sphinx-autobuild" -version = "2024.9.19" +version = "2024.10.3" requires_python = ">=3.9" summary = "Rebuild Sphinx documentation on changes, with hot reloading in the browser." groups = ["dev", "doc"] @@ -2665,8 +2665,8 @@ dependencies = [ "websockets>=11", ] files = [ - {file = "sphinx_autobuild-2024.9.19-py3-none-any.whl", hash = "sha256:57d974eebfc6461ff0fd136e78bf7a9c057d543d5166d318a45599898019b82c"}, - {file = "sphinx_autobuild-2024.9.19.tar.gz", hash = "sha256:2dd4863d174e533c1cd075eb5dfc90ad9a21734af7efd25569bf228b405e08ef"}, + {file = "sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa"}, + {file = "sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1"}, ] [[package]] @@ -2717,18 +2717,18 @@ files = [ [[package]] name = "sphinx-rtd-theme" -version = "2.0.0" -requires_python = ">=3.6" +version = "3.0.1" +requires_python = ">=3.8" summary = "Read the Docs theme for Sphinx" groups = ["dev", "doc"] dependencies = [ - "docutils<0.21", - "sphinx<8,>=5", + "docutils<0.22,>0.18", + "sphinx<9,>=6", "sphinxcontrib-jquery<5,>=4", ] files = [ - {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, - {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, + {file = "sphinx_rtd_theme-3.0.1-py2.py3-none-any.whl", hash = "sha256:921c0ece75e90633ee876bd7b148cfaad136b481907ad154ac3669b6fc957916"}, + {file = "sphinx_rtd_theme-3.0.1.tar.gz", hash = "sha256:a4c5745d1b06dfcb80b7704fe532eb765b44065a8fad9851e4258c8804140703"}, ] [[package]] @@ -2762,18 +2762,18 @@ files = [ [[package]] name = "sphinx-tabs" -version = "3.4.5" -requires_python = "~=3.7" +version = "3.4.7" +requires_python = ">=3.7" summary = "Tabbed views for Sphinx" groups = ["dev", "doc"] dependencies = [ "docutils", "pygments", - "sphinx", + "sphinx>=1.8", ] files = [ - {file = "sphinx-tabs-3.4.5.tar.gz", hash = "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531"}, - {file = "sphinx_tabs-3.4.5-py3-none-any.whl", hash = "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09"}, + {file = "sphinx-tabs-3.4.7.tar.gz", hash = "sha256:991ad4a424ff54119799ba1491701aa8130dd43509474aef45a81c42d889784d"}, + {file = "sphinx_tabs-3.4.7-py3-none-any.whl", hash = "sha256:c12d7a36fd413b369e9e9967a0a4015781b71a9c393575419834f19204bd1915"}, ] [[package]] @@ -2874,7 +2874,7 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.35" +version = "2.0.36" requires_python = ">=3.7" summary = "Database Abstraction Library" groups = ["dev", "doc"] @@ -2884,16 +2884,16 @@ dependencies = [ "typing-extensions>=4.6.0", ] files = [ - {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, - {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, - {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, ] [[package]] @@ -2913,7 +2913,7 @@ files = [ [[package]] name = "starlette" -version = "0.39.2" +version = "0.41.0" requires_python = ">=3.8" summary = "The little ASGI library that shines." groups = ["dev", "doc"] @@ -2922,13 +2922,13 @@ dependencies = [ "typing-extensions>=3.10.0; python_version < \"3.10\"", ] files = [ - {file = "starlette-0.39.2-py3-none-any.whl", hash = "sha256:134dd6deb655a9775991d352312d53f1879775e5cc8a481f966e83416a2c3f71"}, - {file = "starlette-0.39.2.tar.gz", hash = "sha256:caaa3b87ef8518ef913dac4f073dea44e85f73343ad2bdc17941931835b2a26a"}, + {file = "starlette-0.41.0-py3-none-any.whl", hash = "sha256:a0193a3c413ebc9c78bff1c3546a45bb8c8bcb4a84cae8747d650a65bd37210a"}, + {file = "starlette-0.41.0.tar.gz", hash = "sha256:39cbd8768b107d68bfe1ff1672b38a2c38b49777de46d2a592841d58e3bf7c2a"}, ] [[package]] name = "statsmodels" -version = "0.14.3" +version = "0.14.4" requires_python = ">=3.9" summary = "Statistical computations and models for Python" groups = ["default"] @@ -2940,13 +2940,13 @@ dependencies = [ "scipy!=1.9.2,>=1.8", ] files = [ - {file = "statsmodels-0.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7372c92f18b8afb06355e067285abb94e8b214afd9f2fda6d3c26f3ea004cbdf"}, - {file = "statsmodels-0.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:42459cdaafe217f455e6b95c05d9e089caf02dd53295aebe63bc1e0206f83176"}, - {file = "statsmodels-0.14.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a72d3d9fe61f70baf18667bc9cf2e68b6bdd8f5cce4f7b21f9e662e19d2ffdf"}, - {file = "statsmodels-0.14.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9050e5817f23a5adcb87822406b5260758795c42c41fa2fa60816023f0a0d8ef"}, - {file = "statsmodels-0.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f12d74743936323165dae648f75193ee4a47381a85610be661d34de56c7634e0"}, - {file = "statsmodels-0.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:53212f597747534bed475bbd89f4bc39a3757c20692bb7664021e30fbd967c53"}, - {file = "statsmodels-0.14.3.tar.gz", hash = "sha256:ecf3502643fa93aabe5f0bdf238efb59609517c4d60a811632d31fcdce86c2d2"}, + {file = "statsmodels-0.14.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7a62f1fc9086e4b7ee789a6f66b3c0fc82dd8de1edda1522d30901a0aa45e42b"}, + {file = "statsmodels-0.14.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46ac7ddefac0c9b7b607eed1d47d11e26fe92a1bc1f4d9af48aeed4e21e87981"}, + {file = "statsmodels-0.14.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a337b731aa365d09bb0eab6da81446c04fde6c31976b1d8e3d3a911f0f1e07b"}, + {file = "statsmodels-0.14.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:631bb52159117c5da42ba94bd94859276b68cab25dc4cac86475bc24671143bc"}, + {file = "statsmodels-0.14.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3bb2e580d382545a65f298589809af29daeb15f9da2eb252af8f79693e618abc"}, + {file = "statsmodels-0.14.4-cp310-cp310-win_amd64.whl", hash = "sha256:9729642884147ee9db67b5a06a355890663d21f76ed608a56ac2ad98b94d201a"}, + {file = "statsmodels-0.14.4.tar.gz", hash = "sha256:5d69e0f39060dc72c067f9bb6e8033b6dccdb0bae101d76a7ef0bcc94e898b67"}, ] [[package]] @@ -3001,24 +3001,24 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" -requires_python = ">=3.7" +version = "2.0.2" +requires_python = ">=3.8" summary = "A lil' TOML parser" groups = ["default", "ci", "dev", "doc", "test", "typing"] files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] name = "toolz" -version = "0.12.1" -requires_python = ">=3.7" +version = "1.0.0" +requires_python = ">=3.8" summary = "List processing tools and functional utilities" groups = ["default"] files = [ - {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, - {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] [[package]] @@ -3091,13 +3091,13 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20240906" +version = "2.9.0.20241003" requires_python = ">=3.8" summary = "Typing stubs for python-dateutil" groups = ["dev", "typing"] files = [ - {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, - {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, ] [[package]] @@ -3113,7 +3113,7 @@ files = [ [[package]] name = "types-requests" -version = "2.32.0.20240914" +version = "2.32.0.20241016" requires_python = ">=3.8" summary = "Typing stubs for requests" groups = ["dev", "typing"] @@ -3121,8 +3121,8 @@ dependencies = [ "urllib3>=2", ] files = [ - {file = "types-requests-2.32.0.20240914.tar.gz", hash = "sha256:2850e178db3919d9bf809e434eef65ba49d0e7e33ac92d588f4a5e295fffd405"}, - {file = "types_requests-2.32.0.20240914-py3-none-any.whl", hash = "sha256:59c2f673eb55f32a99b2894faf6020e1a9f4a402ad0f192bfee0b64469054310"}, + {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, + {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, ] [[package]] @@ -3160,7 +3160,7 @@ files = [ [[package]] name = "uvicorn" -version = "0.31.0" +version = "0.32.0" requires_python = ">=3.8" summary = "The lightning-fast ASGI server." groups = ["dev", "doc"] @@ -3170,8 +3170,8 @@ dependencies = [ "typing-extensions>=4.0; python_version < \"3.11\"", ] files = [ - {file = "uvicorn-0.31.0-py3-none-any.whl", hash = "sha256:cac7be4dd4d891c363cd942160a7b02e69150dcbc7a36be04d5f4af4b17c8ced"}, - {file = "uvicorn-0.31.0.tar.gz", hash = "sha256:13bc21373d103859f68fe739608e2eb054a816dea79189bc3ca08ea89a275906"}, + {file = "uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82"}, + {file = "uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 9a0e613c6..bfbff02cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,10 +21,11 @@ dependencies = [ "PyQtWebEngine-Qt5==5.15.2", # # IBL packages - "ibllib>=2.38.0", + "ibllib>=2.39.1", "iblpybpod @ git+https://github.com/int-brain-lab/iblpybpod.git@no-gui", - "iblutil>=1.12.1", - "ONE-api>=2.9rc0", + "iblutil>=1.13.0", + "iblqt>=0.2.0", + "ONE-api>=2.9.1", "tycmd-wrapper>=0.2.1", # # Everything else @@ -42,7 +43,6 @@ dependencies = [ "PyYAML>=6.0.2", "scipy>=1.14.0", "sounddevice>=0.5.0", - "iblqt>=0.1.1", ] [project.optional-dependencies] project-extraction = [ From b4c9bbb1994bc43b5832c61a034e700e079ff0cb Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 10:17:18 +0100 Subject: [PATCH 08/16] version number / changelog --- CHANGELOG.md | 7 +++++-- iblrig/__init__.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7aad5081..3c656857e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,14 @@ Changelog ========= -8.24.3 +8.24.4 ------ -* fix: create the `raw_ephys_data` folder even if there are no probes (when running behavior sessions on ephys rig) * fix: correct gain for rotary encoder thresholds in trainingChoiceWorld * overhaul of rotary encoder object + +8.24.3 +------ +* fix: create the `raw_ephys_data` folder even if there are no probes (when running behavior sessions on ephys rig) * move some Qt related code to `iblqt` repository 8.24.2 diff --git a/iblrig/__init__.py b/iblrig/__init__.py index a7fb4293c..6c5aad425 100644 --- a/iblrig/__init__.py +++ b/iblrig/__init__.py @@ -6,7 +6,7 @@ # 5) git tag the release in accordance to the version number below (after merge!) # >>> git tag 8.15.6 # >>> git push origin --tags -__version__ = '8.24.3' +__version__ = '8.24.4' from iblrig.version_management import get_detailed_version_string From aa6e0475948a5686b0b8b816a6ceebaee4fd4e8d Mon Sep 17 00:00:00 2001 From: Miles Wells Date: Fri, 18 Oct 2024 12:26:18 +0300 Subject: [PATCH 09/16] remove patch_old_params function --- iblrig/test/test_video.py | 86 --------------------------------------- iblrig/video.py | 65 +---------------------------- 2 files changed, 2 insertions(+), 149 deletions(-) diff --git a/iblrig/test/test_video.py b/iblrig/test/test_video.py index f289e62fb..e829230ae 100644 --- a/iblrig/test/test_video.py +++ b/iblrig/test/test_video.py @@ -8,7 +8,6 @@ from unittest.mock import ANY, MagicMock, call, patch import numpy as np -import yaml from iblutil.io import net from iblutil.util import Bunch @@ -41,91 +40,6 @@ def test_download_from_alyx_or_flir(self, mock_os_rename, mock_hashfile, mock_aw mock_os_rename.assert_called_once_with(Path('mocked_tmp_file'), expected_out_file) -class TestSettings(unittest.TestCase): - def setUp(self): - self.old_params = Bunch( - { - 'DATA_FOLDER_PATH': r'D:\iblrig_data\Subjects', - 'REMOTE_DATA_FOLDER_PATH': r'\\iblserver.champalimaud.pt\ibldata\Subjects', - 'BODY_CAM_IDX': 0, - 'LEFT_CAM_IDX': 3, - 'RIGHT_CAM_IDX': 2, - } - ) - params_dict_mock = patch('iblrig.video.load_params_dict', return_value=self.old_params) - params_dict_mock.start() - self.addCleanup(params_dict_mock.stop) - self.tmp = tempfile.TemporaryDirectory() - self.addCleanup(self.tmp.cleanup) - # Some dummy files to open - for name in ('hardware_settings', 'iblrig_settings'): - (file := Path(self.tmp.name, name + '.yaml')).touch() - m = patch(f'iblrig.video.{name.replace("ibl", "").upper()}_YAML', file) - m.start() - self.addCleanup(m.stop) - - self._settings = {} # Store the unpatched settings (we'll use the template ones) - self.patched = {} # Store the patched settings - for file in ('iblrig', 'hardware'): - filepath = Path(video.__file__).parents[1].joinpath('settings', f'{file}_settings_template.yaml') - if filepath.exists(): - with open(filepath) as fp: - self._settings[file] = yaml.safe_load(fp.read()) - - def _return_settings(self, fp) -> dict: - """Return settings dict when yaml.safe_load mock called.""" - return self._settings['hardware' if 'hardware' in Path(fp.name).name else 'iblrig'] - - @patch('iblrig.video.params.getfile') - @patch('iblrig.video.yaml.safe_dump') - @patch('iblrig.video.yaml.safe_load') - def test_patch_old_params(self, safe_load_mock, safe_dump_mock, getfile_mock): - """Test iblrig.video.patch_old_params function.""" - (old_file := Path(self.tmp.name, '.videopc_params')).touch() - safe_load_mock.side_effect = self._return_settings - safe_dump_mock.side_effect = self._store_patched_settings - self._settings['hardware']['device_cameras']['ephys'] = {'left': {}, 'right': {'FPS': 150}, 'body': {}, 'belly': {}} - getfile_mock.return_value = old_file - video.patch_old_params(remove_old=False) - - # Check the patched hardware settings - patched = self.patched['hardware'] - self.assertIn('device_cameras', patched) - for cam, idx in dict(left=3, right=2, body=0).items(): - self.assertEqual(idx, patched['device_cameras']['ephys'][cam]['INDEX']) - self.assertEqual(3, self._settings['hardware']['device_cameras']['default']['left']['INDEX']) - # Check irrelevant fields unmodified - self.assertNotIn('right', self._settings['hardware']['device_cameras']['default']) - self.assertIn('belly', self._settings['hardware']['device_cameras']['ephys']) - - # Check the patched iblrig settings - patched = self.patched['iblrig'] - self.assertEqual(r'D:\iblrig_data', patched['iblrig_local_data_path']) - self.assertEqual(r'\\iblserver.champalimaud.pt\ibldata', patched['iblrig_remote_data_path']) - self.assertTrue(old_file.exists(), 'failed to keep old settings file') - - # Test insertion of 'subjects' path key if old location doesn't end in 'Subjects' - for key in ('DATA_FOLDER_PATH', 'REMOTE_DATA_FOLDER_PATH'): - self.old_params[key] = self.old_params[key].replace('Subjects', 'foobar') - with ( - patch('iblrig.video.HARDWARE_SETTINGS_YAML', Path(self.tmp.name, 'na')), - patch('iblrig.video.RIG_SETTINGS_YAML', Path(self.tmp.name, 'na')), - ): - # Check this works without settings files - video.patch_old_params(remove_old=True) - patched = self.patched['iblrig'] # Load the patched settings - self.assertEqual(self.old_params['DATA_FOLDER_PATH'], patched['iblrig_local_subjects_path']) - self.assertEqual(self.old_params['REMOTE_DATA_FOLDER_PATH'], patched['iblrig_remote_subjects_path']) - self.assertFalse(old_file.exists(), 'failed to remove old settings file') - - video.patch_old_params() # Shouldn't raise after removing old settings - - def _store_patched_settings(self, settings, fp): - """Store settings passed to yaml.safe_dump mock.""" - key = 'hardware' if 'hardware' in Path(fp.name).name else 'iblrig' - self.patched[key] = settings - - class TestPrepareVideoSession(unittest.TestCase): """Test for iblrig.video.prepare_video_session.""" diff --git a/iblrig/video.py b/iblrig/video.py index 4c0333d21..cdc312963 100644 --- a/iblrig/video.py +++ b/iblrig/video.py @@ -8,22 +8,18 @@ import zipfile from pathlib import Path -import yaml - from ibllib.io.raw_data_loaders import load_embedded_frame_data from ibllib.io.video import get_video_meta, label_from_path -from ibllib.pipes.misc import load_params_dict from iblrig.base_tasks import EmptySession -from iblrig.constants import HARDWARE_SETTINGS_YAML, HAS_PYSPIN, HAS_SPINNAKER, RIG_SETTINGS_YAML +from iblrig.constants import HARDWARE_SETTINGS_YAML, HAS_PYSPIN, HAS_SPINNAKER from iblrig.net import ExpInfo, get_server_communicator, read_stdin, update_alyx_token -from iblrig.path_helper import load_pydantic_yaml, patch_settings +from iblrig.path_helper import load_pydantic_yaml from iblrig.pydantic_definitions import HardwareSettings from iblrig.tools import ask_user, call_bonsai, call_bonsai_async from iblrig.transfer_experiments import VideoCopier from iblutil.io import ( hashfile, # type: ignore net, - params, ) from iblutil.util import setup_logger from one.api import OneAlyx @@ -166,63 +162,6 @@ def install_pyspin(): file_zip.unlink() -def patch_old_params(remove_old=False, update_paths=True): - """ - Update old video parameters. - - Parameters - ---------- - remove_old : bool - If true, removes the old video pc settings file. - update_paths : bool - If true, replace data paths in iblrig settings with those in old video pc settings file. - - """ - if not (old_file := Path(params.getfile('videopc_params'))).exists(): - return - old_settings = load_params_dict('videopc_params') - - # Update hardware settings - if HARDWARE_SETTINGS_YAML.exists(): - with open(HARDWARE_SETTINGS_YAML) as fp: - hardware_settings = patch_settings(yaml.safe_load(fp), HARDWARE_SETTINGS_YAML) - else: - hardware_settings = {} - cams = hardware_settings.get('device_cameras', {}) - for v in cams.values(): - for cam in filter(lambda k: k in v, ('left', 'right', 'body')): - v[cam]['INDEX'] = old_settings.get(cam.upper() + '_CAM_IDX') - - # Save hardware settings - hardware_settings['device_cameras'] = cams - log.debug('Saving %s', HARDWARE_SETTINGS_YAML) - with open(HARDWARE_SETTINGS_YAML, 'w') as fp: - yaml.safe_dump(hardware_settings, fp) - - # Update other settings - if update_paths: - if RIG_SETTINGS_YAML.exists(): - with open(RIG_SETTINGS_YAML) as fp: - rig_settings = yaml.safe_load(fp) - else: - rig_settings = {} - path_map = {'iblrig_local_data_path': 'DATA_FOLDER_PATH', 'iblrig_remote_data_path': 'REMOTE_DATA_FOLDER_PATH'} - for new_key, old_key in path_map.items(): - rig_settings[new_key] = old_settings[old_key].rstrip('\\') - if rig_settings[new_key].endswith(r'\Subjects'): - rig_settings[new_key] = rig_settings[new_key][: -len(r'\Subjects')] - else: # Add a 'subjects' key so that '\Subjects' is not incorrectly appended - rig_settings[new_key.replace('data', 'subjects')] = rig_settings[new_key] - log.debug('Saving %s', RIG_SETTINGS_YAML) - with open(RIG_SETTINGS_YAML, 'w') as fp: - yaml.safe_dump(rig_settings, fp) - - if remove_old: - # Deleting old file - log.info('Removing %s', old_file) - old_file.unlink() - - def prepare_video_session_cmd(): if not HAS_SPINNAKER: if ask_user("Spinnaker SDK doesn't seem to be installed. Do you want to install it now?"): From eda5b5bc501dfadae791ccf2aa1a643bdec7e050 Mon Sep 17 00:00:00 2001 From: Miles Wells Date: Fri, 18 Oct 2024 12:38:37 +0300 Subject: [PATCH 10/16] Fix passive test --- iblrig/test/tasks/test_passive_choice_world.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iblrig/test/tasks/test_passive_choice_world.py b/iblrig/test/tasks/test_passive_choice_world.py index 3694ec947..51043cd77 100644 --- a/iblrig/test/tasks/test_passive_choice_world.py +++ b/iblrig/test/tasks/test_passive_choice_world.py @@ -63,9 +63,9 @@ def test_pipeline(self) -> None: In order for this to work we must add an external sync to the experiment description as Bpod only passive choice world is currently not supported. """ - self.task.experiment_description['sync'] = dyn.get_acquisition_description('choice_world_recording')['sync'] + self.task.experiment_description['sync'] = dyn.get_acquisition_description('ephys')['sync'] self.task.create_session() pipeline = dyn.make_pipeline(self.task.paths.SESSION_FOLDER) self.assertIn('PassiveRegisterRaw_00', pipeline.tasks) - self.assertIn('PassiveTaskNidq_00', pipeline.tasks) - self.assertIsInstance(pipeline.tasks['PassiveTaskNidq_00'], PassiveTaskNidq) + self.assertIn('Trials_PassiveTaskNidq_00', pipeline.tasks) + self.assertIsInstance(pipeline.tasks['Trials_PassiveTaskNidq_00'], PassiveTaskNidq) From 8805fbe0a87c1de63ebe9018a1786ff2875d8f9f Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 11:34:54 +0100 Subject: [PATCH 11/16] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c656857e..0f912dec5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Changelog 8.24.3 ------ * fix: create the `raw_ephys_data` folder even if there are no probes (when running behavior sessions on ephys rig) +* fix: replace `np.NaN` with `np.nan` * move some Qt related code to `iblqt` repository 8.24.2 From 64347f2348c5a64ac79dca868dcf5ff57898b36c Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 13:11:21 +0100 Subject: [PATCH 12/16] move stimulus_gain() to RotaryEncoderMixin --- iblrig/base_tasks.py | 11 ++++++++--- iblrig/hardware.py | 7 ++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/iblrig/base_tasks.py b/iblrig/base_tasks.py index 83827f065..1d30e3a12 100644 --- a/iblrig/base_tasks.py +++ b/iblrig/base_tasks.py @@ -999,13 +999,18 @@ class RotaryEncoderMixin(BaseSession, HasBpod): device_rotary_encoder: RotaryEncoderModule + @property + def stimulus_gain(self) -> float: + return self.task_params.STIM_GAIN() + def init_mixin_rotary_encoder(self): thresholds_deg = self.task_params.STIM_POSITIONS + self.task_params.QUIESCENCE_THRESHOLDS - gain = self.task_params.STIM_GAIN - self.device_rotary_encoder = RotaryEncoderModule(self.hardware_settings.device_rotary_encoder, thresholds_deg, gain) + self.device_rotary_encoder = RotaryEncoderModule(self.hardware_settings.device_rotary_encoder, + thresholds_deg, + self.stimulus_gain) def start_mixin_rotary_encoder(self): - self.device_rotary_encoder.gain = getattr(self, 'stimulus_gain', self.task_params.STIM_GAIN) + self.device_rotary_encoder.gain = self.stimulus_gain self.device_rotary_encoder.open() self.device_rotary_encoder.write_parameters() self.device_rotary_encoder.close() diff --git a/iblrig/hardware.py b/iblrig/hardware.py index a15f2dbe1..6baafa65f 100644 --- a/iblrig/hardware.py +++ b/iblrig/hardware.py @@ -360,17 +360,18 @@ def open(self, _=None): def write_parameters(self): scaled_thresholds_deg = [x / self.gain * self._wheel_degree_per_mm for x in self.thresholds_deg] - enabled = [(x < len(scaled_thresholds_deg)) for x in range(8)] + enabled_thresholds = [(x < len(scaled_thresholds_deg)) for x in range(8)] log.info( f'Thresholds for {self._name} scaled to {", ".join([f"{x:0.2f}°" for x in scaled_thresholds_deg])} ' f'using gain of {self.gain:0.1f}°/mm and wheel diameter of {self.settings.WHEEL_DIAMETER_MM:0.1f}mm.' ) - + self.open() self.set_zero_position() self.set_thresholds(scaled_thresholds_deg) - self.enable_thresholds(enabled) + self.enable_thresholds(enabled_thresholds) self.enable_evt_transmission() + self.close() def close(self): if hasattr(self, 'arcom'): From a0c9806a708e2cb9616c9275401c1f9f45b73a01 Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 13:13:28 +0100 Subject: [PATCH 13/16] Update hardware.py --- iblrig/hardware.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/iblrig/hardware.py b/iblrig/hardware.py index 6baafa65f..ed602a2e8 100644 --- a/iblrig/hardware.py +++ b/iblrig/hardware.py @@ -366,12 +366,10 @@ def write_parameters(self): f'Thresholds for {self._name} scaled to {", ".join([f"{x:0.2f}°" for x in scaled_thresholds_deg])} ' f'using gain of {self.gain:0.1f}°/mm and wheel diameter of {self.settings.WHEEL_DIAMETER_MM:0.1f}mm.' ) - self.open() self.set_zero_position() self.set_thresholds(scaled_thresholds_deg) self.enable_thresholds(enabled_thresholds) self.enable_evt_transmission() - self.close() def close(self): if hasattr(self, 'arcom'): From ed3569d3ab00c8cc1e80b7f06e24a8bd137321b3 Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 13:13:39 +0100 Subject: [PATCH 14/16] Update base_tasks.py --- iblrig/base_tasks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iblrig/base_tasks.py b/iblrig/base_tasks.py index 1d30e3a12..1d2215c9c 100644 --- a/iblrig/base_tasks.py +++ b/iblrig/base_tasks.py @@ -1005,9 +1005,9 @@ def stimulus_gain(self) -> float: def init_mixin_rotary_encoder(self): thresholds_deg = self.task_params.STIM_POSITIONS + self.task_params.QUIESCENCE_THRESHOLDS - self.device_rotary_encoder = RotaryEncoderModule(self.hardware_settings.device_rotary_encoder, - thresholds_deg, - self.stimulus_gain) + self.device_rotary_encoder = RotaryEncoderModule( + self.hardware_settings.device_rotary_encoder, thresholds_deg, self.stimulus_gain + ) def start_mixin_rotary_encoder(self): self.device_rotary_encoder.gain = self.stimulus_gain From a7f4e4686b44129d503ea847580e9884984fdfce Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 13:25:16 +0100 Subject: [PATCH 15/16] Update hardware.py --- iblrig/hardware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iblrig/hardware.py b/iblrig/hardware.py index ed602a2e8..82a8ba4cd 100644 --- a/iblrig/hardware.py +++ b/iblrig/hardware.py @@ -363,8 +363,8 @@ def write_parameters(self): enabled_thresholds = [(x < len(scaled_thresholds_deg)) for x in range(8)] log.info( - f'Thresholds for {self._name} scaled to {", ".join([f"{x:0.2f}°" for x in scaled_thresholds_deg])} ' - f'using gain of {self.gain:0.1f}°/mm and wheel diameter of {self.settings.WHEEL_DIAMETER_MM:0.1f}mm.' + f'Thresholds for {self._name} scaled to {", ".join([f"{x:0.2f}" for x in scaled_thresholds_deg])} ' + f'using gain of {self.gain:0.1f} deg/mm and wheel diameter of {self.settings.WHEEL_DIAMETER_MM:0.1f} mm.' ) self.set_zero_position() self.set_thresholds(scaled_thresholds_deg) From 9801a3e94d1ee597ed5f816c96922cf58ec0c331 Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Fri, 18 Oct 2024 17:11:57 +0100 Subject: [PATCH 16/16] fix CI --- iblrig/base_choice_world.py | 4 ---- iblrig/base_tasks.py | 2 +- iblrig/test/test_hardware_mixins.py | 4 ++-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/iblrig/base_choice_world.py b/iblrig/base_choice_world.py index e45f86c81..a3e4ab341 100644 --- a/iblrig/base_choice_world.py +++ b/iblrig/base_choice_world.py @@ -479,10 +479,6 @@ def next_trial(self): def default_reward_amount(self): return self.task_params.REWARD_AMOUNT_UL - @property - def stimulus_gain(self) -> float: - return self.task_params.STIM_GAIN - def draw_next_trial_info(self, pleft=0.5, **kwargs): """Draw next trial variables. diff --git a/iblrig/base_tasks.py b/iblrig/base_tasks.py index 1d2215c9c..07d5e43c8 100644 --- a/iblrig/base_tasks.py +++ b/iblrig/base_tasks.py @@ -1001,7 +1001,7 @@ class RotaryEncoderMixin(BaseSession, HasBpod): @property def stimulus_gain(self) -> float: - return self.task_params.STIM_GAIN() + return self.task_params.STIM_GAIN def init_mixin_rotary_encoder(self): thresholds_deg = self.task_params.STIM_POSITIONS + self.task_params.QUIESCENCE_THRESHOLDS diff --git a/iblrig/test/test_hardware_mixins.py b/iblrig/test/test_hardware_mixins.py index 1fcfae39f..f08e20016 100644 --- a/iblrig/test/test_hardware_mixins.py +++ b/iblrig/test/test_hardware_mixins.py @@ -101,8 +101,8 @@ def test_rotary_encoder_mixin(self): """ Instantiates a bare session with the rotary encoder mixin """ - session = self.session - RotaryEncoderMixin.init_mixin_rotary_encoder(session) + RotaryEncoderSession = type('RotaryEncoderSession', (EmptyHardwareSession, RotaryEncoderMixin), {}) # noqa: N806 + session = RotaryEncoderSession(task_parameter_file=ChoiceWorldSession.base_parameters_file, **TASK_KWARGS) assert session.device_rotary_encoder.ENCODER_EVENTS == [ 'RotaryEncoder1_1', 'RotaryEncoder1_2',