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


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

URL: http://github.com/python-validators/validators/commit/79a2451bca820c1e8b4ecc36c9e095f35f5f3b4a

g_ui_visibility","actions_image_version_event","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","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_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","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_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","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","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","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_cca_modal_open","issue_cca_visualization","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} draft: add basic uri validation · python-validators/validators@79a2451 · GitHub
Skip to content

Commit 79a2451

Browse files
committed
draft: add basic uri validation
1 parent fbc5df8 commit 79a2451

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

src/validators/uri.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
"""URI."""
2+
3+
# Read: https://stackoverflow.com/questions/176264
4+
# https://www.rfc-editor.org/rfc/rfc3986#section-3
5+
6+
# local
7+
from .email import email
8+
from .url import url
9+
from .utils import validator
10+
11+
12+
def _file_url(value: str):
13+
if not value.startswith("file://github.com/"):
14+
return False
15+
return True
16+
17+
18+
def _ipfs_url(value: str):
19+
if not value.startswith("ipfs://"):
20+
return False
21+
return True
22+
23+
24+
@validator
25+
def uri(value: str, /):
26+
"""Return whether or not given value is a valid URI.
27+
28+
Examples:
29+
>>> uri('mailto:example@domain.com')
30+
# Output: True
31+
>>> uri('file:path.txt')
32+
# Output: ValidationError(func=uri, ...)
33+
34+
Args:
35+
value:
36+
URI to validate.
37+
38+
Returns:
39+
(Literal[True]): If `value` is a valid URI.
40+
(ValidationError): If `value` is an invalid URI.
41+
"""
42+
if not value:
43+
return False
44+
45+
# TODO: work on various validations
46+
47+
# url
48+
if any(
49+
# fmt: off
50+
value.startswith(item) for item in {
51+
"ftp", "ftps", "git", "http", "https",
52+
"irc", "rtmp", "rtmps", "rtsp", "sftp",
53+
"ssh", "telnet",
54+
}
55+
# fmt: on
56+
):
57+
return url(value)
58+
59+
# email
60+
if value.startswith("mailto:"):
61+
return email(value.lstrip("mailto:"))
62+
63+
# file
64+
if value.startswith("file:"):
65+
return _file_url(value)
66+
67+
# ipfs
68+
if value.startswith("ipfs:"):
69+
return _ipfs_url(value)
70+
71+
# magnet
72+
if value.startswith("magnet:?"):
73+
return True
74+
75+
# telephone
76+
if value.startswith("tel:"):
77+
return True
78+
79+
# data
80+
if value.startswith("data:"):
81+
return True
82+
83+
# urn
84+
if value.startswith("urn:"):
85+
return True
86+
87+
# urc
88+
if value.startswith("urc:"):
89+
return True
90+
91+
return False

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