From d8549e1649b8a0bffbbf8f2220de642a405d280a Mon Sep 17 00:00:00 2001 From: Muril Date: Mon, 2 Feb 2026 14:21:25 -0300 Subject: [PATCH 1/2] fix: replace unsafe 'is' comparisons with '==' for strings Fixes #192 Changed all string comparisons from identity checks (is) to equality checks (==) across validation contracts. The 'is' operator checks object identity in memory, while '==' checks value equality, which is the correct approach for comparing string constants. Files modified: - bool_validation_contract.py - brazilian_document_validation_contract.py - collections_validation_contract.py - commons_validation_contract.py - contract.py - credit_card_validation_contract.py - email_validation_contract.py - strings_validation_contract.py - url_validation_contract.py Total: 23 occurrences corrected across 9 files. --- flunt/validations/bool_validation_contract.py | 4 ++-- .../brazilian_document_validation_contract.py | 4 ++-- flunt/validations/collections_validation_contract.py | 10 +++++----- flunt/validations/commons_validation_contract.py | 8 ++++---- flunt/validations/contract.py | 2 +- flunt/validations/credit_card_validation_contract.py | 4 ++-- flunt/validations/email_validation_contract.py | 4 ++-- flunt/validations/strings_validation_contract.py | 6 +++--- flunt/validations/url_validation_contract.py | 4 ++-- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/flunt/validations/bool_validation_contract.py b/flunt/validations/bool_validation_contract.py index a9b63a5..0cbf9cb 100644 --- a/flunt/validations/bool_validation_contract.py +++ b/flunt/validations/bool_validation_contract.py @@ -83,7 +83,7 @@ def is_false( """ if self.__to_bool(value): - if message is IS_FALSE: + if message == IS_FALSE: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -116,7 +116,7 @@ def is_true( """ if not self.__to_bool(value): - if message is IS_TRUE: + if message == IS_TRUE: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) diff --git a/flunt/validations/brazilian_document_validation_contract.py b/flunt/validations/brazilian_document_validation_contract.py index 6415935..10f5234 100644 --- a/flunt/validations/brazilian_document_validation_contract.py +++ b/flunt/validations/brazilian_document_validation_contract.py @@ -196,7 +196,7 @@ def is_cpf( """ if not _validate_cpf(value): - if message is IS_NOT_CPF: + if message == IS_NOT_CPF: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -230,7 +230,7 @@ def is_cnpj( """ if not _validate_cnpj(value): - if message is IS_NOT_CNPJ: + if message == IS_NOT_CNPJ: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) diff --git a/flunt/validations/collections_validation_contract.py b/flunt/validations/collections_validation_contract.py index 4ab10e8..640ef93 100644 --- a/flunt/validations/collections_validation_contract.py +++ b/flunt/validations/collections_validation_contract.py @@ -71,7 +71,7 @@ def is_lower_than( return self if len(value) >= comparer: - if message is LOWER_THAN: + if message == LOWER_THAN: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) @@ -118,7 +118,7 @@ def is_lower_or_equals_than( return self if len(value) > comparer: - if message is LOWER_OR_EQUALS_THAN: + if message == LOWER_OR_EQUALS_THAN: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) @@ -165,7 +165,7 @@ def is_greater_than( return self if len(value) <= comparer: - if message is GREATER_THAN: + if message == GREATER_THAN: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) @@ -212,7 +212,7 @@ def is_greater_or_equals_than( return self if len(value) < comparer: - if message is GREATER_OR_EQUALS_THAN: + if message == GREATER_OR_EQUALS_THAN: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) @@ -267,7 +267,7 @@ def is_between( return self if not min <= len(value) <= max: - if message is IS_BETWEEN: + if message == IS_BETWEEN: self.add_notification(field, message.format(field, min, max)) return self self.add_notification(field, message) diff --git a/flunt/validations/commons_validation_contract.py b/flunt/validations/commons_validation_contract.py index 0a943ec..041f8bb 100644 --- a/flunt/validations/commons_validation_contract.py +++ b/flunt/validations/commons_validation_contract.py @@ -46,7 +46,7 @@ def is_none(self, value: T, field: str, message: str = IS_NONE) -> Self: """ if value is not None: - if message is IS_NONE: + if message == IS_NONE: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -77,7 +77,7 @@ def is_not_none( """ if value is None: - if message is REQUIRED: + if message == REQUIRED: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -112,7 +112,7 @@ def are_equals( """ if value != comparer: - if message is EQUALS: + if message == EQUALS: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) @@ -147,7 +147,7 @@ def are_not_equals( """ if value == comparer: - if message is NOT_EQUALS: + if message == NOT_EQUALS: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) diff --git a/flunt/validations/contract.py b/flunt/validations/contract.py index 7f00084..8837f3e 100644 --- a/flunt/validations/contract.py +++ b/flunt/validations/contract.py @@ -89,7 +89,7 @@ def requires( """ if not value and not isinstance(value, bool | int | float): - if message is REQUIRED: + if message == REQUIRED: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) diff --git a/flunt/validations/credit_card_validation_contract.py b/flunt/validations/credit_card_validation_contract.py index 859766a..8786a5c 100644 --- a/flunt/validations/credit_card_validation_contract.py +++ b/flunt/validations/credit_card_validation_contract.py @@ -110,14 +110,14 @@ def is_credit_card( pattern = _get_only_numbers_pattern() if pattern is None or not pattern.match(value): - if message is IS_NOT_CREDIT_CARD: + if message == IS_NOT_CREDIT_CARD: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) return self if not _luhn_checksum(value): - if message is IS_NOT_CREDIT_CARD: + if message == IS_NOT_CREDIT_CARD: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) diff --git a/flunt/validations/email_validation_contract.py b/flunt/validations/email_validation_contract.py index 5c257cd..057129b 100644 --- a/flunt/validations/email_validation_contract.py +++ b/flunt/validations/email_validation_contract.py @@ -95,7 +95,7 @@ def is_email( """ if not _valid_email(value): - if message is IS_EMAIL: + if message == IS_EMAIL: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -126,7 +126,7 @@ def is_not_email( """ if _valid_email(value): - if message is IS_NOT_EMAIL: + if message == IS_NOT_EMAIL: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) diff --git a/flunt/validations/strings_validation_contract.py b/flunt/validations/strings_validation_contract.py index 0a918e1..8d06bd5 100644 --- a/flunt/validations/strings_validation_contract.py +++ b/flunt/validations/strings_validation_contract.py @@ -52,7 +52,7 @@ def is_not_none_or_white_space( """ if value is None or not str(value).strip(): - if message is IS_NOT_NONE_OR_WHITESPACE: + if message == IS_NOT_NONE_OR_WHITESPACE: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -86,7 +86,7 @@ def contains( """ if not isinstance(value, str) or comparer not in value: - if message is CONTAINS: + if message == CONTAINS: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) @@ -120,7 +120,7 @@ def not_contains( """ if not isinstance(value, str) or comparer in value: - if message is NOT_CONTAINS: + if message == NOT_CONTAINS: self.add_notification(field, message.format(field, comparer)) return self self.add_notification(field, message) diff --git a/flunt/validations/url_validation_contract.py b/flunt/validations/url_validation_contract.py index 0c252c0..28645b5 100644 --- a/flunt/validations/url_validation_contract.py +++ b/flunt/validations/url_validation_contract.py @@ -93,7 +93,7 @@ def is_url( """ if not _valid_url(value): - if message is IS_URL: + if message == IS_URL: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) @@ -122,7 +122,7 @@ def is_not_url( """ if _valid_url(value): - if message is IS_NOT_URL: + if message == IS_NOT_URL: self.add_notification(field, message.format(field)) return self self.add_notification(field, message) From e4a3315a8309de2ff15ad3a588828e5a29f515c7 Mon Sep 17 00:00:00 2001 From: Muril Date: Tue, 10 Feb 2026 14:00:23 -0300 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20retornar=20None=20em=20vez=20de=20st?= =?UTF-8?q?ring=20vazia=20quando=20padr=C3=A3o=20n=C3=A3o=20encontrado=20(?= =?UTF-8?q?#191)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flunt/localization/flunt_regex_patterns.py | 4 ++-- tests/localization/test_flunt_regex_patterns.py | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/flunt/localization/flunt_regex_patterns.py b/flunt/localization/flunt_regex_patterns.py index a49622c..fd0c71b 100644 --- a/flunt/localization/flunt_regex_patterns.py +++ b/flunt/localization/flunt_regex_patterns.py @@ -20,9 +20,9 @@ } -def get_pattern(name: str) -> str | Pattern[str]: +def get_pattern(name: str) -> str | Pattern[str] | None: """Retrieve a regex pattern by its name.""" value = REGEX_PATTERNS.get(name) if value is None: - return "" + return None return value diff --git a/tests/localization/test_flunt_regex_patterns.py b/tests/localization/test_flunt_regex_patterns.py index 8839b56..834f325 100644 --- a/tests/localization/test_flunt_regex_patterns.py +++ b/tests/localization/test_flunt_regex_patterns.py @@ -100,6 +100,12 @@ def test_should_identify_letters_and_numbers(value: str, expect: bool) -> None: assert isinstance(result, re.Match) is expect +def test_should_return_none_for_unknown_pattern() -> None: + """Test that get_pattern returns None for an unknown pattern name.""" + result = get_pattern("non_existent_pattern") + assert result is None + + @pytest.mark.parametrize( ("value", "expect"), [