frequenz-resampling 0.3.0

A library for resampling a stream of samples to a given interval.
Documentation
[build-system]
requires = ["maturin>=1.7,<2.0"]
build-backend = "maturin"

[project]
name = "frequenz-resampling"
description = "Resampling a stream of samples to a given interval."
readme = "README.md"
license = { text = "MIT" }
keywords = ["frequenz", "python", "rust"]
classifiers = [
  "Programming Language :: Rust",
  "Programming Language :: Python :: Implementation :: CPython",
  "Programming Language :: Python :: Implementation :: PyPy",
]
requires-python = ">= 3.11, < 4"
dynamic = ["version"]

[[project.authors]]
name = "Frequenz Energy-as-a-Service GmbH"
email = "floss@frequenz.com"

[tool.maturin]
features = ["python"]
module-name = "frequenz.resampling._rust_backend"
profile = "release"
bindings = "pyo3"


[project.optional-dependencies]
dev-flake8 = [
  "flake8 == 7.3.0",
  "flake8-docstrings == 1.7.0",
  "flake8-pyproject == 1.2.3", # For reading the flake8 config from pyproject.toml
  "pydoclint == 0.7.6",
  "pydocstyle == 6.3.0",
]
dev-formatting = ["black == 25.9.0", "isort == 7.0.0"]
dev-mkdocs = [
  "black == 25.9.0",
  "Markdown==3.9",
  "mike == 2.1.3",
  "mkdocs-gen-files == 0.5.0",
  "mkdocs-literate-nav == 0.6.2",
  "mkdocs-macros-plugin == 1.4.0",
  "mkdocs-material == 9.6.21",
  "mkdocstrings[python] == 0.30.1",
  "mkdocstrings-python == 1.18.2",
  "frequenz-repo-config[lib] == 0.13.5",
]
dev-mypy = [
  "mypy == 1.18.2",
  "types-Markdown == 3.9.0.20250906",
  "types-setuptools == 80.9.0.20250822",
  "frequenz-resampling[dev-mkdocs,dev-noxfile,dev-pytest]",
]
dev-noxfile = ["nox == 2025.10.16", "frequenz-repo-config[lib] == 0.13.5"]
dev-pylint = [
  "pylint == 4.0.2",
  "frequenz-resampling[dev-mkdocs,dev-noxfile,dev-pytest]",
]
dev-pytest = [
  "pandas == 2.3.3",
  "pandas-stubs == 2.3.2.250926",
  "pytest == 8.4.2",
  "pytest-mock == 3.15.1",
  "pytest-asyncio == 1.2.0",
  "async-solipsism == 0.8",
  "hypothesis == 6.142.5",
]
dev-rust-build = ["maturin>=1.7,<2.0"]
dev = [
  "frequenz-resampling[dev-mkdocs,dev-flake8,dev-formatting,dev-mkdocs,dev-mypy,dev-noxfile,dev-pylint,dev-pytest,dev-rust-build]",
]

[tool.black]
line-length = 88
target-version = ['py311']
include = '\.pyi?$'

[tool.isort]
profile = "black"
line_length = 88
src_paths = ["benchmarks", "examples", "python", "tests"]

[tool.flake8]
# We give some flexibility to go over 88, there are cases like long URLs or
# code in documenation that have extra indentation. Black will still take care
# of making everything that can be 88 wide, 88 wide.
max-line-length = 100
extend-ignore = [
  "E203", # Whitespace before ':' (conflicts with black)
  "W503", # Line break before binary operator (conflicts with black)
]
# pydoclint options
style = "google"
check-return-types = false
check-yield-types = false
arg-type-hints-in-docstring = false
arg-type-hints-in-signature = true
allow-init-docstring = true
check-class-attributes = false

[tool.pylint.similarities]
ignore-comments = ['yes']
ignore-docstrings = ['yes']
ignore-imports = ['no']
min-similarity-lines = 40

[tool.pylint.messages_control]
disable = [
  "too-few-public-methods",
  "too-many-return-statements",
  # disabled because it conflicts with isort
  "wrong-import-order",
  "ungrouped-imports",
  # pylint's unsubscriptable check is buggy and is not needed because
  # it is a type-check, for which we already have mypy.
  "unsubscriptable-object",
  # Checked by mypy
  "no-member",
  # Checked by flake8
  "f-string-without-interpolation",
  "redefined-outer-name",
  "unused-import",
  "line-too-long",
  "missing-function-docstring",
  "redefined-outer-name",
  "unnecessary-lambda-assignment",
  "unused-import",
  "unused-variable",
]

[tool.pylint.design]
max-attributes = 12

[tool.pytest.ini_options]
addopts = "-W=all -Werror -Wdefault::DeprecationWarning -Wdefault::PendingDeprecationWarning -vv"
testpaths = ["tests"]
asyncio_mode = "auto"
required_plugins = ["pytest-asyncio", "pytest-mock"]
markers = [
  "integration: integration tests (deselect with '-m \"not integration\"')",
]

[tool.mypy]
explicit_package_bases = true
namespace_packages = true
# This option disables mypy cache, and it is sometimes useful to enable it if
# you are getting weird intermittent error, or error in the CI but not locally
# (or vice versa). In particular errors saying that type: ignore is not
# used but getting the original ignored error when removing the type: ignore.
# See for example: https://github.com/python/mypy/issues/2960
no_incremental = true
packages = ["frequenz.resampling"]
strict = true

[[tool.mypy.overrides]]
module = ["frequenz.resampling"]
ignore_missing_imports = true

[tool.setuptools_scm]
version_scheme = "post-release"