Skip to content

Commit 5b5f9b5

Browse files
committed
add errors module
1 parent 9615486 commit 5b5f9b5

File tree

3 files changed

+140
-2
lines changed

3 files changed

+140
-2
lines changed

poetry.lock

Lines changed: 12 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ pre-commit = "^4.0.1"
1515
ruff = "^0.6.9"
1616
mypy = "^1.11.2"
1717
poethepoet = "^0.29.0"
18+
types-protobuf = "^5.28.0.20240924"
1819

1920
[build-system]
2021
requires = ["poetry-core"]
2122
build-backend = "poetry.core.masonry.api"
2223

2324
[tool.poe.tasks]
24-
mypy = "mypy"
25+
mypy = "mypy ydb_dbapi"
2526
ruff-fix = "ruff check --fix"
2627
ruff = "ruff check"
2728
lint = ["mypy", "ruff"]
@@ -33,3 +34,14 @@ exclude = [".venv", ".git", "__pycache__", "build", "dist", "venv"]
3334
line-length = 79
3435
target-version = "py39"
3536
src = ["ydb_dbapi", "tests"]
37+
38+
[tool.ruff.lint]
39+
select = ["F", "E"]
40+
41+
[[tool.mypy.overrides]]
42+
module = "ydb.*"
43+
ignore_missing_imports = true
44+
45+
[[tool.mypy.overrides]]
46+
module = "ydb_dbapi.errors"
47+
ignore_errors = true

ydb_dbapi/errors.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
from typing import List, Optional
2+
3+
import ydb
4+
from google.protobuf.message import Message
5+
6+
7+
class Warning(Exception):
8+
pass
9+
10+
11+
class Error(Exception):
12+
def __init__(
13+
self,
14+
message: str,
15+
original_error: Optional[ydb.Error] = None,
16+
):
17+
super(Error, self).__init__(message)
18+
19+
self.original_error = original_error
20+
if original_error:
21+
pretty_issues = _pretty_issues(original_error.issues)
22+
self.issues = original_error.issues
23+
self.message = pretty_issues or message
24+
self.status = original_error.status
25+
26+
27+
class InterfaceError(Error):
28+
pass
29+
30+
31+
class DatabaseError(Error):
32+
pass
33+
34+
35+
class DataError(DatabaseError):
36+
pass
37+
38+
39+
class OperationalError(DatabaseError):
40+
pass
41+
42+
43+
class IntegrityError(DatabaseError):
44+
pass
45+
46+
47+
class InternalError(DatabaseError):
48+
pass
49+
50+
51+
class ProgrammingError(DatabaseError):
52+
pass
53+
54+
55+
class NotSupportedError(DatabaseError):
56+
pass
57+
58+
59+
def _pretty_issues(issues: List[Message]) -> Optional[str]:
60+
if issues is None:
61+
return None
62+
63+
children_messages = [_get_messages(issue, root=True) for issue in issues]
64+
65+
if None in children_messages:
66+
return None
67+
68+
return "\n" + "\n".join(children_messages)
69+
70+
71+
def _get_messages(
72+
issue: Message,
73+
max_depth: int = 100,
74+
indent: int = 2,
75+
depth: int = 0,
76+
root: bool = False,
77+
) -> Optional[str]:
78+
if depth >= max_depth:
79+
return None
80+
81+
margin_str = " " * depth * indent
82+
pre_message = ""
83+
children = ""
84+
85+
if issue.issues:
86+
collapsed_messages = []
87+
while not root and len(issue.issues) == 1:
88+
collapsed_messages.append(issue.message)
89+
issue = issue.issues[0]
90+
91+
if collapsed_messages:
92+
pre_message = f"{margin_str}{', '.join(collapsed_messages)}\n"
93+
depth += 1
94+
margin_str = " " * depth * indent
95+
96+
children_messages = [
97+
_get_messages(
98+
iss,
99+
max_depth=max_depth,
100+
indent=indent,
101+
depth=depth + 1,
102+
)
103+
for iss in issue.issues
104+
]
105+
106+
if None in children_messages:
107+
return None
108+
109+
children = "\n".join(children_messages)
110+
111+
return (
112+
f"{pre_message}{margin_str}{issue.message}\n{margin_str}"
113+
f"severity level: {issue.severity}\n{margin_str}"
114+
f"issue code: {issue.issue_code}\n{children}"
115+
)

0 commit comments

Comments
 (0)