From 2245b42f04e0a622399e68df7edac3cf2d777f22 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Wed, 21 Feb 2024 19:56:58 +0200 Subject: [PATCH 01/10] GF101 --- .../validate/tests/GF_validators_test.py | 32 +++++++++++++ .../GF101_generic_field_id_prefix_validate.py | 46 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 demisto_sdk/commands/validate/tests/GF_validators_test.py create mode 100644 demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py new file mode 100644 index 00000000000..bd0692e5957 --- /dev/null +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -0,0 +1,32 @@ +import pytest + +from demisto_sdk.commands.validate.validators.GF_validators.GF101_generic_field_id_prefix_validate import ( + GenericFieldIdPrefixValidateValidator, +) + + +@pytest.mark.parametrize( + "content_items, expected_number_of_failures, expected_msgs", + [ + ( + [], + 1, + ["", ""] + ) + ] +) +def test_GenericFieldIdPrefixValidateValidator_is_valid( + content_items, + expected_number_of_failures: int, + expected_msgs: list[str] +): + results = GenericFieldIdPrefixValidateValidator().is_valid(content_items) + assert len(results) == expected_number_of_failures + assert all( + result == expected_msg + for result, expected_msg in zip(results, expected_msgs) + ) + + +def test_GenericFieldIdPrefixValidateValidator_fix(): + ... \ No newline at end of file diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py new file mode 100644 index 00000000000..8db1c10d6d2 --- /dev/null +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from typing import Iterable, List + +from demisto_sdk.commands.common.constants import RelatedFileType +from demisto_sdk.commands.content_graph.objects.generic_field import GenericField +from demisto_sdk.commands.validate.validators.base_validator import ( + BaseValidator, + FixResult, + ValidationResult, +) + +GENERIC_FIELD_ID_PREFIX = "generic_" +ContentTypes = GenericField + + +class GenericFieldIdPrefixValidateValidator(BaseValidator[ContentTypes]): + error_code = "GF101" + description = "Validate the id field include prefix `generic_`" + error_message = "ID {generic_id} is not a valid generic field ID - it should start with the prefix {generic_id_prefix}." + fix_message = "" + related_field = "id" + is_auto_fixable = True + related_file_type = [RelatedFileType.JSON] + + def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResult]: + return [ + ValidationResult( + validator=self, + message=self.error_message.format( + generic_id=content_item.object_id, + generic_id_prefix=GENERIC_FIELD_ID_PREFIX, + ), + content_object=content_item, + ) + for content_item in content_items + if (not content_item.object_id.startswith(GENERIC_FIELD_ID_PREFIX)) + ] + + def fix(self, content_item: ContentTypes) -> FixResult: + content_item.object_id = GENERIC_FIELD_ID_PREFIX + content_item.object_id + return FixResult( + validator=self, + message=self.fix_message.format(content_item), + content_object=content_item, + ) From 36f8d6651b718271eb873c0d0c54bf5f0b08a082 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Thu, 22 Feb 2024 09:25:13 +0200 Subject: [PATCH 02/10] refactor GF100 validate --- .../GF100_generic_field_group.py | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py new file mode 100644 index 00000000000..86530c9e76e --- /dev/null +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from typing import Iterable, List + +from demisto_sdk.commands.common.constants import RelatedFileType +from demisto_sdk.commands.content_graph.objects.generic_field import GenericField +from demisto_sdk.commands.validate.validators.base_validator import ( + BaseValidator, + FixResult, + ValidationResult, +) + +GENERIC_FIELD_GROUP = 4 +ContentTypes = GenericField + + +class GenericFieldGroupValidator(BaseValidator[ContentTypes]): + error_code = "GF100" + description = "" + error_message = "Group {group} is not a valid generic field group. Please set group = {generic_field_group} instead." + fix_message = "" + related_field = "group" + is_auto_fixable = True + related_file_type = [RelatedFileType.JSON] + + def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResult]: + return [ + ValidationResult( + validator=self, + message=self.error_message.format( + group=group, + generic_field_group=GENERIC_FIELD_GROUP, + ), + content_object=content_item, + ) + for content_item in content_items + if ((group := content_item.data.get("group")) != GENERIC_FIELD_GROUP) + ] + + def fix(self, content_item: ContentTypes) -> FixResult: + # Add your fix right here + pass From 225732bb69ebe3599225b67f58fb73d9c6749961 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Tue, 27 Feb 2024 02:39:51 +0200 Subject: [PATCH 03/10] GF_refactor --- .../validate/tests/GF_validators_test.py | 27 ++++++++++--------- .../GF101_generic_field_id_prefix_validate.py | 4 +-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index bd0692e5957..97996151cc9 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -1,32 +1,35 @@ import pytest +from demisto_sdk.commands.validate.tests.test_tools import create_generic_field_object from demisto_sdk.commands.validate.validators.GF_validators.GF101_generic_field_id_prefix_validate import ( GenericFieldIdPrefixValidateValidator, ) @pytest.mark.parametrize( - "content_items, expected_number_of_failures, expected_msgs", + "content_items, expected_number_of_failures, expected_msg", [ ( - [], + [ + create_generic_field_object(paths=["id"], values=["test"]), + create_generic_field_object(paths=["id"], values=["generic_test"]), + ], 1, - ["", ""] + "ID test is not a valid generic field ID - it should start with the prefix generic_.", ) - ] + ], ) def test_GenericFieldIdPrefixValidateValidator_is_valid( - content_items, - expected_number_of_failures: int, - expected_msgs: list[str] + content_items, expected_number_of_failures: int, expected_msg: str ): results = GenericFieldIdPrefixValidateValidator().is_valid(content_items) assert len(results) == expected_number_of_failures - assert all( - result == expected_msg - for result, expected_msg in zip(results, expected_msgs) - ) + assert all(result.message == expected_msg for result in results) def test_GenericFieldIdPrefixValidateValidator_fix(): - ... \ No newline at end of file + generic_field = create_generic_field_object(paths=["id"], values=["test"]) + + result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore + assert result + assert result.message == "Change the value of `id` field to generic_test." diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py index 8db1c10d6d2..a3f621ab64c 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py @@ -18,7 +18,7 @@ class GenericFieldIdPrefixValidateValidator(BaseValidator[ContentTypes]): error_code = "GF101" description = "Validate the id field include prefix `generic_`" error_message = "ID {generic_id} is not a valid generic field ID - it should start with the prefix {generic_id_prefix}." - fix_message = "" + fix_message = "Change the value of `id` field to {generic_id}." related_field = "id" is_auto_fixable = True related_file_type = [RelatedFileType.JSON] @@ -41,6 +41,6 @@ def fix(self, content_item: ContentTypes) -> FixResult: content_item.object_id = GENERIC_FIELD_ID_PREFIX + content_item.object_id return FixResult( validator=self, - message=self.fix_message.format(content_item), + message=self.fix_message.format(generic_id=content_item.object_id), content_object=content_item, ) From b2fc823eb33adf1398cb3c29f8e140d808f8f643 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Wed, 20 Mar 2024 18:08:52 +0200 Subject: [PATCH 04/10] commit --- .../validate/tests/GF_validators_test.py | 32 ++++++------------- .../commands/validate/tests/test_tools.py | 5 +-- .../GF100_generic_field_group.py | 2 -- .../GF101_generic_field_id_prefix_validate.py | 9 +++--- 4 files changed, 17 insertions(+), 31 deletions(-) diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 97996151cc9..34b5a22b561 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -6,30 +6,18 @@ ) -@pytest.mark.parametrize( - "content_items, expected_number_of_failures, expected_msg", - [ - ( - [ - create_generic_field_object(paths=["id"], values=["test"]), - create_generic_field_object(paths=["id"], values=["generic_test"]), - ], - 1, - "ID test is not a valid generic field ID - it should start with the prefix generic_.", - ) - ], -) -def test_GenericFieldIdPrefixValidateValidator_is_valid( - content_items, expected_number_of_failures: int, expected_msg: str -): - results = GenericFieldIdPrefixValidateValidator().is_valid(content_items) - assert len(results) == expected_number_of_failures - assert all(result.message == expected_msg for result in results) +def test_GenericFieldIdPrefixValidateValidator_is_valid(): + content_item = create_generic_field_object(paths=["id"], values=["foo"]) + results = GenericFieldIdPrefixValidateValidator().is_valid([content_item]) + assert ( + results[0].message + == "ID `foo` is not valid, it should start with the prefix `generic_`." + ) def test_GenericFieldIdPrefixValidateValidator_fix(): - generic_field = create_generic_field_object(paths=["id"], values=["test"]) - + generic_field = create_generic_field_object(paths=["id"], values=["foo"]) + result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore assert result - assert result.message == "Change the value of `id` field to generic_test." + assert result.message == "Change the value of `id` field to `generic_foo`." diff --git a/demisto_sdk/commands/validate/tests/test_tools.py b/demisto_sdk/commands/validate/tests/test_tools.py index 5194bc0983d..d30c4dc84d2 100644 --- a/demisto_sdk/commands/validate/tests/test_tools.py +++ b/demisto_sdk/commands/validate/tests/test_tools.py @@ -9,6 +9,7 @@ from demisto_sdk.commands.common.handlers import DEFAULT_JSON_HANDLER as json from demisto_sdk.commands.common.tools import set_value from demisto_sdk.commands.content_graph.objects.base_content import BaseContent +from demisto_sdk.commands.content_graph.objects.generic_field import GenericField from demisto_sdk.commands.content_graph.objects.incident_field import IncidentField from demisto_sdk.commands.content_graph.objects.integration import Integration from demisto_sdk.commands.content_graph.objects.pack import Pack @@ -590,7 +591,7 @@ def create_generic_definition_object( def create_generic_field_object( paths: Optional[List[str]] = None, values: Optional[List[Any]] = None -): +) -> GenericField: """Creating an generic_field object with altered fields from a default generic_field json structure. Args: @@ -604,7 +605,7 @@ def create_generic_field_object( update_keys(json_content, paths, values) pack = REPO.create_pack() pack.create_generic_field(name="generic_field", content=json_content) - return BaseContent.from_path(Path(pack.generic_fields[0].path)) + return cast(GenericField, BaseContent.from_path(Path(pack.generic_fields[0].path))) def create_generic_type_object( diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py index 86530c9e76e..afa2532a798 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py @@ -2,7 +2,6 @@ from typing import Iterable, List -from demisto_sdk.commands.common.constants import RelatedFileType from demisto_sdk.commands.content_graph.objects.generic_field import GenericField from demisto_sdk.commands.validate.validators.base_validator import ( BaseValidator, @@ -21,7 +20,6 @@ class GenericFieldGroupValidator(BaseValidator[ContentTypes]): fix_message = "" related_field = "group" is_auto_fixable = True - related_file_type = [RelatedFileType.JSON] def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResult]: return [ diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py index a3f621ab64c..631a2bb2faf 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py @@ -2,7 +2,6 @@ from typing import Iterable, List -from demisto_sdk.commands.common.constants import RelatedFileType from demisto_sdk.commands.content_graph.objects.generic_field import GenericField from demisto_sdk.commands.validate.validators.base_validator import ( BaseValidator, @@ -16,12 +15,12 @@ class GenericFieldIdPrefixValidateValidator(BaseValidator[ContentTypes]): error_code = "GF101" - description = "Validate the id field include prefix `generic_`" - error_message = "ID {generic_id} is not a valid generic field ID - it should start with the prefix {generic_id_prefix}." - fix_message = "Change the value of `id` field to {generic_id}." + rationale = "Required by the platform." + description = "Checks if `id` field include prefix `generic_`" + error_message = "ID `{generic_id}` is not valid, it should start with the prefix `{generic_id_prefix}`." + fix_message = "Change the value of `id` field to `{generic_id}`." related_field = "id" is_auto_fixable = True - related_file_type = [RelatedFileType.JSON] def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResult]: return [ From 17ef1f86ee3fc582dca2132fef2bf5a6b65f1e7f Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Wed, 20 Mar 2024 18:35:13 +0200 Subject: [PATCH 05/10] commit --- .../content_graph/objects/generic_field.py | 1 + .../content_graph/parsers/generic_field.py | 2 +- .../validate/tests/GF_validators_test.py | 59 ++++++++++++++++++- .../GF100_generic_field_group.py | 24 ++++---- 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/demisto_sdk/commands/content_graph/objects/generic_field.py b/demisto_sdk/commands/content_graph/objects/generic_field.py index dbb12b8ffd1..affada7a1fc 100644 --- a/demisto_sdk/commands/content_graph/objects/generic_field.py +++ b/demisto_sdk/commands/content_graph/objects/generic_field.py @@ -12,6 +12,7 @@ class GenericField(ContentItem, content_type=ContentType.GENERIC_FIELD): # type definition_id: Optional[str] = Field(alias="definitionId") field_type: Optional[str] = Field(alias="type") version: Optional[int] = 0 + group: int = Field(None, exclude=True) def metadata_fields(self) -> Set[str]: return super().metadata_fields().union({"field_type"}) diff --git a/demisto_sdk/commands/content_graph/parsers/generic_field.py b/demisto_sdk/commands/content_graph/parsers/generic_field.py index 66f0a92dac5..cc99fa99e84 100644 --- a/demisto_sdk/commands/content_graph/parsers/generic_field.py +++ b/demisto_sdk/commands/content_graph/parsers/generic_field.py @@ -18,7 +18,7 @@ def __init__( super().__init__(path, pack_marketplaces, git_sha=git_sha) self.definition_id = self.json_data.get("definitionId") self.field_type = self.json_data.get("type") or "" - + self.group = self.json_data.get("group") self.connect_to_dependencies() @property diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 34b5a22b561..6bcbc823a8c 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -1,14 +1,27 @@ import pytest from demisto_sdk.commands.validate.tests.test_tools import create_generic_field_object +from demisto_sdk.commands.validate.validators.GF_validators.GF100_generic_field_group import ( + REQUIRED_GROUP_VALUE, + GenericFieldGroupValidator, +) from demisto_sdk.commands.validate.validators.GF_validators.GF101_generic_field_id_prefix_validate import ( GenericFieldIdPrefixValidateValidator, ) -def test_GenericFieldIdPrefixValidateValidator_is_valid(): - content_item = create_generic_field_object(paths=["id"], values=["foo"]) - results = GenericFieldIdPrefixValidateValidator().is_valid([content_item]) +def test_GenericFieldIdPrefixValidateValidator_not_valid(): + """ + Given: + - GenericField content items + When: + - run is_valid method + Then: + - Ensure that the ValidationResult returned + for the GenericField whose 'id' without `generic_` prefix + """ + generic_field = create_generic_field_object(paths=["id"], values=["foo"]) + results = GenericFieldIdPrefixValidateValidator().is_valid([generic_field]) assert ( results[0].message == "ID `foo` is not valid, it should start with the prefix `generic_`." @@ -16,8 +29,48 @@ def test_GenericFieldIdPrefixValidateValidator_is_valid(): def test_GenericFieldIdPrefixValidateValidator_fix(): + """ + Given: + - invalid GenericField that 'id' without `generic_` prefix + When: + - run fix method + Then: + - Ensure the fix message as expected + - Ensure the field `id` changing to with `generic_` prefix + """ + generic_field = create_generic_field_object(paths=["id"], values=["foo"]) result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore assert result assert result.message == "Change the value of `id` field to `generic_foo`." + + +def test_GenericFieldGroupValidator_not_valid(): + """ + Given: + - GenericField content items + When: + - run is_valid method + Then: + - Ensure that the ValidationResult returned + for the GenericField whose 'group' field is not valid + """ + generic_field = create_generic_field_object(paths=["group"], values=["0"]) + assert GenericFieldGroupValidator().is_valid([generic_field]) + + +def test_GenericFieldGroupValidator_fix(): + """ + Given: + - invalid GenericField that 'group' field is not 4 + When: + - run fix method + Then: + - Ensure the fix message as expected + - Ensure the field `group` is set to 4 + """ + generic_field = create_generic_field_object(paths=["group"], values=["0"]) + result = GenericFieldGroupValidator().fix(generic_field) + assert result.message == f"`group` field is set to {REQUIRED_GROUP_VALUE}." + assert generic_field.group == REQUIRED_GROUP_VALUE diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py index afa2532a798..7e37e9cc134 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py @@ -9,15 +9,16 @@ ValidationResult, ) -GENERIC_FIELD_GROUP = 4 +REQUIRED_GROUP_VALUE = 4 ContentTypes = GenericField class GenericFieldGroupValidator(BaseValidator[ContentTypes]): error_code = "GF100" - description = "" - error_message = "Group {group} is not a valid generic field group. Please set group = {generic_field_group} instead." - fix_message = "" + rationale = "Required by the platform." + description = f"Checks if group field is set to {REQUIRED_GROUP_VALUE}." + error_message = "The `group` key must be set to 4 for Generic Field" + fix_message = f"`group` field is set to {REQUIRED_GROUP_VALUE}." related_field = "group" is_auto_fixable = True @@ -25,16 +26,17 @@ def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResu return [ ValidationResult( validator=self, - message=self.error_message.format( - group=group, - generic_field_group=GENERIC_FIELD_GROUP, - ), + message=self.error_message, content_object=content_item, ) for content_item in content_items - if ((group := content_item.data.get("group")) != GENERIC_FIELD_GROUP) + if (content_item.group != REQUIRED_GROUP_VALUE) ] def fix(self, content_item: ContentTypes) -> FixResult: - # Add your fix right here - pass + content_item.group = REQUIRED_GROUP_VALUE + return FixResult( + validator=self, + message=self.fix_message, + content_object=content_item, + ) From 646512d35506ffe31d8b12e216d1a15a1efc4082 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Thu, 21 Mar 2024 14:14:15 +0200 Subject: [PATCH 06/10] commit --- .../validate/tests/GF_validators_test.py | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 6bcbc823a8c..0137eec689d 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -28,36 +28,31 @@ def test_GenericFieldIdPrefixValidateValidator_not_valid(): ) -def test_GenericFieldIdPrefixValidateValidator_fix(): +def test_GenericFieldGroupValidator_not_valid(): """ Given: - - invalid GenericField that 'id' without `generic_` prefix + - GenericField content items When: - - run fix method + - run is_valid method Then: - - Ensure the fix message as expected - - Ensure the field `id` changing to with `generic_` prefix + - Ensure that the ValidationResult returned + for the GenericField whose 'group' field is not valid """ - - generic_field = create_generic_field_object(paths=["id"], values=["foo"]) - - result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore - assert result - assert result.message == "Change the value of `id` field to `generic_foo`." + generic_field = create_generic_field_object(paths=["group"], values=[0]) + assert GenericFieldGroupValidator().is_valid([generic_field]) -def test_GenericFieldGroupValidator_not_valid(): +def test_GenericFieldGroupValidator_valid(): """ Given: - - GenericField content items + - GenericField content items with a group value `4` (valid) When: - run is_valid method Then: - - Ensure that the ValidationResult returned - for the GenericField whose 'group' field is not valid + - Ensure that no ValidationResult returned """ - generic_field = create_generic_field_object(paths=["group"], values=["0"]) - assert GenericFieldGroupValidator().is_valid([generic_field]) + generic_field = create_generic_field_object(paths=["group"], values=[4]) + assert not GenericFieldGroupValidator().is_valid([generic_field]) def test_GenericFieldGroupValidator_fix(): @@ -74,3 +69,22 @@ def test_GenericFieldGroupValidator_fix(): result = GenericFieldGroupValidator().fix(generic_field) assert result.message == f"`group` field is set to {REQUIRED_GROUP_VALUE}." assert generic_field.group == REQUIRED_GROUP_VALUE + + +def test_GenericFieldIdPrefixValidateValidator_fix(): + """ + Given: + - invalid GenericField that 'id' without `generic_` prefix + When: + - run fix method + Then: + - Ensure the fix message as expected + - Ensure the field `id` changing to with `generic_` prefix + """ + + generic_field = create_generic_field_object(paths=["id"], values=["foo"]) + + result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore + assert result + assert result.message == "Change the value of `id` field to `generic_foo`." + From 1a060bce71b7b1c19a596fdb3fb5be0f717025e8 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Thu, 21 Mar 2024 16:26:29 +0200 Subject: [PATCH 07/10] order UT --- .../validate/tests/GF_validators_test.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 0137eec689d..0a02a40006a 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -10,7 +10,7 @@ ) -def test_GenericFieldIdPrefixValidateValidator_not_valid(): +def test_GenericFieldIdPrefixValidateValidator_is_valid(): """ Given: - GenericField content items @@ -19,16 +19,24 @@ def test_GenericFieldIdPrefixValidateValidator_not_valid(): Then: - Ensure that the ValidationResult returned for the GenericField whose 'id' without `generic_` prefix + - Ensure that no ValidationResult returned + when `id` field with `generic_` prefix """ generic_field = create_generic_field_object(paths=["id"], values=["foo"]) + + # not valid results = GenericFieldIdPrefixValidateValidator().is_valid([generic_field]) assert ( results[0].message == "ID `foo` is not valid, it should start with the prefix `generic_`." ) + # valid + generic_field.object_id = "generic_foo" + assert not GenericFieldIdPrefixValidateValidator().is_valid([generic_field]) + -def test_GenericFieldGroupValidator_not_valid(): +def test_GenericFieldGroupValidator_is_valid(): """ Given: - GenericField content items @@ -37,21 +45,14 @@ def test_GenericFieldGroupValidator_not_valid(): Then: - Ensure that the ValidationResult returned for the GenericField whose 'group' field is not valid + - Ensure that no ValidationResult returned when group field set to 4 """ + # not valid generic_field = create_generic_field_object(paths=["group"], values=[0]) assert GenericFieldGroupValidator().is_valid([generic_field]) - -def test_GenericFieldGroupValidator_valid(): - """ - Given: - - GenericField content items with a group value `4` (valid) - When: - - run is_valid method - Then: - - Ensure that no ValidationResult returned - """ - generic_field = create_generic_field_object(paths=["group"], values=[4]) + # valid + generic_field.group = 4 assert not GenericFieldGroupValidator().is_valid([generic_field]) @@ -87,4 +88,3 @@ def test_GenericFieldIdPrefixValidateValidator_fix(): result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore assert result assert result.message == "Change the value of `id` field to `generic_foo`." - From c694f087084f6c306b37f7abf4a388a5a5fce265 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Thu, 21 Mar 2024 17:17:19 +0200 Subject: [PATCH 08/10] comment correction --- .../content_graph/parsers/generic_field.py | 11 ++++++++- .../validate/tests/GF_validators_test.py | 24 +++---------------- .../GF100_generic_field_group.py | 4 ++-- .../GF101_generic_field_id_prefix_validate.py | 14 ++--------- 4 files changed, 17 insertions(+), 36 deletions(-) diff --git a/demisto_sdk/commands/content_graph/parsers/generic_field.py b/demisto_sdk/commands/content_graph/parsers/generic_field.py index cc99fa99e84..c6366c6107f 100644 --- a/demisto_sdk/commands/content_graph/parsers/generic_field.py +++ b/demisto_sdk/commands/content_graph/parsers/generic_field.py @@ -1,3 +1,4 @@ +from functools import cached_property from pathlib import Path from typing import List, Optional, Set @@ -18,9 +19,13 @@ def __init__( super().__init__(path, pack_marketplaces, git_sha=git_sha) self.definition_id = self.json_data.get("definitionId") self.field_type = self.json_data.get("type") or "" - self.group = self.json_data.get("group") self.connect_to_dependencies() + @cached_property + def field_mapping(self): + super().field_mapping.update({"group": "group"}) + return super().field_mapping + @property def supported_marketplaces(self) -> Set[MarketplaceVersions]: return { @@ -29,6 +34,10 @@ def supported_marketplaces(self) -> Set[MarketplaceVersions]: MarketplaceVersions.XSOAR_ON_PREM, } + @property + def group(self) -> Optional[int]: + return self.json_data.get("group") + def connect_to_dependencies(self) -> None: """Collects the generic types associated to the generic field as optional dependencies.""" for associated_type in set(self.json_data.get("associatedTypes") or []): diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 0a02a40006a..7c4a967cef9 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -28,7 +28,7 @@ def test_GenericFieldIdPrefixValidateValidator_is_valid(): results = GenericFieldIdPrefixValidateValidator().is_valid([generic_field]) assert ( results[0].message - == "ID `foo` is not valid, it should start with the prefix `generic_`." + == "foo is not a valid id, it should start with generic_." ) # valid @@ -52,7 +52,7 @@ def test_GenericFieldGroupValidator_is_valid(): assert GenericFieldGroupValidator().is_valid([generic_field]) # valid - generic_field.group = 4 + generic_field.group = REQUIRED_GROUP_VALUE assert not GenericFieldGroupValidator().is_valid([generic_field]) @@ -68,23 +68,5 @@ def test_GenericFieldGroupValidator_fix(): """ generic_field = create_generic_field_object(paths=["group"], values=["0"]) result = GenericFieldGroupValidator().fix(generic_field) - assert result.message == f"`group` field is set to {REQUIRED_GROUP_VALUE}." + assert result.message == f"set the `group` field to {REQUIRED_GROUP_VALUE}." assert generic_field.group == REQUIRED_GROUP_VALUE - - -def test_GenericFieldIdPrefixValidateValidator_fix(): - """ - Given: - - invalid GenericField that 'id' without `generic_` prefix - When: - - run fix method - Then: - - Ensure the fix message as expected - - Ensure the field `id` changing to with `generic_` prefix - """ - - generic_field = create_generic_field_object(paths=["id"], values=["foo"]) - - result = GenericFieldIdPrefixValidateValidator().fix(generic_field) # type:ignore - assert result - assert result.message == "Change the value of `id` field to `generic_foo`." diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py index 7e37e9cc134..3abc7c5fefb 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF100_generic_field_group.py @@ -17,8 +17,8 @@ class GenericFieldGroupValidator(BaseValidator[ContentTypes]): error_code = "GF100" rationale = "Required by the platform." description = f"Checks if group field is set to {REQUIRED_GROUP_VALUE}." - error_message = "The `group` key must be set to 4 for Generic Field" - fix_message = f"`group` field is set to {REQUIRED_GROUP_VALUE}." + error_message = f"The `group` key must be set to {REQUIRED_GROUP_VALUE}" + fix_message = f"set the `group` field to {REQUIRED_GROUP_VALUE}." related_field = "group" is_auto_fixable = True diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py index 631a2bb2faf..5d79706e024 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py @@ -16,11 +16,9 @@ class GenericFieldIdPrefixValidateValidator(BaseValidator[ContentTypes]): error_code = "GF101" rationale = "Required by the platform." - description = "Checks if `id` field include prefix `generic_`" - error_message = "ID `{generic_id}` is not valid, it should start with the prefix `{generic_id_prefix}`." - fix_message = "Change the value of `id` field to `{generic_id}`." + description = "Checks if the id starts with `generic_`." + error_message = "{generic_id} is not a valid id, it should start with {generic_id_prefix}." related_field = "id" - is_auto_fixable = True def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResult]: return [ @@ -35,11 +33,3 @@ def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResu for content_item in content_items if (not content_item.object_id.startswith(GENERIC_FIELD_ID_PREFIX)) ] - - def fix(self, content_item: ContentTypes) -> FixResult: - content_item.object_id = GENERIC_FIELD_ID_PREFIX + content_item.object_id - return FixResult( - validator=self, - message=self.fix_message.format(generic_id=content_item.object_id), - content_object=content_item, - ) From 6a80fcd8ee64f53339ef941cfdda80b27a576a2d Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Thu, 21 Mar 2024 17:20:34 +0200 Subject: [PATCH 09/10] pre commit --- demisto_sdk/commands/validate/tests/GF_validators_test.py | 5 +---- .../GF_validators/GF101_generic_field_id_prefix_validate.py | 4 +++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 7c4a967cef9..9efcb7bff97 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -26,10 +26,7 @@ def test_GenericFieldIdPrefixValidateValidator_is_valid(): # not valid results = GenericFieldIdPrefixValidateValidator().is_valid([generic_field]) - assert ( - results[0].message - == "foo is not a valid id, it should start with generic_." - ) + assert results[0].message == "foo is not a valid id, it should start with generic_." # valid generic_field.object_id = "generic_foo" diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py index 5d79706e024..c2e48953ff9 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py @@ -17,7 +17,9 @@ class GenericFieldIdPrefixValidateValidator(BaseValidator[ContentTypes]): error_code = "GF101" rationale = "Required by the platform." description = "Checks if the id starts with `generic_`." - error_message = "{generic_id} is not a valid id, it should start with {generic_id_prefix}." + error_message = ( + "{generic_id} is not a valid id, it should start with {generic_id_prefix}." + ) related_field = "id" def is_valid(self, content_items: Iterable[ContentTypes]) -> List[ValidationResult]: From 2ee2139ba7480e96a8b904824c81bd1605bc28c6 Mon Sep 17 00:00:00 2001 From: israelpolishook Date: Thu, 21 Mar 2024 17:40:10 +0200 Subject: [PATCH 10/10] pre commit --- demisto_sdk/commands/validate/tests/GF_validators_test.py | 2 -- .../GF_validators/GF101_generic_field_id_prefix_validate.py | 1 - 2 files changed, 3 deletions(-) diff --git a/demisto_sdk/commands/validate/tests/GF_validators_test.py b/demisto_sdk/commands/validate/tests/GF_validators_test.py index 9efcb7bff97..9eb83fb0300 100644 --- a/demisto_sdk/commands/validate/tests/GF_validators_test.py +++ b/demisto_sdk/commands/validate/tests/GF_validators_test.py @@ -1,5 +1,3 @@ -import pytest - from demisto_sdk.commands.validate.tests.test_tools import create_generic_field_object from demisto_sdk.commands.validate.validators.GF_validators.GF100_generic_field_group import ( REQUIRED_GROUP_VALUE, diff --git a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py index c2e48953ff9..42d511ddf9b 100644 --- a/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py +++ b/demisto_sdk/commands/validate/validators/GF_validators/GF101_generic_field_id_prefix_validate.py @@ -5,7 +5,6 @@ from demisto_sdk.commands.content_graph.objects.generic_field import GenericField from demisto_sdk.commands.validate.validators.base_validator import ( BaseValidator, - FixResult, ValidationResult, )