bachya/aioambient

View on GitHub
pyproject.toml

Summary

Maintainability
Test Coverage
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.black]
target-version = ["py39"]

[tool.coverage.report]
exclude_lines = ["raise NotImplementedError", "TYPE_CHECKING", "@overload"]
fail_under = 100
show_missing = true

[tool.coverage.run]
source = ["aioambient"]

[tool.isort]
known_first_party = "aioambient,examples,tests"
multi_line_output = 3
profile = "black"

[tool.mypy]
check_untyped_defs = true
disallow_incomplete_defs = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_decorators = true
disallow_untyped_defs = true
follow_imports = "silent"
ignore_missing_imports = true
no_implicit_optional = true
platform = "linux"
python_version = "3.10"
show_error_codes = true
strict_equality = true
warn_incomplete_stub = true
warn_redundant_casts = true
warn_return_any = true
warn_unreachable = true
warn_unused_configs = true
warn_unused_ignores = true

[tool.poetry]
name = "aioambient"
version = "2024.01.0"
description = "A clean, async-friendly library for the Ambient Weather API"
readme = "README.md"
authors = ["Aaron Bach <bachya1208@gmail.com>"]
license = "MIT"
repository = "https://github.com/bachya/aioambient"
classifiers = [
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
]

[tool.poetry.dependencies]
aiohttp = ">=3.9.0b0"
certifi = ">=2023.07.22"
python = "^3.10"
python-engineio = ">=3.13.1,<5.0.0"
python-socketio = ">=4.6,<6.0"
websockets = ">=11.0.1"
yarl = ">=1.9.2"

[tool.poetry.group.dev.dependencies]
GitPython = ">=3.1.35"
Pygments = ">=2.15.0"
aresponses = ">=2.1.6,<4.0.0"
asynctest = "^0.13.0"
blacken-docs = "^1.12.1"
codespell = "^2.2.2"
coverage = {version = ">=6.5,<8.0", extras = ["toml"]}
darglint = "^1.8.1"
isort = "^5.10.1"
mypy = "^1.2.0"
pre-commit = ">=2.20,<4.0"
pre-commit-hooks = "^4.3.0"
pylint = ">=2.15.5,<4.0.0"
pytest = ">=7.2,<9.0"
pytest-aiohttp = "^1.0.0"
pytest-asyncio = ">=0.20.1,<0.24.0"
pytest-cov = ">=4,<6"
pyupgrade = "^3.1.0"
pyyaml = "^6.0.1"
ruff = ">=0.0.261,<0.4.7"
typing-extensions = "^4.8.0"
yamllint = "^1.28.0"

[tool.poetry.urls]
"Bug Tracker" = "https://github.com/bachya/aioambient/issues"
Changelog = "https://github.com/bachya/aioambient/releases"

[tool.pylint.BASIC]
class-const-naming-style = "any"
expected-line-ending-format = "LF"

[tool.pylint.DESIGN]
max-attributes = 20

[tool.pylint.FORMAT]
max-line-length = 88

[tool.pylint.MAIN]
py-version = "3.12"
ignore = [
    "tests",
]
# Use a conservative default here; 2 should speed up most setups and not hurt
# any too bad. Override on command line as appropriate.
jobs = 2
init-hook = """\
    from pathlib import Path; \
    import sys; \

    from pylint.config import find_default_config_files; \

    sys.path.append( \
        str(Path(next(find_default_config_files())).parent.joinpath('pylint/plugins'))
    ) \
    """
load-plugins = [
    "pylint.extensions.code_style",
    "pylint.extensions.typing",
]
persistent = false
fail-on = [
    "I",
]

