Skip to content

Commit f118b10

Browse files
committed
Silence warnings when accessing user attributes. Fixes microsoft#190
1 parent 6116bc1 commit f118b10

9 files changed

Lines changed: 99 additions & 5 deletions

File tree

src/debugpy/_vendored/pydevd/_pydev_bundle/pydev_console_utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from _pydev_bundle._pydev_calltip_util import get_description
66
from _pydevd_bundle import pydevd_vars
77
from _pydevd_bundle import pydevd_xml
8-
from _pydevd_bundle.pydevd_constants import (IS_JYTHON, dict_iter_items, NEXT_VALUE_SEPARATOR, get_global_debugger)
8+
from _pydevd_bundle.pydevd_constants import (IS_JYTHON, dict_iter_items, NEXT_VALUE_SEPARATOR, get_global_debugger,
9+
silence_warnings_decorator)
910
from contextlib import contextmanager
1011
from _pydev_bundle import pydev_log
1112
from _pydevd_bundle.pydevd_utils import interrupt_main_thread
@@ -447,6 +448,7 @@ def getFrame(self):
447448

448449
return xml.getvalue()
449450

451+
@silence_warnings_decorator
450452
def getVariable(self, attributes):
451453
xml = StringIO.StringIO()
452454
xml.write("<xml>")
@@ -476,6 +478,7 @@ def evaluate(self, expression):
476478
xml.write("</xml>")
477479
return xml.getvalue()
478480

481+
@silence_warnings_decorator
479482
def loadFullValue(self, seq, scope_attrs):
480483
"""
481484
Evaluate full value for async Console variables in a separate thread and send results to IDE side

src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_comm.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
from _pydev_imps._pydev_saved_modules import socket as socket_module
7474
from _pydevd_bundle.pydevd_constants import (DebugInfoHolder, get_thread_id, IS_WINDOWS, IS_JYTHON,
7575
IS_PY2, IS_PY36_OR_GREATER, STATE_RUN, dict_keys, ASYNC_EVAL_TIMEOUT_SEC,
76-
get_global_debugger, GetGlobalDebugger, set_global_debugger) # Keep for backward compatibility @UnusedImport
76+
get_global_debugger, GetGlobalDebugger, set_global_debugger, silence_warnings_decorator) # Keep for backward compatibility @UnusedImport
7777
from _pydev_bundle.pydev_override import overrides
7878
import weakref
7979
from _pydev_bundle._pydev_completer import extract_token_and_qualifier
@@ -444,7 +444,7 @@ def start_client(host, port):
444444
s.setsockopt(SOL_SOCKET, socket_module.SO_KEEPALIVE, 1)
445445
except (AttributeError, OSError):
446446
pass # May not be available everywhere.
447-
try :
447+
try:
448448
s.setsockopt(socket_module.IPPROTO_TCP, socket_module.TCP_KEEPIDLE, 1)
449449
except (AttributeError, OSError):
450450
pass # May not be available everywhere.
@@ -647,6 +647,7 @@ def do_it(self, dbg):
647647
t.additional_info.pydev_message = str(self.seq)
648648

649649

650+
@silence_warnings_decorator
650651
def internal_get_variable_json(py_db, request):
651652
'''
652653
:param VariablesRequest request:
@@ -700,6 +701,7 @@ def __init__(self, seq, thread_id, frame_id, scope, attrs):
700701
self.scope = scope
701702
self.attributes = attrs
702703

704+
@silence_warnings_decorator
703705
def do_it(self, dbg):
704706
''' Converts request into python variable '''
705707
try:
@@ -838,6 +840,7 @@ def _write_variable_response(py_db, request, value, success, message):
838840
py_db.writer.add_command(cmd)
839841

840842

843+
@silence_warnings_decorator
841844
def internal_get_frame(dbg, seq, thread_id, frame_id):
842845
''' Converts request into python variable '''
843846
try:
@@ -905,6 +908,7 @@ def _evaluate_response(py_db, request, result, error_message=''):
905908
_global_frame = None
906909

907910

911+
@silence_warnings_decorator
908912
def internal_evaluate_expression_json(py_db, request, thread_id):
909913
'''
910914
:param EvaluateRequest request:
@@ -1034,6 +1038,7 @@ def __create_frame():
10341038
py_db.writer.add_command(NetCommand(CMD_RETURN, 0, variables_response, is_json=True))
10351039

10361040

1041+
@silence_warnings_decorator
10371042
def internal_evaluate_expression(dbg, seq, thread_id, frame_id, expression, is_exec, trim_if_too_big, attr_to_set_result):
10381043
''' gets the value of a variable '''
10391044
try:
@@ -1499,6 +1504,7 @@ def __init__(self, seq, thread_id, frame_id, vars):
14991504
self.frame_id = frame_id
15001505
self.vars = vars
15011506

1507+
@silence_warnings_decorator
15021508
def do_it(self, dbg):
15031509
'''Starts a thread that will load values asynchronously'''
15041510
try:

src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_constants.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import platform
66
import weakref
77
import struct
8+
import warnings
9+
import functools
810

911
STATE_RUN = 1
1012
STATE_SUSPEND = 2
@@ -500,6 +502,17 @@ def as_str(s):
500502
return s
501503

502504

505+
def silence_warnings_decorator(func):
506+
507+
@functools.wraps(func)
508+
def new_func(*args, **kwargs):
509+
with warnings.catch_warnings():
510+
warnings.filterwarnings("ignore")
511+
return func(*args, **kwargs)
512+
513+
return new_func
514+
515+
503516
def sorted_dict_repr(d):
504517
s = sorted(dict_iter_items(d), key=lambda x:str(x[0]))
505518
return '{' + ', '.join(('%r: %r' % x) for x in s) + '}'

src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_suspended_frames.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import sys
33

44
from _pydevd_bundle.pydevd_constants import get_frame, dict_items, RETURN_VALUES_DICT, \
5-
dict_iter_items, ForkSafeLock, GENERATED_LEN_ATTR_NAME
5+
dict_iter_items, ForkSafeLock, GENERATED_LEN_ATTR_NAME, silence_warnings_decorator
66
from _pydevd_bundle.pydevd_xml import get_variable_details, get_type
77
from _pydev_bundle.pydev_override import overrides
88
from _pydevd_bundle.pydevd_resolver import sorted_attributes_key, TOO_LARGE_ATTR, get_var_scope
@@ -154,6 +154,7 @@ def __init__(self, py_db, name, value, register_variable, is_return_value=False,
154154
self._is_return_value = is_return_value
155155
self.evaluate_name = evaluate_name
156156

157+
@silence_warnings_decorator
157158
@overrides(_AbstractVariable.get_children_variables)
158159
def get_children_variables(self, fmt=None, scope=None):
159160
_type, _type_name, resolver = get_type(self.value)
@@ -258,6 +259,7 @@ def change_variable(self, name, value, py_db, fmt=None):
258259

259260
return self.get_child_variable_named(name, fmt=fmt)
260261

262+
@silence_warnings_decorator
261263
@overrides(_AbstractVariable.get_children_variables)
262264
def get_children_variables(self, fmt=None, scope=None):
263265
children_variables = []

src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_vars.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
import pickle
55
from _pydevd_bundle.pydevd_constants import get_frame, get_current_thread_id, xrange, IS_PY2, \
6-
iter_chars
6+
iter_chars, silence_warnings_decorator
77

88
from _pydevd_bundle.pydevd_xml import ExceptionOnEvaluate, get_type, var_to_xml
99
from _pydev_bundle import pydev_log
@@ -49,6 +49,7 @@ def dump_frames(thread_id):
4949
sys.stdout.write('%s\n' % pickle.dumps(frame))
5050

5151

52+
@silence_warnings_decorator
5253
def getVariable(dbg, thread_id, frame_id, scope, attrs):
5354
"""
5455
returns the value of a variable

