diff --git a/flask_sieve/rules_processor.py b/flask_sieve/rules_processor.py
index 1fee1ba..a850531 100644
--- a/flask_sieve/rules_processor.py
+++ b/flask_sieve/rules_processor.py
@@ -547,7 +547,7 @@ class RulesProcessor:
             return True
         value = self._attribute_value(attribute)
         is_optional = self._has_rule(rules, 'sometimes')
-        if is_optional and value is not None:
+        if is_optional and value is None:
             return True
 
         attribute_conditional_rules = list(filter(lambda rule: rule['name'] in conditional_inclusion_rules, rules))
diff --git a/watch.sh b/watch.sh
index 340fb07..7c86b5b 100755
--- a/watch.sh
+++ b/watch.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
 
-watchman-make -p "**/*.py" --run "nosetests --with-coverage --cover-package flask_sieve"
+watchman-make -p "**/*.py" --run "rm .coverage; nosetests --with-coverage --cover-package flask_sieve"

diff --git a/tests/test_rules_processor.py b/tests/test_rules_processor.py
index 167145c..eeafd0f 100644
--- a/tests/test_rules_processor.py
+++ b/tests/test_rules_processor.py
@@ -935,6 +935,45 @@ class TestRulesProcessor(unittest.TestCase):
             request={}
         )
 
+    def test_validates_sometimes(self):
+        self.assert_passes(
+            rules={'number': ['sometimes', 'max:5']},
+            request={}
+        )
+        self.assert_passes(
+            rules={'number': ['sometimes', 'max:5']},
+            request={'number': 2}
+        )
+        self.assert_fails(
+            rules={'number': ['sometimes', 'max:5']},
+            request={'number': ''}
+        )
+        self.assert_fails(
+            rules={'number': ['sometimes', 'max:5']},
+            request={'number': 10}
+        )
+        self.assert_passes(
+            rules={
+                'zipCode': ['sometimes', 'numeric'],
+                'website': ['sometimes', 'url']
+            },
+            request={}
+        )
+        self.assert_passes(
+            rules={
+                'zipCode': ['sometimes', 'numeric'],
+                'website': ['sometimes', 'url']
+            },
+            request={'website': 'https://google.com'}
+        )
+        self.assert_fails(
+            rules={
+                'zipCode': ['sometimes', 'numeric'],
+                'website': ['sometimes', 'url']
+            },
+            request={'website': 'ogle.com'}
+        )
+
 
     def test_validates_uuid(self):
         self.assert_passes(
diff --git a/tests/test_validator.py b/tests/test_validator.py
index fecfe45..9079d9d 100644
--- a/tests/test_validator.py
+++ b/tests/test_validator.py
@@ -184,41 +184,6 @@ class TestValidator(unittest.TestCase):
                 params_count=0
             )
 
-    def test_sometimes_request(self):
-        self.set_validator_params(
-            rules={'number': ['sometimes', 'max:5']},
-            request={}
-        )
-        self.assertTrue(self._validator.passes())
-
-        self.set_validator_params(
-            rules={'number': ['sometimes', 'max:5']},
-            request={'number': ''}
-        )
-        self.assertTrue(self._validator.fails())
-        self.assertDictEqual({
-            'number': [
-                'The number could not be validated since it is empty.'
-            ]
-        }, self._validator.messages())
-
-        self.set_validator_params(
-            rules={'number': ['sometimes', 'max:5']},
-            request={'number': 2}
-        )
-        self.assertTrue(self._validator.passes())
-
-        self.set_validator_params(
-            rules={'number': ['sometimes', 'max:5']},
-            request={'number': 10}
-        )
-        self.assertTrue(self._validator.fails())
-        self.assertDictEqual({
-            'number': [
-                'The number may not be greater than 5.'
-            ]
-        }, self._validator.messages())
-
     def set_validator_params(self, rules=None, request=None):
         rules = rules or {}
         request = request or {}

sometimes not working
sometimes rule not working with other rules. 

'zipCode': ['sometimes', 'numeric'],
'website': ['sometimes', 'url']

