t-bug-catcher 0.6.5__tar.gz → 0.6.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/PKG-INFO +11 -2
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/setup.cfg +1 -1
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/setup.py +1 -1
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/__init__.py +1 -1
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/jira.py +25 -7
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/utils/common.py +17 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/PKG-INFO +11 -2
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/MANIFEST.in +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/README.rst +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/pyproject.toml +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/requirements.txt +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/bug_catcher.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/bug_snag.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/config.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/exceptions.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/resources/whispers_config.yml +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/stack_saver.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/utils/__init__.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/utils/logger.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/workitems.py +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/SOURCES.txt +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/dependency_links.txt +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/not-zip-safe +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/requires.txt +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/top_level.txt +0 -0
- {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/tests/test_t_bug_catcher.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: t_bug_catcher
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.7
|
|
4
4
|
Summary: Bug catcher
|
|
5
5
|
Home-page: https://www.thoughtful.ai/
|
|
6
6
|
Author: Thoughtful
|
|
@@ -14,6 +14,15 @@ Requires-Python: >=3.9
|
|
|
14
14
|
Requires-Dist: requests<3.0.0,>=2.31.0
|
|
15
15
|
Requires-Dist: bugsnag>=4.6.1
|
|
16
16
|
Requires-Dist: retry~=0.9.2
|
|
17
|
+
Dynamic: author
|
|
18
|
+
Dynamic: author-email
|
|
19
|
+
Dynamic: classifier
|
|
20
|
+
Dynamic: description
|
|
21
|
+
Dynamic: home-page
|
|
22
|
+
Dynamic: keywords
|
|
23
|
+
Dynamic: requires-dist
|
|
24
|
+
Dynamic: requires-python
|
|
25
|
+
Dynamic: summary
|
|
17
26
|
|
|
18
27
|
t-bug-catcher
|
|
19
28
|
==============
|
|
@@ -26,7 +26,7 @@ setup(
|
|
|
26
26
|
packages=find_packages(include=["t_bug_catcher", "t_bug_catcher.*"]),
|
|
27
27
|
test_suite="tests",
|
|
28
28
|
url="https://www.thoughtful.ai/",
|
|
29
|
-
version="0.6.
|
|
29
|
+
version="0.6.7",
|
|
30
30
|
zip_safe=False,
|
|
31
31
|
install_requires=install_requirements,
|
|
32
32
|
include_package_data=True,
|
|
@@ -22,7 +22,7 @@ from retry import retry
|
|
|
22
22
|
from .config import CONFIG
|
|
23
23
|
from .exceptions import BadRequestError
|
|
24
24
|
from .utils import logger
|
|
25
|
-
from .utils.common import Encoder, get_frames, remove_holotree_id, retrieve_build_info
|
|
25
|
+
from .utils.common import Encoder, clean_nested_data, get_frames, remove_holotree_id, retrieve_build_info
|
|
26
26
|
from .workitems import variables
|
|
27
27
|
|
|
28
28
|
|
|
@@ -856,8 +856,7 @@ class Jira:
|
|
|
856
856
|
exc_traceback_info: str = (
|
|
857
857
|
f"Traceback (most recent call last):\n{''.join(traceback.format_tb(exc_traceback)[-1])}{exc_info}"
|
|
858
858
|
)
|
|
859
|
-
|
|
860
|
-
return {
|
|
859
|
+
description = {
|
|
861
860
|
"version": 1,
|
|
862
861
|
"type": "doc",
|
|
863
862
|
"content": []
|
|
@@ -873,6 +872,7 @@ class Jira:
|
|
|
873
872
|
+ (self.__metadata_markup(metadata) if metadata else [])
|
|
874
873
|
+ self.__error_markup(error_id),
|
|
875
874
|
}
|
|
875
|
+
return clean_nested_data(description)
|
|
876
876
|
|
|
877
877
|
def __create_warning_description_markup(
|
|
878
878
|
self,
|
|
@@ -993,6 +993,7 @@ class Jira:
|
|
|
993
993
|
def __create_comment_markup(
|
|
994
994
|
self,
|
|
995
995
|
error: Optional[str] = None,
|
|
996
|
+
exc_traceback: Optional[TracebackType] = None,
|
|
996
997
|
attachments: Optional[List] = None,
|
|
997
998
|
additional_info: Optional[str] = None,
|
|
998
999
|
metadata: Optional[dict] = None,
|
|
@@ -1002,8 +1003,8 @@ class Jira:
|
|
|
1002
1003
|
Args:
|
|
1003
1004
|
error (str): The error string.
|
|
1004
1005
|
attachments (List): The list of attachments.
|
|
1005
|
-
issue_status (str, optional): The issue status. Defaults to "".
|
|
1006
1006
|
additional_info (str, optional): Additional information. Defaults to "".
|
|
1007
|
+
metadata (dict, optional): Additional metadata. Defaults to None.
|
|
1007
1008
|
|
|
1008
1009
|
Returns:
|
|
1009
1010
|
dict: The comment.
|
|
@@ -1030,12 +1031,22 @@ class Jira:
|
|
|
1030
1031
|
},
|
|
1031
1032
|
]
|
|
1032
1033
|
|
|
1034
|
+
branch_markup = []
|
|
1035
|
+
if exc_traceback and self._build_info:
|
|
1036
|
+
branch_markup = [
|
|
1037
|
+
{
|
|
1038
|
+
"type": "expand",
|
|
1039
|
+
"attrs": {"title": "Commit Info"},
|
|
1040
|
+
"content": self.__branch_info_markup(exc_traceback),
|
|
1041
|
+
},
|
|
1042
|
+
]
|
|
1043
|
+
|
|
1033
1044
|
comment_markup = [
|
|
1034
1045
|
{
|
|
1035
1046
|
"type": "paragraph",
|
|
1036
1047
|
"content": (
|
|
1037
1048
|
[
|
|
1038
|
-
{"type": "text", "text": "Error
|
|
1049
|
+
{"type": "text", "text": "Error occurs again in "},
|
|
1039
1050
|
]
|
|
1040
1051
|
+ self.__link_markup()
|
|
1041
1052
|
+ date_markup
|
|
@@ -1080,7 +1091,8 @@ class Jira:
|
|
|
1080
1091
|
+ (comment_markup if error else [])
|
|
1081
1092
|
+ (self.__description_markup(additional_info) if additional_info else [])
|
|
1082
1093
|
+ (attach_markup if attachments else [])
|
|
1083
|
-
+ (self.__metadata_markup(metadata) if metadata else [])
|
|
1094
|
+
+ (self.__metadata_markup(metadata) if metadata else [])
|
|
1095
|
+
+ branch_markup,
|
|
1084
1096
|
}
|
|
1085
1097
|
}
|
|
1086
1098
|
|
|
@@ -1107,6 +1119,7 @@ class Jira:
|
|
|
1107
1119
|
self,
|
|
1108
1120
|
existing_ticket: dict,
|
|
1109
1121
|
summary: str,
|
|
1122
|
+
exception: Optional[Exception] = None,
|
|
1110
1123
|
attachments: Optional[List] = None,
|
|
1111
1124
|
additional_info: Optional[str] = None,
|
|
1112
1125
|
metadata: Optional[dict] = None,
|
|
@@ -1166,6 +1179,7 @@ class Jira:
|
|
|
1166
1179
|
ticket_id=issue["id"],
|
|
1167
1180
|
comments=self.__create_comment_markup(
|
|
1168
1181
|
error=summary,
|
|
1182
|
+
exc_traceback=exception.__traceback__,
|
|
1169
1183
|
attachments=posted_attachments,
|
|
1170
1184
|
additional_info=additional_info,
|
|
1171
1185
|
metadata=metadata,
|
|
@@ -1380,6 +1394,7 @@ class Jira:
|
|
|
1380
1394
|
if existing_ticket:
|
|
1381
1395
|
self.__update_existing_ticket(
|
|
1382
1396
|
existing_ticket=existing_ticket,
|
|
1397
|
+
exception=exception,
|
|
1383
1398
|
attachments=attachments,
|
|
1384
1399
|
summary=summary,
|
|
1385
1400
|
additional_info=additional_info,
|
|
@@ -1450,6 +1465,7 @@ class Jira:
|
|
|
1450
1465
|
if existing_ticket:
|
|
1451
1466
|
self.__update_existing_ticket(
|
|
1452
1467
|
existing_ticket=existing_ticket,
|
|
1468
|
+
exception=exception,
|
|
1453
1469
|
summary=summary,
|
|
1454
1470
|
)
|
|
1455
1471
|
if stack_trace and os.path.exists(stack_trace):
|
|
@@ -1485,7 +1501,9 @@ class Jira:
|
|
|
1485
1501
|
return response
|
|
1486
1502
|
except Exception as ex:
|
|
1487
1503
|
logger.warning(f"Failed to create Jira issue due to: {type(ex)}: {ex}")
|
|
1488
|
-
self.report_internal_error(
|
|
1504
|
+
self.report_internal_error(
|
|
1505
|
+
exception=ex, metadata=variables, additional_info="Failed to report unhandled error."
|
|
1506
|
+
)
|
|
1489
1507
|
return False
|
|
1490
1508
|
|
|
1491
1509
|
def report_internal_error(self, exception: Exception, metadata: dict = None, additional_info: str = None):
|
|
@@ -115,6 +115,23 @@ def remove_holotree_id(path: str) -> str:
|
|
|
115
115
|
return re.sub(pattern, r"\1", path)
|
|
116
116
|
|
|
117
117
|
|
|
118
|
+
def clean_nested_data(data):
|
|
119
|
+
"""Recursively replaces None values with empty strings in nested dictionaries and lists.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
data: Input data structure (dict, list, or other type)
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Cleaned data structure with None values replaced by empty strings
|
|
126
|
+
"""
|
|
127
|
+
if isinstance(data, dict):
|
|
128
|
+
return {key: clean_nested_data(value) for key, value in data.items()}
|
|
129
|
+
elif isinstance(data, (list, tuple)):
|
|
130
|
+
return [clean_nested_data(item) for item in data]
|
|
131
|
+
else:
|
|
132
|
+
return "" if data is None else data
|
|
133
|
+
|
|
134
|
+
|
|
118
135
|
def retrieve_build_info():
|
|
119
136
|
"""Logs build information."""
|
|
120
137
|
if not os.path.exists(CONFIG.BUILD_INFO_FILE):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: t_bug_catcher
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.7
|
|
4
4
|
Summary: Bug catcher
|
|
5
5
|
Home-page: https://www.thoughtful.ai/
|
|
6
6
|
Author: Thoughtful
|
|
@@ -14,6 +14,15 @@ Requires-Python: >=3.9
|
|
|
14
14
|
Requires-Dist: requests<3.0.0,>=2.31.0
|
|
15
15
|
Requires-Dist: bugsnag>=4.6.1
|
|
16
16
|
Requires-Dist: retry~=0.9.2
|
|
17
|
+
Dynamic: author
|
|
18
|
+
Dynamic: author-email
|
|
19
|
+
Dynamic: classifier
|
|
20
|
+
Dynamic: description
|
|
21
|
+
Dynamic: home-page
|
|
22
|
+
Dynamic: keywords
|
|
23
|
+
Dynamic: requires-dist
|
|
24
|
+
Dynamic: requires-python
|
|
25
|
+
Dynamic: summary
|
|
17
26
|
|
|
18
27
|
t-bug-catcher
|
|
19
28
|
==============
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|