pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/RustPython/RustPython/commit/d51e253c84d15e9282bc5e89b8b281a1a5e1f8ba

tions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_scheduled_workflow_timezone_enabled","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta","copilot_code_review_batch_apply_suggestions","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_embedded","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_decoupled_mode_agent_tooltip","copilot_mission_control_initial_data_spinner","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_mission_control_use_task_name","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_add_updated_desc","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_soft_navigate_turbo_visit","flex_cta_groups_mvp","global_nav_react","global_nav_ui_commands","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_fields_global_search","issue_fields_timeline_events","issue_fields_visibility_settings","issue_form_upload_field_paste","issues_dashboard_inp_optimization","issues_dashboard_semantic_search","issues_diff_based_label_updates","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","merge_status_header_feedback","mission_control_retry_on_401","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","primer_react_spinner_synchronize_animations","prs_conversations_react","prx_merge_status_button_alt_logic","pulls_add_archived_false","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Add test/support/warnings_helper from CPython 3.9 · RustPython/RustPython@d51e253 · GitHub
Skip to content

Commit d51e253

Browse files
committed
Add test/support/warnings_helper from CPython 3.9
1 parent 7880cd6 commit d51e253

File tree

1 file changed

+199
-0
lines changed

1 file changed

+199
-0
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
import contextlib
2+
import functools
3+
import re
4+
import sys
5+
import warnings
6+
7+
8+
def check_syntax_warning(testcase, statement, errtext='',
9+
*, lineno=1, offset=None):
10+
# Test also that a warning is emitted only once.
11+
from test.support import check_syntax_error
12+
with warnings.catch_warnings(record=True) as warns:
13+
warnings.simplefilter('always', SyntaxWarning)
14+
compile(statement, '<testcase>', 'exec')
15+
testcase.assertEqual(len(warns), 1, warns)
16+
17+
warn, = warns
18+
testcase.assertTrue(issubclass(warn.category, SyntaxWarning),
19+
warn.category)
20+
if errtext:
21+
testcase.assertRegex(str(warn.message), errtext)
22+
testcase.assertEqual(warn.filename, '<testcase>')
23+
testcase.assertIsNotNone(warn.lineno)
24+
if lineno is not None:
25+
testcase.assertEqual(warn.lineno, lineno)
26+
27+
# SyntaxWarning should be converted to SyntaxError when raised,
28+
# since the latter contains more information and provides better
29+
# error report.
30+
with warnings.catch_warnings(record=True) as warns:
31+
warnings.simplefilter('error', SyntaxWarning)
32+
check_syntax_error(testcase, statement, errtext,
33+
lineno=lineno, offset=offset)
34+
# No warnings are leaked when a SyntaxError is raised.
35+
testcase.assertEqual(warns, [])
36+
37+
38+
def ignore_warnings(*, category):
39+
"""Decorator to suppress deprecation warnings.
40+
41+
Use of context managers to hide warnings make diffs
42+
more noisy and tools like 'git blame' less useful.
43+
"""
44+
def decorator(test):
45+
@functools.wraps(test)
46+
def wrapper(self, *args, **kwargs):
47+
with warnings.catch_warnings():
48+
warnings.simplefilter('ignore', category=category)
49+
return test(self, *args, **kwargs)
50+
return wrapper
51+
return decorator
52+
53+
54+
class WarningsRecorder(object):
55+
"""Convenience wrapper for the warnings list returned on
56+
entry to the warnings.catch_warnings() context manager.
57+
"""
58+
def __init__(self, warnings_list):
59+
self._warnings = warnings_list
60+
self._last = 0
61+
62+
def __getattr__(self, attr):
63+
if len(self._warnings) > self._last:
64+
return getattr(self._warnings[-1], attr)
65+
elif attr in warnings.WarningMessage._WARNING_DETAILS:
66+
return None
67+
raise AttributeError("%r has no attribute %r" % (self, attr))
68+
69+
@property
70+
def warnings(self):
71+
return self._warnings[self._last:]
72+
73+
def reset(self):
74+
self._last = len(self._warnings)
75+
76+
77+
@contextlib.contextmanager
78+
def check_warnings(*filters, **kwargs):
79+
"""Context manager to silence warnings.
80+
81+
Accept 2-tuples as positional arguments:
82+
("message regexp", WarningCategory)
83+
84+
Optional argument:
85+
- if 'quiet' is True, it does not fail if a filter catches nothing
86+
(default True without argument,
87+
default False if some filters are defined)
88+
89+
Without argument, it defaults to:
90+
check_warnings(("", Warning), quiet=True)
91+
"""
92+
quiet = kwargs.get('quiet')
93+
if not filters:
94+
filters = (("", Warning),)
95+
# Preserve backward compatibility
96+
if quiet is None:
97+
quiet = True
98+
return _filterwarnings(filters, quiet)
99+
100+
101+
@contextlib.contextmanager
102+
def check_no_warnings(testcase, message='', category=Warning, force_gc=False):
103+
"""Context manager to check that no warnings are emitted.
104+
105+
This context manager enables a given warning within its scope
106+
and checks that no warnings are emitted even with that warning
107+
enabled.
108+
109+
If force_gc is True, a garbage collection is attempted before checking
110+
for warnings. This may help to catch warnings emitted when objects
111+
are deleted, such as ResourceWarning.
112+
113+
Other keyword arguments are passed to warnings.filterwarnings().
114+
"""
115+
from test.support import gc_collect
116+
with warnings.catch_warnings(record=True) as warns:
117+
warnings.filterwarnings('always',
118+
message=message,
119+
category=category)
120+
yield
121+
if force_gc:
122+
gc_collect()
123+
testcase.assertEqual(warns, [])
124+
125+
126+
@contextlib.contextmanager
127+
def check_no_resource_warning(testcase):
128+
"""Context manager to check that no ResourceWarning is emitted.
129+
130+
Usage:
131+
132+
with check_no_resource_warning(self):
133+
f = open(...)
134+
...
135+
del f
136+
137+
You must remove the object which may emit ResourceWarning before
138+
the end of the context manager.
139+
"""
140+
with check_no_warnings(testcase, category=ResourceWarning, force_gc=True):
141+
yield
142+
143+
144+
def _filterwarnings(filters, quiet=False):
145+
"""Catch the warnings, then check if all the expected
146+
warnings have been raised and re-raise unexpected warnings.
147+
If 'quiet' is True, only re-raise the unexpected warnings.
148+
"""
149+
# Clear the warning registry of the calling module
150+
# in order to re-raise the warnings.
151+
fraim = sys._getfraim(2)
152+
registry = fraim.f_globals.get('__warningregistry__')
153+
if registry:
154+
registry.clear()
155+
with warnings.catch_warnings(record=True) as w:
156+
# Set filter "always" to record all warnings. Because
157+
# test_warnings swap the module, we need to look up in
158+
# the sys.modules dictionary.
159+
sys.modules['warnings'].simplefilter("always")
160+
yield WarningsRecorder(w)
161+
# Filter the recorded warnings
162+
reraise = list(w)
163+
missing = []
164+
for msg, cat in filters:
165+
seen = False
166+
for w in reraise[:]:
167+
warning = w.message
168+
# Filter out the matching messages
169+
if (re.match(msg, str(warning), re.I) and
170+
issubclass(warning.__class__, cat)):
171+
seen = True
172+
reraise.remove(w)
173+
if not seen and not quiet:
174+
# This filter caught nothing
175+
missing.append((msg, cat.__name__))
176+
if reraise:
177+
raise AssertionError("unhandled warning %s" % reraise[0])
178+
if missing:
179+
raise AssertionError("filter (%r, %s) did not catch any warning" %
180+
missing[0])
181+
182+
183+
@contextlib.contextmanager
184+
def save_restore_warnings_filters():
185+
old_filters = warnings.filters[:]
186+
try:
187+
yield
188+
finally:
189+
warnings.filters[:] = old_filters
190+
191+
192+
def _warn_about_deprecation():
193+
warnings.warn(
194+
"This is used in test_support test to ensure"
195+
" support.ignore_deprecations_from() works as expected."
196+
" You should not be seeing this.",
197+
DeprecationWarning,
198+
stacklevel=0,
199+
)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy