Metadata-Version: 2.4
Name: poulet_py
Version: 0.2.0
Summary: A library which hosts various neuroscience python methods
Project-URL: Homepage, https://github.com/poulet-lab/poulet_py
Project-URL: Documentation, https://github.com/poulet-lab/poulet_py
Project-URL: Changelog, https://github.com/poulet-lab/poulet_py/release-notes/
Project-URL: Source, https://github.com/poulet-lab/poulet_py
Author-email: Viktor Karamanis <viktor.karamanis@outlook.com>
License-Expression: GPL-3.0-or-later
License-File: LICENSE
Keywords: poulet_py
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: <3.14,>=3.10
Requires-Dist: deprecated<=1.3.1
Requires-Dist: lazy-loader<=0.5
Requires-Dist: prompt-toolkit<=3.0.52
Requires-Dist: pydantic-settings<=2.14.2
Requires-Dist: pydantic<=2.13.4
Requires-Dist: python-dotenv<=1.2.2
Requires-Dist: rich<=15.0.0
Provides-Extra: all
Requires-Dist: adafruit-circuitpython-ina228<2.0.5; (platform_system != 'Windows') and extra == 'all'
Requires-Dist: adafruit-circuitpython-max31856<=0.12.7; (platform_system != 'Windows') and extra == 'all'
Requires-Dist: flirpy<=0.6.2; extra == 'all'
Requires-Dist: gpiozero<=2.0.1; extra == 'all'
Requires-Dist: h5py<=3.16.0; extra == 'all'
Requires-Dist: keyboard<=0.13.5; extra == 'all'
Requires-Dist: lgpio<=0.2.2.0; (platform_system == 'Linux') and extra == 'all'
Requires-Dist: matplotlib<=3.10.9; extra == 'all'
Requires-Dist: nidaqmx<=1.5.0; extra == 'all'
Requires-Dist: numpy<=2.4.4; extra == 'all'
Requires-Dist: numpydantic<=1.10.0; extra == 'all'
Requires-Dist: open-ephys-python-tools<=1.0.1; extra == 'all'
Requires-Dist: opencv-python<=5.0.0.93; extra == 'all'
Requires-Dist: orjson<=3.11.9; extra == 'all'
Requires-Dist: pandas<=3.0.2; extra == 'all'
Requires-Dist: pillow<=12.3.0; extra == 'all'
Requires-Dist: pypylon<=26.6; extra == 'all'
Requires-Dist: pyserial<=3.5; extra == 'all'
Requires-Dist: pythonnet<=3.1.0; (platform_system == 'Windows') and extra == 'all'
Requires-Dist: pywin32<=312; (platform_system == 'Windows') and extra == 'all'
Requires-Dist: scipy<=1.17.1; extra == 'all'
Requires-Dist: spidev<=3.8; (platform_system == 'Linux') and extra == 'all'
Requires-Dist: zstandard<=0.25.0; extra == 'all'
Provides-Extra: arduino
Requires-Dist: pyserial<=3.5; extra == 'arduino'
Provides-Extra: camera
Requires-Dist: h5py<=3.16.0; extra == 'camera'
Requires-Dist: keyboard<=0.13.5; extra == 'camera'
Requires-Dist: matplotlib<=3.10.9; extra == 'camera'
Requires-Dist: numpy<=2.4.4; extra == 'camera'
Requires-Dist: opencv-python<=5.0.0.93; extra == 'camera'
Requires-Dist: pypylon<=26.6; extra == 'camera'
Requires-Dist: pythonnet<=3.1.0; (platform_system == 'Windows') and extra == 'camera'
Requires-Dist: pywin32<=312; (platform_system == 'Windows') and extra == 'camera'
Requires-Dist: scipy<=1.17.1; extra == 'camera'
Provides-Extra: converters
Requires-Dist: flirpy<=0.6.2; extra == 'converters'
Requires-Dist: h5py<=3.16.0; extra == 'converters'
Requires-Dist: pandas<=3.0.2; extra == 'converters'
Requires-Dist: pillow<=12.3.0; extra == 'converters'
Requires-Dist: zstandard<=0.25.0; extra == 'converters'
Provides-Extra: daq
Requires-Dist: nidaqmx<=1.5.0; extra == 'daq'
Provides-Extra: docs
Requires-Dist: ipython<=9.13.0; extra == 'docs'
Requires-Dist: pydata-sphinx-theme<=0.19.0; extra == 'docs'
Requires-Dist: sphinx-autodoc-typehints<=3.10.2; extra == 'docs'
Requires-Dist: sphinx<=9.1.0; extra == 'docs'
Provides-Extra: event
Requires-Dist: numpydantic<=1.10.0; extra == 'event'
Provides-Extra: exp
Requires-Dist: adafruit-circuitpython-ina228<2.0.5; (platform_system != 'Windows') and extra == 'exp'
Requires-Dist: adafruit-circuitpython-max31856<=0.12.7; (platform_system != 'Windows') and extra == 'exp'
Requires-Dist: h5py<=3.16.0; extra == 'exp'
Requires-Dist: numpy<=2.4.4; extra == 'exp'
Requires-Dist: numpydantic<=1.10.0; extra == 'exp'
Requires-Dist: open-ephys-python-tools<=1.0.1; extra == 'exp'
Requires-Dist: orjson<=3.11.9; extra == 'exp'
Requires-Dist: spidev<=3.8; (platform_system == 'Linux') and extra == 'exp'
Provides-Extra: gpio
Requires-Dist: gpiozero<=2.0.1; extra == 'gpio'
Requires-Dist: lgpio<=0.2.2.0; (platform_system == 'Linux') and extra == 'gpio'
Provides-Extra: hardware
Requires-Dist: gpiozero<=2.0.1; extra == 'hardware'
Requires-Dist: h5py<=3.16.0; extra == 'hardware'
Requires-Dist: keyboard<=0.13.5; extra == 'hardware'
Requires-Dist: lgpio<=0.2.2.0; (platform_system == 'Linux') and extra == 'hardware'
Requires-Dist: matplotlib<=3.10.9; extra == 'hardware'
Requires-Dist: nidaqmx<=1.5.0; extra == 'hardware'
Requires-Dist: numpy<=2.4.4; extra == 'hardware'
Requires-Dist: opencv-python<=5.0.0.93; extra == 'hardware'
Requires-Dist: pandas<=3.0.2; extra == 'hardware'
Requires-Dist: pypylon<=26.6; extra == 'hardware'
Requires-Dist: pyserial<=3.5; extra == 'hardware'
Requires-Dist: pythonnet<=3.1.0; (platform_system == 'Windows') and extra == 'hardware'
Requires-Dist: pywin32<=312; (platform_system == 'Windows') and extra == 'hardware'
Requires-Dist: scipy<=1.17.1; extra == 'hardware'
Provides-Extra: io
Requires-Dist: adafruit-circuitpython-ina228<2.0.5; (platform_system != 'Windows') and extra == 'io'
Requires-Dist: adafruit-circuitpython-max31856<=0.12.7; (platform_system != 'Windows') and extra == 'io'
Requires-Dist: h5py<=3.16.0; extra == 'io'
Requires-Dist: numpy<=2.4.4; extra == 'io'
Requires-Dist: numpydantic<=1.10.0; extra == 'io'
Requires-Dist: open-ephys-python-tools<=1.0.1; extra == 'io'
Requires-Dist: orjson<=3.11.9; extra == 'io'
Requires-Dist: spidev<=3.8; (platform_system == 'Linux') and extra == 'io'
Provides-Extra: julabo
Requires-Dist: pyserial<=3.5; extra == 'julabo'
Provides-Extra: nidaq
Requires-Dist: nidaqmx<=1.5.0; extra == 'nidaq'
Provides-Extra: osc
Requires-Dist: matplotlib<=3.10.9; extra == 'osc'
Requires-Dist: numpy<=2.4.4; extra == 'osc'
Requires-Dist: pandas<=3.0.2; extra == 'osc'
Provides-Extra: qst
Requires-Dist: pandas<=3.0.2; extra == 'qst'
Requires-Dist: pyserial<=3.5; extra == 'qst'
Provides-Extra: seq
Requires-Dist: flirpy<=0.6.2; extra == 'seq'
Requires-Dist: h5py<=3.16.0; extra == 'seq'
Requires-Dist: pandas<=3.0.2; extra == 'seq'
Requires-Dist: pillow<=12.3.0; extra == 'seq'
Requires-Dist: zstandard<=0.25.0; extra == 'seq'
Provides-Extra: sinks
Requires-Dist: h5py<=3.16.0; extra == 'sinks'
Requires-Dist: numpy<=2.4.4; extra == 'sinks'
Requires-Dist: numpydantic<=1.10.0; extra == 'sinks'
Requires-Dist: orjson<=3.11.9; extra == 'sinks'
Provides-Extra: soho
Requires-Dist: pandas<=3.0.2; extra == 'soho'
Provides-Extra: sources
Requires-Dist: adafruit-circuitpython-ina228<2.0.5; (platform_system != 'Windows') and extra == 'sources'
Requires-Dist: adafruit-circuitpython-max31856<=0.12.7; (platform_system != 'Windows') and extra == 'sources'
Requires-Dist: numpy<=2.4.4; extra == 'sources'
Requires-Dist: numpydantic<=1.10.0; extra == 'sources'
Requires-Dist: open-ephys-python-tools<=1.0.1; extra == 'sources'
Requires-Dist: spidev<=3.8; (platform_system == 'Linux') and extra == 'sources'
Provides-Extra: stimuli
Requires-Dist: adafruit-circuitpython-ina228<2.0.5; (platform_system != 'Windows') and extra == 'stimuli'
Requires-Dist: adafruit-circuitpython-max31856<=0.12.7; (platform_system != 'Windows') and extra == 'stimuli'
Requires-Dist: h5py<=3.16.0; extra == 'stimuli'
Requires-Dist: matplotlib<=3.10.9; extra == 'stimuli'
Requires-Dist: nidaqmx<=1.5.0; extra == 'stimuli'
Requires-Dist: numpy<=2.4.4; extra == 'stimuli'
Requires-Dist: numpydantic<=1.10.0; extra == 'stimuli'
Requires-Dist: open-ephys-python-tools<=1.0.1; extra == 'stimuli'
Requires-Dist: orjson<=3.11.9; extra == 'stimuli'
Requires-Dist: pandas<=3.0.2; extra == 'stimuli'
Requires-Dist: pyserial<=3.5; extra == 'stimuli'
Requires-Dist: spidev<=3.8; (platform_system == 'Linux') and extra == 'stimuli'
Provides-Extra: tools
Requires-Dist: orjson<=3.11.9; extra == 'tools'
Provides-Extra: triggers
Requires-Dist: gpiozero<=2.0.1; extra == 'triggers'
Requires-Dist: lgpio<=0.2.2.0; (platform_system == 'Linux') and extra == 'triggers'
Provides-Extra: utils
Requires-Dist: adafruit-circuitpython-ina228<2.0.5; (platform_system != 'Windows') and extra == 'utils'
Requires-Dist: adafruit-circuitpython-max31856<=0.12.7; (platform_system != 'Windows') and extra == 'utils'
Requires-Dist: h5py<=3.16.0; extra == 'utils'
Requires-Dist: matplotlib<=3.10.9; extra == 'utils'
Requires-Dist: numpy<=2.4.4; extra == 'utils'
Requires-Dist: numpydantic<=1.10.0; extra == 'utils'
Requires-Dist: open-ephys-python-tools<=1.0.1; extra == 'utils'
Requires-Dist: orjson<=3.11.9; extra == 'utils'
Requires-Dist: pandas<=3.0.2; extra == 'utils'
Requires-Dist: spidev<=3.8; (platform_system == 'Linux') and extra == 'utils'
Description-Content-Type: text/markdown

