content: [project]
  name = 'slipstream-async'
  dynamic = ['version']
  description = 'Streamline your stream processing.'
  authors = [{ name = 'Menziess', email = 'stefan_schenk@hotmail.com' }]
  readme = 'README.md'
  license = { text = 'MIT' }
  keywords = ['python', 'streaming', 'kafka', 'stream-processing', 'data-engineering', 'dataflow', 'data-processing', 'streaming-data', 'slipstream', 'stateful-streaming']
  classifiers = [
      'Intended Audience :: Developers',
      'Intended Audience :: Science/Research',
      'Programming Language :: Python :: 3.10',
      'Programming Language :: Python :: 3.11',
      'Programming Language :: Python :: 3.12',
      'License :: OSI Approved :: MIT License',
      'Topic :: Scientific/Engineering',
      'Topic :: Scientific/Engineering :: Artificial Intelligence',
  ]
  requires-python = '>=3.10'
  dependencies = []
  
  [project.optional-dependencies]
  kafka = [
    'aiokafka',
  ]
  cache = [
    'rocksdict',
  ]
  dev = [
    'pre-commit',
    'pyright',
    'ruff',
  ]
  test = [
    'pytest',
    'pytest-cov',
    'pytest-mock',
    'pytest-asyncio',
    'testcontainers[kafka]',
  ]
  docs = [
    'sphinx',
    'furo',
    'sphinx-autoapi',
    'sphinx-autobuild',
  ]
  
  [project.urls]
  repository = 'https://github.com/Menziess/slipstream'
  documentation = 'https://slipstream.readthedocs.io'
  
  [tool.setuptools.dynamic]
  version = {attr = 'slipstream.__version__.VERSION'}
  
  [tool.setuptools.packages.find]
  where = ['.']
  include = ['slipstream*']
  
  [build-system]
  requires = ['setuptools']
  build-backend = 'setuptools.build_meta'
  
  [tool.pyright]
  venvPath = '.'
  venv = '.venv'
  include = [
    'slipstream/**/*.py',
    'tests/**/*.py'
  ]
  
  [tool.ruff]
  line-length = 79
  
  [tool.ruff.lint]
  ignore = [
    'ANN401',  # allow Any type
    'COM812',  # may conflict with formatter
  ]
  select = [
    'E',       # pycodestyle
    'F',       # pyflakes
    'W',       # pycodestyle
    'C90',     # mccabe
    'I',       # isort
    'D',       # pydocstyle
    'D401',    # pydocstyle
    'UP',      # pyupgrade
    'N',       # pep8-naming
    'ANN',     # flake8-annotations
    'ASYNC',   # flake8-async
    'S',       # flake8-bandit
    'BLE',     # flake8-blind-except
    'B',       # flake8-bugbear
    'A',       # flake8-builtins
    'COM',     # flake8-commas
    'C4',      # flake8-comprehensions
    'DTZ',     # flake8-datetimez
    'T10',     # flake8-debugger
    'EM',      # flake8-errmsg
    'ISC',     # flake8-implicit-str-concat
    'ICN',     # flake8-import-conventions
    'PIE',     # flake8-pie
    'T20',     # flake8-print
    'PT',      # flake8-pytest-style
    'Q',       # flake8-quotes
    'RSE',     # flake8-raise
    'RET',     # flake8-return
    'SLF',     # flake8-self
    'SLOT',    # flake8-slots
    'SIM',     # flake8-simplify
    'TID',     # flake8-tidy-imports
    'TCH',     # flake8-type-checking
    'INT',     # flake8-type-checking
    'ARG',     # flake8-unused-arguments
    'PTH',     # flake8-use-pathlib
    'FIX',     # flake8-fixme
    'PGH',     # pygrep-hooks
    'TRY',     # tryceratops
    'FLY',     # flynt
    'PERF',    # Perflint
    'FURB',    # refurb
    'RUF',     # Ruff-specific rules
  ]
  
  [tool.ruff.lint.per-file-ignores]
  'tests/*.py' = [
    'PLR2004', # magic value comparison
    'S101',    # use of assert detected
    'TCH002',  # third party import (for pytest)
    'ANN',     # missing type annotation
    'SLF',     # private member access
  ]
  
  [tool.ruff.format]
  quote-style = 'single'
  docstring-code-format = true
  
  [tool.ruff.lint.pydocstyle]
  convention = 'google'
  
  [tool.ruff.lint.flake8-quotes]
  inline-quotes = 'single'
  docstring-quotes = 'double'
  
  [tool.pytest.ini_options]
  addopts = '--doctest-modules'
  doctest_optionflags = 'ELLIPSIS'
  testpaths = [
    'slipstream',
    'tests',
  ]
  markers = [
    'serial'
  ]
  asyncio_default_fixture_loop_scope = 'function'
  
  [tool.coverage.report]
  exclude_lines = [
    '@(abc\.)?abstractmethod',
    'pragma: no cover',
  ]
  