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.
Files changed (26) hide show
  1. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/PKG-INFO +11 -2
  2. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/setup.cfg +1 -1
  3. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/setup.py +1 -1
  4. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/__init__.py +1 -1
  5. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/jira.py +25 -7
  6. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/utils/common.py +17 -0
  7. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/PKG-INFO +11 -2
  8. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/MANIFEST.in +0 -0
  9. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/README.rst +0 -0
  10. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/pyproject.toml +0 -0
  11. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/requirements.txt +0 -0
  12. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/bug_catcher.py +0 -0
  13. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/bug_snag.py +0 -0
  14. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/config.py +0 -0
  15. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/exceptions.py +0 -0
  16. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/resources/whispers_config.yml +0 -0
  17. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/stack_saver.py +0 -0
  18. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/utils/__init__.py +0 -0
  19. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/utils/logger.py +0 -0
  20. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher/workitems.py +0 -0
  21. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/SOURCES.txt +0 -0
  22. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/dependency_links.txt +0 -0
  23. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/not-zip-safe +0 -0
  24. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/requires.txt +0 -0
  25. {t_bug_catcher-0.6.5 → t_bug_catcher-0.6.7}/t_bug_catcher.egg-info/top_level.txt +0 -0
  26. {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
1
+ Metadata-Version: 2.2
2
2
  Name: t_bug_catcher
3
- Version: 0.6.5
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
  ==============
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 0.6.5
2
+ current_version = 0.6.7
3
3
  commit = True
4
4
  tag = False
5
5
 
@@ -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.5",
29
+ version="0.6.7",
30
30
  zip_safe=False,
31
31
  install_requires=install_requirements,
32
32
  include_package_data=True,
@@ -3,7 +3,7 @@
3
3
  __author__ = """Thoughtful"""
4
4
  __email__ = "support@thoughtful.ai"
5
5
  # fmt: off
6
- __version__ = '0.6.5'
6
+ __version__ = '0.6.7'
7
7
  # fmt: on
8
8
 
9
9
  from .bug_catcher import (
@@ -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 occures again in "},
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(exception=ex, additional_info="Failed to report unhandled 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
1
+ Metadata-Version: 2.2
2
2
  Name: t_bug_catcher
3
- Version: 0.6.5
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