if we leave blank any of the field, it ask for valid integer and valid url.
tests/test_rules_processor.py::TestRulesProcessor::test_validates_sometimes
tests/test_rules_processor.py::TestRulesProcessor::test_allows_nullable_fields tests/test_rules_processor.py::TestRulesProcessor::test_assert_params_size tests/test_rules_processor.py::TestRulesProcessor::test_compare_dates tests/test_rules_processor.py::TestRulesProcessor::test_custom_handlers tests/test_rules_processor.py::TestRulesProcessor::test_get_rule_handler tests/test_rules_processor.py::TestRulesProcessor::test_validates_accepted tests/test_rules_processor.py::TestRulesProcessor::test_validates_active_url tests/test_rules_processor.py::TestRulesProcessor::test_validates_after tests/test_rules_processor.py::TestRulesProcessor::test_validates_after_or_equal tests/test_rules_processor.py::TestRulesProcessor::test_validates_alpha tests/test_rules_processor.py::TestRulesProcessor::test_validates_alpha_dash tests/test_rules_processor.py::TestRulesProcessor::test_validates_alpha_num tests/test_rules_processor.py::TestRulesProcessor::test_validates_array tests/test_rules_processor.py::TestRulesProcessor::test_validates_before tests/test_rules_processor.py::TestRulesProcessor::test_validates_before_or_equal tests/test_rules_processor.py::TestRulesProcessor::test_validates_between tests/test_rules_processor.py::TestRulesProcessor::test_validates_boolean tests/test_rules_processor.py::TestRulesProcessor::test_validates_confirmed tests/test_rules_processor.py::TestRulesProcessor::test_validates_date tests/test_rules_processor.py::TestRulesProcessor::test_validates_date_equals tests/test_rules_processor.py::TestRulesProcessor::test_validates_different tests/test_rules_processor.py::TestRulesProcessor::test_validates_digits tests/test_rules_processor.py::TestRulesProcessor::test_validates_digits_between tests/test_rules_processor.py::TestRulesProcessor::test_validates_dimensions tests/test_rules_processor.py::TestRulesProcessor::test_validates_distinct tests/test_rules_processor.py::TestRulesProcessor::test_validates_email tests/test_rules_processor.py::TestRulesProcessor::test_validates_exists tests/test_rules_processor.py::TestRulesProcessor::test_validates_extension tests/test_rules_processor.py::TestRulesProcessor::test_validates_file tests/test_rules_processor.py::TestRulesProcessor::test_validates_filled tests/test_rules_processor.py::TestRulesProcessor::test_validates_gt tests/test_rules_processor.py::TestRulesProcessor::test_validates_gte tests/test_rules_processor.py::TestRulesProcessor::test_validates_image tests/test_rules_processor.py::TestRulesProcessor::test_validates_in tests/test_rules_processor.py::TestRulesProcessor::test_validates_in_array tests/test_rules_processor.py::TestRulesProcessor::test_validates_integer tests/test_rules_processor.py::TestRulesProcessor::test_validates_ip tests/test_rules_processor.py::TestRulesProcessor::test_validates_ipv4 tests/test_rules_processor.py::TestRulesProcessor::test_validates_ipv6 tests/test_rules_processor.py::TestRulesProcessor::test_validates_json tests/test_rules_processor.py::TestRulesProcessor::test_validates_lt tests/test_rules_processor.py::TestRulesProcessor::test_validates_lte tests/test_rules_processor.py::TestRulesProcessor::test_validates_max tests/test_rules_processor.py::TestRulesProcessor::test_validates_mime_types tests/test_rules_processor.py::TestRulesProcessor::test_validates_min tests/test_rules_processor.py::TestRulesProcessor::test_validates_not_in tests/test_rules_processor.py::TestRulesProcessor::test_validates_not_regex tests/test_rules_processor.py::TestRulesProcessor::test_validates_numeric tests/test_rules_processor.py::TestRulesProcessor::test_validates_present tests/test_rules_processor.py::TestRulesProcessor::test_validates_regex tests/test_rules_processor.py::TestRulesProcessor::test_validates_required tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_if tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_multiple_required_withouts tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_unless tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_with tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_with_all tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_without tests/test_rules_processor.py::TestRulesProcessor::test_validates_required_without_all tests/test_rules_processor.py::TestRulesProcessor::test_validates_same tests/test_rules_processor.py::TestRulesProcessor::test_validates_size tests/test_rules_processor.py::TestRulesProcessor::test_validates_starts_with tests/test_rules_processor.py::TestRulesProcessor::test_validates_string tests/test_rules_processor.py::TestRulesProcessor::test_validates_timezone tests/test_rules_processor.py::TestRulesProcessor::test_validates_unique tests/test_rules_processor.py::TestRulesProcessor::test_validates_url tests/test_rules_processor.py::TestRulesProcessor::test_validates_uuid tests/test_validator.py::TestValidator::test_cannot_set_custom_handler_without_validate_keyword tests/test_validator.py::TestValidator::test_handles_different_types_of_requests tests/test_validator.py::TestValidator::test_translates_validations tests/test_validator.py::TestValidator::test_translates_validations_set_through_custom_handlers tests/test_validator.py::TestValidator::test_translates_validations_with_all_params tests/test_validator.py::TestValidator::test_translates_validations_with_custom_handler tests/test_validator.py::TestValidator::test_translates_validations_with_custom_messages tests/test_validator.py::TestValidator::test_translates_validations_with_custom_messages_on_constructor tests/test_validator.py::TestValidator::test_translates_validations_with_param tests/test_validator.py::TestValidator::test_translates_validations_with_rest_params tests/test_validator.py::TestValidator::test_validate_decorator