# Poulet Py – Neuroscience Python Library from Poulet Lab
A modular Python library for neuroscientific hardware control, data analysis, and experimental setups.

[![Unit Tests](https://github.com/poulet-lab/poulet_py/actions/workflows/test-suite.yml/badge.svg?branch=main)](https://github.com/poulet-lab/poulet_py/actions/workflows/test-suite.yml)

## Overview
Poulet provides a collection of tools for neuroscience researchers, including:
* Hardware communication (e.g., serial devices, DAQ interfaces)
* Data analysis utilities
* Experimental workflow automation

The library is organized into these core modules:

|Module        |Description|
| --------     | ------- |
|**config**    |It contains the SETTINGS and LOGGER constants for loading environmental variables and logging.|
|**converters**|For converting different filetypes to common data science (h5, plk, etc.).|
|**hardware**  |Low-level drivers and interfaces for external devices (e.g., amplifiers, stimulator).|
|**tools**     |Helper functions (serializers, generators, file I/O) – typically class-free.|
|**utils**     |High-level interactive tools for experiments and data processing.|

## Installation
### Minimal Installation
```sh
pip install -U .
```

### Optional Dependencies
Install specific modules:
```sh
pip install -U .[hardware]          # Only hardware dependencies
pip install -U .[tools,utils]       # Tools + utilities

# Special case for seq or all:
pip install -U git+https://github.com/LJMUAstroecology/flirpy.git
pip install -U .[seq]

pip install -U .[all]               # Everything
```

### Development Mode (Editable Install)
```sh
pip install -U git+https://github.com/LJMUAstroecology/flirpy.git
pip install -U -e .[all]            # For contributors
```

## Configuration
The config/ folder includes:
* settings.py – Environment variables for dynamic configuration (avoid hardcoded values).
* Custom logger – Use instead of print() for better debugging.

Example:
```python
from poulet_py import LOGGER
LOGGER.info("Starting trial...")
```

## Examples
Check the examples/ folder for usage scripts, such as:
* examples/oscilloscope.py – Oscilloscope like visualization.

## Contributing
We welcome contributions! Follow these guidelines:

1. Branching
  * Work on a dedicated branch (git checkout -b your-feature).
  * Submit PRs to the dev branch (PRs to main will be rejected).
  
2. Code Standards
  * Tests: Add unit tests in tests/ (mirroring the module structure).
  * Documentation: Use docstrings and update __init__.py for lazy loading.
  * Type hints: Recommended for new functions.

3. Commit Messages
  * Use semantic prefixes (e.g., feat:, fix:, docs:).



