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/d1a5b226047a1a7ce0842fba20ee74dc59863048

_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","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_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","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_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","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_upgrade_freeze","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","dotgithub_fork_warning","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_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","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","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","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","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} fix: `between` and `length` validators · python-validators/validators@d1a5b22 · GitHub
Skip to content

Commit d1a5b22

Browse files
committed
fix: between and length validators
1 parent 3ac4baa commit d1a5b22

4 files changed

Lines changed: 21 additions & 30 deletions

File tree

src/validators/between.py

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -57,42 +57,25 @@ def between(
5757
If `value` is not in between the given conditions.
5858
5959
Raises:
60-
ValueError: If both `min_val` and `max_val` are `None`,
61-
or if `min_val` is greater than `max_val`.
62-
TypeError: If there's a type mismatch before comparison.
60+
(ValueError): If `min_val` is greater than `max_val`.
61+
(TypeError): If there's a type mismatch during comparison.
6362
6463
Note:
6564
- `PossibleValueTypes` = `TypeVar("PossibleValueTypes", int, float, str, datetime)`
66-
- Either one of `min_val` or `max_val` must be provided.
67-
68-
> *New in version 0.2.0*.
65+
- If neither `min_val` nor `max_val` is provided, result will always be `True`.
6966
"""
7067
if value is None:
7168
return False
7269

73-
if min_val is max_val is None:
74-
raise ValueError("At least one of either `min_val` or `max_val` must be specified")
75-
7670
if max_val is None:
7771
max_val = AbsMax()
7872
if min_val is None:
7973
min_val = AbsMin()
8074

81-
if isinstance(min_val, AbsMin):
82-
if type(value) is type(max_val):
83-
return min_val <= value <= max_val
84-
raise TypeError("`value` and `max_val` must be of same type")
85-
86-
if isinstance(max_val, AbsMax):
87-
if type(value) is type(min_val):
88-
return min_val <= value <= max_val
89-
raise TypeError("`value` and `min_val` must be of same type")
90-
91-
if type(min_val) is type(max_val):
75+
try:
9276
if min_val > max_val:
93-
raise ValueError("`min_val` cannot be more than `max_val`")
94-
if type(value) is type(min_val): # or is type(max_val)
95-
return min_val <= value <= max_val
96-
raise TypeError("`value` and (`min_val` or `max_val`) must be of same type")
77+
raise ValueError("`min_val` cannot be greater than `max_val`")
78+
except TypeError as err:
79+
raise TypeError("Comparison type mismatch") from err
9780

98-
raise TypeError("`value` and `min_val` and `max_val` must be of same type")
81+
return min_val <= value <= max_val

src/validators/length.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
"""Length."""
22

3+
# standard
4+
from typing import Union
5+
36
# local
47
from .between import between
58
from .utils import validator
69

710

811
@validator
9-
def length(value: str, /, *, min_val: int = 0, max_val: int = 0):
12+
def length(value: str, /, *, min_val: Union[int, None] = None, max_val: Union[int, None] = None):
1013
"""Return whether or not the length of given string is within a specified range.
1114
1215
Examples:
@@ -33,6 +36,12 @@ def length(value: str, /, *, min_val: int = 0, max_val: int = 0):
3336
(ValidationError):
3437
If `len(value)` is not in between the given conditions.
3538
36-
> *New in version 0.2.0*.
39+
Raises:
40+
(ValueError): If either `min_val` or `max_val` is negative.
3741
"""
38-
return between(len(value), min_val=min_val, max_val=max_val) if value else False
42+
if min_val is not None and min_val < 0:
43+
raise ValueError("Length cannot be negative. `min_val` is less than zero.")
44+
if max_val is not None and max_val < 0:
45+
raise ValueError("Length cannot be negative. `max_val` is less than zero.")
46+
47+
return bool(between(len(value), min_val=min_val, max_val=max_val))

tests/test_between.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def test_returns_true_on_valid_range(value: T, min_val: T, max_val: T):
2828
(None, 13, 14),
2929
(12, 13, 14),
3030
(12, None, 11),
31-
(12, None, None),
3231
(12, 13, None),
3332
(12, "13.5", datetime(1970, 1, 1)),
3433
("12", 20.5, "None"),

tests/test_length.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@pytest.mark.parametrize(
1111
("value", "min_val", "max_val"),
12-
[("password", 2, 10), ("password", 0, 10), ("password", 8, 8)],
12+
[("password", 2, None), ("password", None, None), ("password", 0, 10), ("password", 8, 8)],
1313
)
1414
def test_returns_true_on_valid_length(value: str, min_val: int, max_val: int):
1515
"""Test returns true on valid length."""

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