Skip to content

Commit 59d491f

Browse files
feat: [SNOW-2026174] make project's manifest.yml required (#2178)
* feat: [SNOW-2026174] make project's manifest.yml required * fix: [SNOW-2026174] remove unnecessary error handling
1 parent ca7ac66 commit 59d491f

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

src/snowflake/cli/_plugins/project/project_entity_model.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,45 @@
1313
# limitations under the License.
1414
from __future__ import annotations
1515

16-
from typing import Literal, Optional, TypeVar
16+
from typing import List, Literal, Optional, TypeVar
1717

18-
from pydantic import Field
18+
from pydantic import Field, field_validator
19+
from snowflake.cli.api.cli_global_context import get_cli_context
1920
from snowflake.cli.api.entities.common import EntityBase, attach_spans_to_entity_actions
21+
from snowflake.cli.api.exceptions import CliError
2022
from snowflake.cli.api.project.schemas.entities.common import (
23+
Artifacts,
2124
EntityModelBaseWithArtifacts,
25+
PathMapping,
2226
)
2327
from snowflake.cli.api.project.schemas.updatable_model import (
2428
DiscriminatorField,
2529
)
30+
from snowflake.cli.api.secure_path import SecurePath
2631

2732
T = TypeVar("T")
2833

2934

35+
MANIFEST_FILE_NAME = "manifest.yml"
36+
37+
3038
class ProjectEntityModel(EntityModelBaseWithArtifacts):
3139
type: Literal["project"] = DiscriminatorField() # noqa: A003
3240
stage: Optional[str] = Field(
3341
title="Stage in which the project artifacts will be stored", default=None
3442
)
35-
main_file: Optional[str] = Field(title="Path to the main file of the project")
43+
44+
@field_validator("artifacts")
45+
@classmethod
46+
def transform_artifacts(cls, orig_artifacts: Artifacts) -> List[PathMapping]:
47+
if not (
48+
SecurePath(get_cli_context().project_root) / MANIFEST_FILE_NAME
49+
).exists():
50+
raise CliError(
51+
f"{MANIFEST_FILE_NAME} was not found in project root directory"
52+
)
53+
orig_artifacts.append(PathMapping(src=MANIFEST_FILE_NAME))
54+
return super().transform_artifacts(orig_artifacts)
3655

3756

3857
@attach_spans_to_entity_actions(entity_name="project")
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pytest
2+
from click import ClickException
3+
from snowflake.cli._plugins.project.project_entity_model import MANIFEST_FILE_NAME
4+
from snowflake.cli.api.cli_global_context import get_cli_context
5+
from snowflake.cli.api.commands.utils import get_entity_for_operation
6+
7+
8+
def test_project_entity_raises_when_manifest_file_does_not_exist(project_directory):
9+
with project_directory("dcm_project") as project_root:
10+
(project_root / MANIFEST_FILE_NAME).unlink()
11+
with pytest.raises(ClickException) as err:
12+
cli_context = get_cli_context()
13+
get_entity_for_operation(
14+
cli_context=cli_context,
15+
entity_id="my_project",
16+
project_definition=cli_context.project_definition,
17+
entity_type="project",
18+
)
19+
assert f"{MANIFEST_FILE_NAME} was not found in project root directory" == str(
20+
err.value
21+
)

tests/test_data/projects/dcm_project/snowflake.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,5 @@ entities:
44
type: project
55
identifier: "my_project"
66
stage: "my_project_stage"
7-
main_file: manifest.yml
87
artifacts:
98
- definitions/
10-
- manifest.yml

tests_integration/test_data/projects/dcm_project/snowflake.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,5 @@ entities:
33
my_project:
44
type: project
55
stage: "my_project_stage"
6-
main_file: manifest.yml
76
artifacts:
87
- file_a.sql
9-
- manifest.yml

0 commit comments

Comments
 (0)