[tool.pylint."MESSAGES CONTROL"]
disable = [
    # These are subjective and should be left up to the developer:
    "too-many-arguments",
    "too-many-lines",
    "too-many-locals",
    "duplicate-code",

    # Handled by ruff:
    # Ref: <https://github.com/astral-sh/ruff/issues/970>
    "anomalous-backslash-in-string",        # W605
    "assert-on-string-literal",             # PLW0129
    "assert-on-tuple",                      # F631
    "await-outside-async",                  # PLE1142
    "bad-classmethod-argument",             # N804
    "bad-format-string",                    # W1302, F
    "bad-format-string-key",                # W1300, F
    "bad-str-strip-call",                   # PLE1310
    "bad-string-format-type",               # PLE1307
    "bare-except",                          # E722
    "bidirectional-unicode",                # PLE2502
    "binary-op-exception",                  # PLW0711
    "broad-exception-caught",               # W0718
    "cell-var-from-loop",                   # B023
    "comparison-of-constants",              # PLR0133
    "comparison-with-itself",               # PLR0124
    "consider-alternative-union-syntax",    # UP007
    "consider-iterating-dictionary",        # SIM118
    "consider-merging-isinstance",          # PLR1701
    "consider-using-alias",                 # UP006
    "consider-using-dict-comprehension",    # C402
    "consider-using-generator",             # C417
    "consider-using-get",                   # SIM401
    "consider-using-set-comprehension",     # C401
    "consider-using-sys-exit",              # PLR1722
    "consider-using-ternary",               # SIM108
    "continue-in-finally",                  # PLE0116
    "duplicate-bases",                      # PLE0241
    "duplicate-except",                     # B014
    "duplicate-key",                        # F601
    "duplicate-string-formatting-argument", # F
    "duplicate-value",                      # F
    "empty-docstring",                      # D419
    "eval-used",                            # S307
    "exec-used",                            # S102
    "expression-not-assigned",              # B018
    "f-string-without-interpolation",       # F541
    "forgotten-debug-statement",            # T100
    "format-needs-mapping",                 # F502
    "format-string-without-interpolation",  # F
    "function-redefined",                   # F811
    "global-variable-not-assigned",         # PLW0602
    "implicit-str-concat",                  # ISC001
    "import-self",                          # PLW0406
    "inconsistent-quotes",                  # Q000
    "invalid-all-object",                   # PLE0604
    "invalid-character-backspace",          # PLE2510
    "invalid-character-esc",                # PLE2513
    "invalid-character-nul",                # PLE2514
    "invalid-character-sub",                # PLE2512
    "invalid-character-zero-width-space",   # PLE2515
    "invalid-envvar-default",               # PLW1508
    "invalid-name",                         # N815
    "keyword-arg-before-vararg",            # B026
    "line-too-long",                        # E501
    "literal-comparison",                   # F632
    "logging-format-interpolation",         # G
    "logging-fstring-interpolation",        # G
    "logging-not-lazy",                     # G
    "logging-too-few-args",                 # PLE1206
    "logging-too-many-args",                # PLE1205
    "misplaced-future",                     # F404
    "missing-class-docstring",              # D101
    "missing-final-newline",                # W292
    "missing-format-string-key",            # F524
    "missing-function-docstring",           # D103
    "missing-module-docstring",             # D100
    "mixed-format-string",                  # F506
    "multiple-imports",                     #E401
    "named-expr-without-context",           # PLW0131
    "nested-min-max",                       # PLW3301
    "no-method-argument",                   # N805
    "no-self-argument",                     # N805
    "nonexistent-operator",                 # B002
    "nonlocal-without-binding",             # PLE0117
    "not-in-loop",                          # F701, F702
    "notimplemented-raised",                # F901
    "pointless-statement",                  # B018
    "property-with-parameters",             # PLR0206
    "raise-missing-from",                   # B904
    "return-in-init",                       # PLE0101
    "return-outside-function",              # F706
    "singleton-comparison",                 # E711, E712
    "subprocess-run-check",                 # PLW1510
    "super-with-arguments",                 # UP008
    "superfluous-parens",                   # UP034
    "syntax-error",                         # E999
    "too-few-format-args",                  # F524
    "too-many-branches",                    # PLR0912
    "too-many-format-args",                 # F522
    "too-many-return-statements",           # PLR0911
    "too-many-star-expressions",            # F622
    "too-many-statements",                  # PLR0915
    "trailing-comma-tuple",                 # COM818
    "truncated-format-string",              # F501
    "try-except-raise",                     # TRY302
    "undefined-all-variable",               # F822
    "undefined-variable",                   # F821
    "ungrouped-imports",                    # I001
    "unidiomatic-typecheck",                # E721
    "unnecessary-comprehension",            # C416
    "unnecessary-direct-lambda-call",       # PLC3002
    "unnecessary-lambda-assignment",        # PLC3001
    "unnecessary-pass",                     # PIE790
    "unneeded-not",                         # SIM208
    "unused-argument",                      # ARG001
    "unused-format-string-argument",        # F507
    "unused-format-string-key",             # F504
    "unused-import",                        # F401
    "unused-variable",                      # F841
    "use-a-generator",                      # C417
    "use-dict-literal",                     # C406
    "use-list-literal",                     # C405
    "used-prior-global-declaration",        # PLE0118
    "useless-else-on-loop",                 # PLW0120
    "useless-import-alias",                 # PLC0414
    "useless-object-inheritance",           # UP004
    "useless-return",                       # PLR1711
    "wildcard-import",                      # F403
    "wrong-import-order",                   # I001
    "wrong-import-position",                # E402
    "yield-inside-async-function",          # PLE1700
    "yield-outside-function",               # F704

    # Handled by mypy:
    # Ref: <https://github.com/antonagestam/pylint-mypy-overlap>
    "abstract-class-instantiated",
    "arguments-differ",
    "assigning-non-slot",
    "assignment-from-no-return",
    "assignment-from-none",
    "bad-exception-cause",
    "bad-format-character",
    "bad-reversed-sequence",
    "bad-super-call",
    "bad-thread-instantiation",
    "catching-non-exception",
    "comparison-with-callable",
    "deprecated-class",
    "dict-iter-missing-items",
    "format-combined-specification",
    "global-variable-undefined",
    "import-error",
    "inconsistent-mro",
    "inherit-non-class",
    "init-is-generator",
    "invalid-class-object",
    "invalid-enum-extension",
    "invalid-envvar-value",
    "invalid-format-returned",
    "invalid-hash-returned",
    "invalid-metaclass",
    "invalid-overridden-method",
    "invalid-repr-returned",
    "invalid-sequence-index",
    "invalid-slice-index",
    "invalid-slots",
    "invalid-slots-object",
    "invalid-star-assignment-target",
    "invalid-str-returned",
    "invalid-unary-operand-type",
    "invalid-unicode-codec",
    "isinstance-second-argument-not-valid-type",
    "method-hidden",
    "misplaced-format-function",
    "missing-format-argument-key",
    "missing-format-attribute",
    "missing-kwoa",
    "no-member",
    "no-value-for-parameter",
    "non-iterator-returned",
    "non-str-assignment-to-dunder-name",
    "nonlocal-and-global",
    "not-a-mapping",
    "not-an-iterable",
    "not-async-context-manager",
    "not-callable",
    "not-context-manager",
    "overridden-final-method",
    "raising-bad-type",
    "raising-non-exception",
    "redundant-keyword-arg",
    "relative-beyond-top-level",
    "self-cls-assignment",
    "signature-differs",
    "star-needs-assignment-target",
    "subclassed-final-class",
    "super-without-brackets",
    "too-many-function-args",
    "typevar-double-variance",
    "typevar-name-mismatch",
    "unbalanced-dict-unpacking",
    "unbalanced-tuple-unpacking",
    "unexpected-keyword-arg",
    "unhashable-member",
    "unpacking-non-sequence",
    "unsubscriptable-object",
    "unsupported-assignment-operation",
    "unsupported-binary-operation",
    "unsupported-delete-operation",
    "unsupported-membership-test",
    "used-before-assignment",
    "using-final-decorator-in-unsupported-version",
    "wrong-exception-operation",
]
enable = [
    "useless-suppression",
    "use-symbolic-message-instead",
]

