content: [build-system]
  build-backend = 'setuptools.build_meta'
  requires = ['setuptools >= 64.0.0', 'setuptools_scm>=8']
  
  [dependency-groups]
  doc = [
    'furo',
    'intersphinx_registry',
    'matplotlib',
    'memory-profiler',
    'numpydoc',
    'scikit-learn',
    'setuptools',
    'sphinx!=7.2.*',
    'sphinx-copybutton',
    'sphinx-design',
    'sphinx-gallery',
    'sphinx-issues',
    'sphinxcontrib-bibtex',
  ]
  ide = [
    'ipykernel',
    'ipython',
  ]
  stubs = ['mypy', 'ruff>=0.6.0']
  style = [
    'bibclean',
    'codespell[toml]>=2.2.4',
    'pre-commit',
    'ruff>=0.6.0',
    'toml-sort',
    'yamllint',
  ]
  test = [
    'pytest-cov',
    'pytest-randomly',
    'pytest-timeout',
    'pytest>=8.0',
  ]
  
  [project]
  authors = [
    {email = 'mathieu.scheltienne@gmail.com', name = 'Mathieu Scheltienne'},
  ]
  classifiers = [
    'Intended Audience :: Developers',
    'Intended Audience :: Science/Research',
    'Natural Language :: English',
    'Operating System :: MacOS',
    'Operating System :: Microsoft :: Windows',
    'Operating System :: Unix',
    'Programming Language :: Python :: 3 :: Only',
    'Programming Language :: Python :: 3.10',
    'Programming Language :: Python :: 3.11',
    'Programming Language :: Python :: 3.12',
    'Programming Language :: Python :: 3.13',
    'Programming Language :: Python :: 3.14',
    'Topic :: Scientific/Engineering',
    'Topic :: Software Development',
  ]
  dependencies = [
    'click>=8.1',
    'mne>=1.6',
    'numpy>=1.21,<3',
    'packaging',
    'pooch',
    'psutil',
    'pyqtgraph',
    'qtpy',
    'scipy',
    'tomli; python_version < "3.11"',
  ]
  description = 'Real-time framework integrated with MNE-Python for online neuroscience research through LSL-compatible devices.'
  dynamic = ["version"]
  keywords = [
    'brain',
    'EEG',
    'eeg',
    'electroencephalography',
    'labstreaminglayer',
    'LSL',
    'neuroimaging',
    'neurophysiology',
    'neuroscience',
    'python',
    'real-time',
  ]
  license = {file = 'LICENSE'}
  maintainers = [
    {email = 'mathieu.scheltienne@gmail.com', name = 'Mathieu Scheltienne'},
  ]
  name = 'mne_lsl'
  readme = 'README.md'
  requires-python = '>=3.10'
  
  [project.scripts]
  mne-lsl = 'mne_lsl._commands.main:run'
  
  [project.urls]
  documentation = 'https://mne.tools/mne-lsl'
  homepage = 'https://mne.tools/mne-lsl'
  source = 'https://github.com/mne-tools/mne-lsl'
  tracker = 'https://github.com/mne-tools/mne-lsl/issues'
  
  [tool.cibuildwheel]
  archs = "native"
  build = ["cp310-*"]  # abi3 wheel, can build for a single Python version
  build-frontend = "build[uv]"
  skip = ["*-musllinux*", "pp*"]  # no PyPy support for pp310 for SciPy
  test-command = "bash {project}/tools/test_liblsl.sh"
  
  [tool.cibuildwheel.linux]
  repair-wheel-command = [
    "auditwheel repair -w {dest_dir} {wheel}",
  ]
  
  [tool.cibuildwheel.macos]
  repair-wheel-command = [
    "delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}",
  ]
  
  [tool.cibuildwheel.macos.environment]
  MACOSX_DEPLOYMENT_TARGET = "11"
  
  [[tool.cibuildwheel.overrides]]
  repair-wheel-command = "pipx run abi3audit --strict --report {wheel}"
  select = "cp*"  # abi3 not used for PyPi / pp*
  inherit.repair-wheel-command = "append"
  
  [tool.cibuildwheel.windows]
  before-build = "pip install delvewheel"
  repair-wheel-command = [
    "delvewheel repair -w {dest_dir} {wheel}",
  ]
  
  [tool.codespell]
  check-filenames = true
  check-hidden = true
  ignore-words = '.codespellignore'
  skip = 'build,.git,.mypy_cache,.pytest_cache,doc/_static/logos/*'
  
  [tool.coverage.report]
  exclude_lines = [
    'if __name__ == .__main__.:',
    'if TYPE_CHECKING:',
    'pragma: no cover',
  ]
  omit = ['**/mne_lsl/stream_viewer/*']
  precision = 2
  
  [tool.coverage.run]
  branch = true
  cover_pylib = false
  omit = [
    '**/__init__.py',
    '**/mne_lsl/_typing.py',
    '**/mne_lsl/_version.py',
    '**/mne_lsl/utils/_fixes.py',
    '**/mne_lsl/utils/_tests.py',
  ]
  
  [tool.pytest.ini_options]
  addopts = ['--color=yes', '--cov-report=', '--durations=20', '--junit-xml=junit-results.xml', '--strict-config', '--tb=short', '-ra', '-v']
  junit_family = 'xunit2'
  minversion = '8.0'
  
  [tool.ruff]
  extend-exclude = ["doc/_examples/*.py"]
  line-length = 88
  
  [tool.ruff.format]
  docstring-code-format = true
  line-ending = "lf"
  
  [tool.ruff.lint]
  ignore = []
  select = ['A', 'B', 'D', 'E', 'F', 'G', 'I', 'LOG', 'NPY', 'PIE', 'PT', 'T20', 'UP', 'W']
  
  [tool.ruff.lint.per-file-ignores]
  '*' = [
    'B904',  # 'Within an except clause, raise exceptions with raise ... from ...'
    'D100',  # 'Missing docstring in public module'
    'D104',  # 'Missing docstring in public package'
    'D107',  # 'Missing docstring in __init__'
  ]
  '*.pyi' = ['A002', 'D', 'E501', 'F811']
  '*/stream_viewer/backends/*' = ['D401']
  '__init__.py' = ['F401']
  'examples/*' = ['B018', 'D205', 'D400', 'E402', 'F811', 'T201']
  'tests/*' = ['D401']
  'tutorials/*' = ['B018', 'D205', 'D400', 'E402', 'F811', 'T201']
  
  [tool.ruff.lint.pydocstyle]
  convention = 'numpy'
  ignore-decorators = ["mne_lsl.utils._docs.copy_doc", "qtpy.QtCore.Slot"]
  
  [tool.setuptools]
  include-package-data = true
  
  [tool.setuptools.package-data]
  'mne_lsl.datasets' = ['*registry.txt']
  "mne_lsl.lsl.lib" = ["*"]
  'mne_lsl.stream_viewer.control_gui.settings' = ['*.ini']
  
  [tool.setuptools.packages.find]
  include = ["mne_lsl*"]
  where = ["src"]
  
  [tool.setuptools_scm]
  version_file = "src/mne_lsl/_version.py"
  version_scheme = "release-branch-semver"
  
  [tool.tomlsort]
  all = true
  ignore_case = true
  spaces_before_inline_comment = 2
  trailing_comma_inline_array = true
  
  [tool.uv]
  default-groups = "all"
  
  [tool.uv.pip]
  only-binary = ['matplotlib', 'numpy', 'scipy']
  