src/debugpy/_vendored/pydevd/pydevd_attach_to_process/attach_pydevd.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def process_command_line(argv):
3838

3939

4040
def main(setup):
41+
sys.path.append(os.path.dirname(__file__))
4142
import add_code_to_python_process
4243
show_debug_info_on_target_process = 0
4344

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import warnings
2+
3+
4+
class MyClass(object):
5+
6+
def __getattribute__(self, attr):
7+
warnings.warn(
8+
"Deprecation Warning",
9+
DeprecationWarning
10+
)
11+
12+
warnings.warn(
13+
"Future Warning!",
14+
FutureWarning,
15+
)
16+
return 1
17+
18+
19+
obj = MyClass()
20+
21+
if __name__ == '__main__':
22+
print('TEST SUCEEDED') # break here

src/debugpy/_vendored/pydevd/tests_python/test_debugger.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3212,6 +3212,24 @@ def test_return_value(case_setup):
32123212
writer.finished_ok = True
32133213

32143214

3215+
def test_gettr_warning(case_setup):
3216+
with case_setup.test_file('_debugger_case_warnings.py') as writer:
3217+
break_line = writer.get_line_index_with_content('break here')
3218+
writer.write_add_breakpoint(break_line)
3219+
writer.write_make_initial_run()
3220+
hit = writer.wait_for_breakpoint_hit(line=break_line)
3221+
3222+
writer.write_get_frame(hit.thread_id, hit.frame_id)
3223+
writer.wait_for_vars([
3224+
[
3225+
'<var name="obj'
3226+
],
3227+
])
3228+
3229+
writer.write_run_thread(hit.thread_id)
3230+
writer.finished_ok = True
3231+
3232+
32153233
@pytest.mark.skipif(IS_JYTHON, reason='Jython can only have one thread stopped at each time.')
32163234
@pytest.mark.parametrize('check_single_notification', [True, False])
32173235
def test_run_pause_all_threads_single_notification(case_setup, check_single_notification):

src/debugpy/_vendored/pydevd/tests_python/test_debugger_json.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,6 +1585,34 @@ def test_hasattr_failure(case_setup):
15851585
writer.finished_ok = True
15861586

15871587

1588+
def test_getattr_warning(case_setup):
1589+
with case_setup.test_file('_debugger_case_warnings.py') as writer:
1590+
json_facade = JsonFacade(writer)
1591+
1592+
writer.write_add_breakpoint(writer.get_line_index_with_content('break here'))
1593+
json_facade.write_make_initial_run()
1594+
1595+
json_hit = json_facade.wait_for_thread_stopped()
1596+
json_hit = json_facade.get_stack_as_json_hit(json_hit.thread_id)
1597+
1598+
variables_response = json_facade.get_variables_response(json_hit.frame_id)
1599+
1600+
for variable in variables_response.body.variables:
1601+
if variable['evaluateName'] == 'obj':
1602+
break
1603+
else:
1604+
raise AssertionError('Did not find "obj" in %s' % (variables_response.body.variables,))
1605+
1606+
json_facade.evaluate('obj', json_hit.frame_id, context='hover')
1607+
json_facade.evaluate('not_there', json_hit.frame_id, context='hover', success=False)
1608+
json_facade.evaluate('not_there', json_hit.frame_id, context='watch', success=False)
1609+
1610+
json_facade.write_continue()
1611+
1612+
# i.e.: the test will fail if anything is printed to stderr!
1613+
writer.finished_ok = True
1614+
1615+
15881616
def test_evaluate_numpy(case_setup, pyfile):
15891617
try:
15901618
import numpy

0 commit comments

Comments
 (0)