[tool.pylint.TYPING]
runtime-typing = false

[tool.pylint.CODE_STYLE]
max-line-length-suggestions = 72

[tool.ruff.lint]
select = [
    "ALL"
]

ignore = [
    "ANN101",  # Missing type annotation for self
    "D202",    # No blank lines allowed after function docstring
    "D203",    # 1 blank line required before class docstring
    "PLR0913", # This is subjective
    "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target
    "PT012",   # `pytest.raises()` block should contain a single simple statement
    "TCH",     # flake8-type-checking

    # May conflict with the formatter:
    # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
    "COM812",
    "COM819",
    "D206",
    "D300",
    "E111",
    "E114",
    "E117",
    "ISC001",
    "ISC002",
    "Q000",
    "Q001",
    "Q002",
    "Q003",
    "W191",
]

[tool.ruff.lint.isort]
force-sort-within-sections = true
known-first-party = [
    "aioambient",
    "examples",
    "tests",
]
combine-as-imports = true
split-on-trailing-comma = false

[tool.ruff.lint.per-file-ignores]
"aioambient/util/climate_utils.py" = [
    "PLR2004",  # Climate utils utilize a ton of inline constants
]
"tests/*" = [
    "ARG001",   # Tests ofen have unused arguments
    "FBT001",   # Test fixtures may be boolean values
    "PLR2004",  # Checking for magic values in tests isn't helpful
    "S101",     # Assertions are fine in tests
    "SLF001",   # We'll access a lot of private third-party members in tests
]