diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 17bdae2..7dcf281 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -208,6 +208,10 @@ jobs: fi done + - name: Run pyrefly + run: | + poetry run pyrefly check --output-format min-text + gitleaks: name: Gitleaks check runs-on: ubuntu-latest diff --git a/deepnote_toolkit/sql/sql_execution.py b/deepnote_toolkit/sql/sql_execution.py index 07b61fe..bff0e17 100644 --- a/deepnote_toolkit/sql/sql_execution.py +++ b/deepnote_toolkit/sql/sql_execution.py @@ -41,6 +41,9 @@ if TYPE_CHECKING: try: + # pyrefly (unlike mypy) ignores the except-ImportError fallback; + # these are missing on SQLAlchemy 1.x (3.10/3.11) + # pyrefly: ignore[missing-module-attribute] from sqlalchemy.engine.interfaces import DBAPIConnection, DBAPICursor except ImportError: # Not available in SQLAlchemy < 2.0. We use them only for typing, so replace with Any diff --git a/poetry.lock b/poetry.lock index 7486d43..c1cfcd5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5248,6 +5248,26 @@ files = [ [package.dependencies] certifi = "*" +[[package]] +name = "pyrefly" +version = "1.0.0" +description = "A fast type checker and language server for Python with powerful IDE features" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pyrefly-1.0.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e355a0908555348ed4b9585ef25c76ff566673e345c866c325f1633f44d890b6"}, + {file = "pyrefly-1.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a7038efc3a40f8294edee339895633cf22db268c0d434cdbcbefc34f78a9ecc3"}, + {file = "pyrefly-1.0.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da331ca515ed1c08791da2b5f664cf9c1294c48fd802133262e7d5d51e0f4416"}, + {file = "pyrefly-1.0.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c74219d8f3e63cdaa5501a0b21d1c9d37011820f9606728d0ed06f09ae86a878"}, + {file = "pyrefly-1.0.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0d05543b1bb6ee6d64149eb5d6b2fb15aa72d3962d6a97abca0afaca8b0c131"}, + {file = "pyrefly-1.0.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1382d5b1fcdb49a4de9f34d112d2bddf290a78ff93ee8149492ad5f1077ddffc"}, + {file = "pyrefly-1.0.0-py3-none-win32.whl", hash = "sha256:aa8b5d0e47080e3202a2547b39f7a5a61d2c781c712b3b67884f745ca2c759d2"}, + {file = "pyrefly-1.0.0-py3-none-win_amd64.whl", hash = "sha256:c8abcb0f2082e83c890375128f9cff4aa4d3f210b85eea7b3046c1ae764e77f5"}, + {file = "pyrefly-1.0.0-py3-none-win_arm64.whl", hash = "sha256:d150fa9e40e8392832be81c3bcfc0497c146674ce4d0f8e04e1ec29e775ffb8c"}, + {file = "pyrefly-1.0.0.tar.gz", hash = "sha256:5c2b810ffcebd84be71de5df1223651edee951653a66935c6f091e957c452455"}, +] + [[package]] name = "pyspark" version = "3.5.5" diff --git a/pyproject.toml b/pyproject.toml index f78d3ea..d78dd1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -202,6 +202,7 @@ dev = [ "pytest-cov>=6.0.0,<7.0.0", "coverage[toml]>=7.10.0,<8.0.0", "mypy>=1.13.0,<2.0.0", + "pyrefly>=1.0.0,<2.0.0", "pre-commit>=3.6.0,<4.0.0", "responses>=0.25.7,<0.26.0", "parameterized>=0.9.0,<0.10.0", @@ -312,6 +313,46 @@ exclude = [ "(^|[\\/])deepnote_core[\\/]resources[\\/]" ] +[tool.pyrefly] +# Match the CI mypy scope, which only checks `deepnote_toolkit/`. +project-includes = ["deepnote_toolkit"] +# Equivalent of mypy's `exclude` above (pyrefly uses path globs, not regexes). +project-excludes = [ + "**/tests/", + "**/.nox/", + "**/.pytest_cache/", + "**/__pycache__/", + "**/deepnote_core/resources/", +] +# The "legacy" preset emulates mypy-style gradual typing (only high-confidence +# errors, untyped code is checked leniently). Chosen automatically by +# `pyrefly init` for mypy migrations. Tighten to "default"/"strict" over time. +preset = "legacy" +# Untyped third-party libs (no py.typed). mypy treats these as `Any`; this makes +# pyrefly do the same instead of resolving them to `Unknown` and cascading +# errors (e.g. subclassing `wrapt.ObjectProxy`). Matches mypy's effective scope. +replace-imports-with-any = ["wrapt", "wrapt.*"] +# Pyrefly is stricter than this (heavily suppressed) mypy config and surfaces +# ~25 pre-existing latent issues mypy hides. They are recorded in a baseline so +# CI only fails on NEW regressions, not the existing backlog. Regenerate after +# fixing issues: `pyrefly check --update-baseline`. +baseline = "pyrefly-baseline.json" + +# Pyrefly equivalents of mypy's `disable_error_code` (above). Mapping produced +# by `pyrefly init`; mypy codes with no pyrefly equivalent (var-annotated, +# misc, no-any-return, unreachable) simply have no entry here. +[tool.pyrefly.errors] +untyped-import = "ignore" # mypy: import-untyped +invalid-annotation = "ignore" # mypy: valid-type +missing-attribute = "ignore" # mypy: union-attr, attr-defined +bad-argument-count = "ignore" # mypy: call-arg +no-matching-overload = "ignore" # mypy: call-overload +bad-assignment = "ignore" # mypy: assignment +bad-argument-type = "ignore" # mypy: arg-type +bad-return = "ignore" # mypy: return-value +unsupported-operation = "ignore" # mypy: operator, index +bad-index = "ignore" # mypy: index + [tool.coverage.run] branch = true source = ["deepnote_toolkit", "installer", "deepnote_core"] diff --git a/pyrefly-baseline.json b/pyrefly-baseline.json new file mode 100644 index 0000000..4673586 --- /dev/null +++ b/pyrefly-baseline.json @@ -0,0 +1,304 @@ +{ + "errors": [ + { + "line": 46, + "column": 10, + "stop_line": 46, + "stop_column": 16, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 51, + "column": 9, + "stop_line": 51, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementH1._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementH1._repr_html_` has type `(self: DeepnoteElementH1) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementH1) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementH1._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 56, + "column": 10, + "stop_line": 56, + "stop_column": 16, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 61, + "column": 9, + "stop_line": 61, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementH2._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementH2._repr_html_` has type `(self: DeepnoteElementH2) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementH2) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementH2._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 66, + "column": 10, + "stop_line": 66, + "stop_column": 16, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 71, + "column": 9, + "stop_line": 71, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementH3._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementH3._repr_html_` has type `(self: DeepnoteElementH3) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementH3) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementH3._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 76, + "column": 10, + "stop_line": 76, + "stop_column": 16, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 81, + "column": 9, + "stop_line": 81, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementCode._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementCode._repr_html_` has type `(self: DeepnoteElementCode) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementCode) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementCode._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 86, + "column": 10, + "stop_line": 86, + "stop_column": 16, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 91, + "column": 9, + "stop_line": 91, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementText._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementText._repr_html_` has type `(self: DeepnoteElementText) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementText) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementText._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 99, + "column": 9, + "stop_line": 99, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementDivider._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementDivider._repr_html_` has type `(self: DeepnoteElementDivider) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementDivider) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementDivider._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 104, + "column": 10, + "stop_line": 104, + "stop_column": 16, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 109, + "column": 9, + "stop_line": 109, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementHtml._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementHtml._repr_html_` has type `(self: DeepnoteElementHtml) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementHtml) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementHtml._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 114, + "column": 13, + "stop_line": 114, + "stop_column": 19, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 115, + "column": 20, + "stop_line": 115, + "stop_column": 26, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "not-a-type", + "description": "Expected a type form, got instance of `Module[string]`", + "concise_description": "Expected a type form, got instance of `Module[string]`", + "severity": "error" + }, + { + "line": 121, + "column": 9, + "stop_line": 121, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementJavascript._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementJavascript._repr_html_` has type `(self: DeepnoteElementJavascript) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementJavascript) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementJavascript._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 151, + "column": 9, + "stop_line": 151, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementRows._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementRows._repr_html_` has type `(self: DeepnoteElementRows) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementRows) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementRows._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 169, + "column": 9, + "stop_line": 169, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementColumns._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementColumns._repr_html_` has type `(self: DeepnoteElementColumns) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementColumns) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementColumns._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 188, + "column": 9, + "stop_line": 188, + "stop_column": 20, + "path": "deepnote_toolkit/experimental_components.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteElementTabs._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner\n `DeepnoteElementTabs._repr_html_` has type `(self: DeepnoteElementTabs) -> Unknown`, which is not assignable to `() -> Unknown`, the type of `DeepnoteBaseElement._repr_html_`\n Signature mismatch:\n expected: def _repr_html_() -> Unknown: ...\n ^ parameters\n found: def _repr_html_(self: DeepnoteElementTabs) -> Unknown: ...\n ^^^^^^^^^^^^^^^^^^^^^^^^^ parameters", + "concise_description": "Class member `DeepnoteElementTabs._repr_html_` overrides parent class `DeepnoteBaseElement` in an inconsistent manner", + "severity": "error" + }, + { + "line": 27, + "column": 27, + "stop_line": 27, + "stop_column": 31, + "path": "deepnote_toolkit/logging.py", + "code": -2, + "name": "bad-function-definition", + "description": "Default `None` is not assignable to parameter `extra_context` with type `dict[Unknown, Unknown]`", + "concise_description": "Default `None` is not assignable to parameter `extra_context` with type `dict[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 50, + "column": 27, + "stop_line": 50, + "stop_column": 40, + "path": "deepnote_toolkit/logging.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "`dict[Unknown, Unknown]` is not assignable to TypedDict key `context` with type `str`", + "concise_description": "`dict[Unknown, Unknown]` is not assignable to TypedDict key `context` with type `str`", + "severity": "error" + }, + { + "line": 322, + "column": 39, + "stop_line": 322, + "stop_column": 72, + "path": "deepnote_toolkit/notebook_functions.py", + "code": -2, + "name": "not-iterable", + "description": "Type `None` is not iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "line": 393, + "column": 28, + "stop_line": 393, + "stop_column": 54, + "path": "deepnote_toolkit/notebook_functions.py", + "code": -2, + "name": "not-iterable", + "description": "Type `None` is not iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "line": 43, + "column": 9, + "stop_line": 43, + "stop_column": 20, + "path": "deepnote_toolkit/sql/query_preview.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeepnoteQueryPreview.__setitem__` overrides parent class `DataFrame` in an inconsistent manner\n `DeepnoteQueryPreview.__setitem__` has type `(self: DeepnoteQueryPreview, key: Unknown, value: Unknown) -> Unknown`, which is not assignable to `Overload[\n (self: DeepnoteQueryPreview, idx: Index | Series[int] | int | list[int] | ndarray[tuple[Any, ...], dtype[integer]] | slice[Any, Any, Any] | tuple[IndexType, IndexType] | tuple[IndexType, int] | tuple[int, IndexType] | tuple[int, int], value: DataFrame | IndexOpsMixin | Mapping[Hashable, NAType | NaTType | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | str | timedelta | timedelta64] | NAType | NaTType | Sequence[Scalar] | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | ndarray | str | timedelta | timedelta64 | None) -> None\n [ScalarT: Scalar](self: DeepnoteQueryPreview, idx: Series[builtins.bool] | int | integer | list[builtins.bool] | list[ScalarT] | ndarray[tuple[Any, ...], dtype[numpy.bool]] | signedinteger[_NBitIntP] | signedinteger[_8Bit] | signedinteger | slice[Any, Any, Any] | str | str_ | unsignedinteger | tuple[IndexOpsMixin | Sequence[Scalar] | Series[builtins.bool] | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | list[builtins.bool] | ndarray[tuple[Any, ...], dtype[numpy.bool]] | slice[Any, Any, Any] | str | timedelta | timedelta64, ...], value: DataFrame | ExtensionArray | IndexOpsMixin | Mapping[Hashable, NAType | NaTType | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | str | timedelta | timedelta64] | NAType | NaTType | Sequence[Scalar] | Sequence[Sequence[Scalar]] | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | ndarray | str | timedelta | timedelta64 | None) -> None\n (self: DeepnoteQueryPreview, idx: tuple[tuple[IndexOpsMixin | Sequence[Scalar] | Series[builtins.bool] | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | list[builtins.bool] | ndarray[tuple[Any, ...], dtype[numpy.bool]] | slice[Any, Any, Any] | str | timedelta | timedelta64, ...], Hashable], value: ExtensionArray | IndexOpsMixin | Mapping[Hashable, NAType | NaTType | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | str | timedelta | timedelta64] | NAType | NaTType | Sequence[Scalar] | Sequence[Sequence[Scalar]] | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | ndarray | str | timedelta | timedelta64 | None) -> None\n (self: DeepnoteQueryPreview, idx: DataFrame | IndexOpsMixin, value: ExtensionArray | IndexOpsMixin | Mapping[Hashable, NAType | NaTType | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | str | timedelta | timedelta64] | NAType | NaTType | Sequence[Scalar] | Sequence[Sequence[Scalar]] | Timedelta | Timestamp | builtins.bool | bytes | complex | complexfloating | date | datetime | datetime64 | float | floating | int | integer | ndarray | str | timedelta | timedelta64 | None) -> None\n]`, the type of `DataFrame.__setitem__`", + "concise_description": "Class member `DeepnoteQueryPreview.__setitem__` overrides parent class `DataFrame` in an inconsistent manner", + "severity": "error" + }, + { + "line": 47, + "column": 9, + "stop_line": 47, + "stop_column": 20, + "path": "deepnote_toolkit/sql/query_preview.py", + "code": -2, + "name": "bad-override", + "description": "`__setattr__` is declared as final in parent class `DataFrame`", + "concise_description": "`__setattr__` is declared as final in parent class `DataFrame`", + "severity": "error" + } + ] +} \ No newline at end of file