Skip to content

Commit 8fb841a

Browse files
authored
Merge pull request #16 from jennier0107/dev
[ENH] Provides command line tool for pydumpling
2 parents a6cef14 + 18bda02 commit 8fb841a

File tree

7 files changed

+98
-17
lines changed

7 files changed

+98
-17
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ __pycache__
55
*.dump
66
test.py
77
/my
8-
.vscode
8+
.vscode
9+
.idea
1.63 KB
Binary file not shown.

dist/pydumpling-0.1.1.tar.gz

741 Bytes
Binary file not shown.

poetry.lock

Lines changed: 14 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pydumpling/__main__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .cli import main
2+
3+
main()

pydumpling/cli.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import argparse
2+
import os.path
3+
from .debug_dumpling import debug_dumpling, load_dumpling
4+
from .helpers import print_traceback_and_except
5+
6+
DUMP_FILE_EXTENSION: str = ".dump"
7+
8+
9+
def validate_file_name(file_name: str) -> str:
10+
"""check file extension name and exists"""
11+
if not file_name.endswith(DUMP_FILE_EXTENSION):
12+
raise argparse.ArgumentTypeError("File must be .dump file")
13+
if not os.path.exists(file_name):
14+
raise argparse.ArgumentTypeError(f"File {file_name} not found")
15+
return file_name
16+
17+
18+
parser = argparse.ArgumentParser(
19+
description="pydumpling cli tools",
20+
prog="pydumpling",
21+
usage="%(prog)s [options] filename"
22+
)
23+
24+
# print or debug
25+
pydumpling_cli_action_group = parser.add_mutually_exclusive_group(required=True)
26+
27+
pydumpling_cli_action_group.add_argument(
28+
"--print",
29+
action="store_true",
30+
help="print traceback information"
31+
)
32+
33+
pydumpling_cli_action_group.add_argument(
34+
"--debug",
35+
action="store_true",
36+
help="enter pdb debugging interface"
37+
)
38+
39+
parser.add_argument(
40+
"filename",
41+
type=validate_file_name,
42+
help="the .dump file"
43+
)
44+
45+
46+
def main() -> None:
47+
args = parser.parse_args()
48+
file_name = args.filename
49+
if args.print:
50+
dumpling_ = load_dumpling(file_name)
51+
print_traceback_and_except(dumpling_)
52+
elif args.debug:
53+
debug_dumpling(file_name)

pydumpling/helpers.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import linecache
2+
3+
4+
def print_traceback_and_except(dumpling_result):
5+
traceback_obj = dumpling_result["traceback"]
6+
except_extra = dumpling_result["exc_extra"]
7+
except_type = except_extra["exc_type"]
8+
except_value = except_extra["exc_value"]
9+
10+
print("Traceback (most recent call last):")
11+
while traceback_obj:
12+
frame = traceback_obj.tb_frame
13+
lineno = traceback_obj.tb_lineno
14+
filename = frame.f_code.co_filename
15+
function_name = frame.f_code.co_name
16+
line = linecache.getline(filename, lineno).strip()
17+
mid_index = len(line) // 2
18+
19+
print(f"File \"{filename}\", line {lineno}, in {function_name}")
20+
print(f" {line}")
21+
print(" " * 4 + "~" * mid_index + "^" + "~" * mid_index)
22+
traceback_obj = traceback_obj.tb_next
23+
24+
if traceback_obj is None:
25+
break
26+
print(f"{except_type.__name__}: {except_value}")

0 commit comments

Comments
 (0)