Skip to content

Commit

Permalink
Moved Snowpark and Streamlit artifacts to separate directory in outpu…
Browse files Browse the repository at this point in the history
…t/deploy
  • Loading branch information
sfc-gh-astus committed Dec 2, 2024
1 parent c20fb7c commit 6b61c7f
Show file tree
Hide file tree
Showing 11 changed files with 137 additions and 93 deletions.
6 changes: 3 additions & 3 deletions src/snowflake/cli/_plugins/snowpark/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,19 +220,19 @@ def build_artifacts_mappings(
) -> Tuple[EntityToImportPathsMapping, StageToArtefactMapping]:
stages_to_artifact_map: StageToArtefactMapping = defaultdict(set)
entities_to_imports_map: EntityToImportPathsMapping = defaultdict(set)
for entity_id, entity in snowpark_entities.items():
for name, entity in snowpark_entities.items():
stage = entity.stage
required_artifacts = set()
for artefact in entity.artifacts:
artefact_dto = project_paths.get_artefact_dto(artefact)
required_artifacts.add(artefact_dto)
entities_to_imports_map[entity_id].add(artefact_dto.import_path(stage))
entities_to_imports_map[name].add(artefact_dto.import_path(stage))
stages_to_artifact_map[stage].update(required_artifacts)

deps_artefact = project_paths.get_dependencies_artefact()
if deps_artefact.post_build_path.exists():
stages_to_artifact_map[stage].add(deps_artefact)
entities_to_imports_map[entity_id].add(deps_artefact.import_path(stage))
entities_to_imports_map[name].add(deps_artefact.import_path(stage))
return entities_to_imports_map, stages_to_artifact_map


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ def snowflake_requirements(self) -> SecurePath:
def requirements(self) -> SecurePath:
return SecurePath(self.path_relative_to_root(Path("requirements.txt")))

@property
def deploy_root(self) -> Path:
return self.project_root / "output" / "deploy" / "snowpark"


@dataclass(unsafe_hash=True)
class Artefact:
Expand Down Expand Up @@ -154,7 +158,7 @@ def import_path(self, stage: FQN | str | None) -> str:
return self.upload_path(stage) + self._artefact_name

def deploy_root(self) -> Path:
return self.project_root / "output"
return self.project_root / "output" / "deploy" / "snowpark"

def _is_dest_a_file(self) -> bool:
if not self.dest:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path

from snowflake.cli.api.project.project_paths import ProjectPaths

Expand All @@ -23,3 +24,7 @@ class StreamlitProjectPaths(ProjectPaths):
"""
This class allows you to manage files paths related to given project.
"""

@property
def deploy_root(self) -> Path:
return self.project_root / "output" / "deploy" / "streamlit"
2 changes: 1 addition & 1 deletion src/snowflake/cli/api/project/project_paths.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class ProjectPaths:

@property
def deploy_root(self) -> Path:
return self.project_root / "output"
return self.project_root / "output" / "deploy"

def remove_up_deploy_root(self) -> None:
if self.deploy_root.exists():
Expand Down
42 changes: 22 additions & 20 deletions tests/snowpark/test_artifacts.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,42 +12,44 @@
lambda _: True,
)

deploy_root = Path("output") / "deploy" / "snowpark"


@pytest.mark.parametrize(
"artifacts, local_path, stage_path",
[
("src", Path("output") / "src.zip", "/"),
("src/", Path("output") / "src.zip", "/"),
("src/*", Path("output") / "src.zip", "/"),
("src/*.py", Path("output") / "src.zip", "/"),
("src", deploy_root / "src.zip", "/"),
("src/", deploy_root / "src.zip", "/"),
("src/*", deploy_root / "src.zip", "/"),
("src/*.py", deploy_root / "src.zip", "/"),
(
"src/dir/dir_app.py",
Path("output") / "src" / "dir" / "dir_app.py",
deploy_root / "src" / "dir" / "dir_app.py",
"/src/dir/",
),
(
{"src": "src/**/*", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src/", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src/*", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src/dir/dir_app.py", "dest": "source/dir/apps/"},
"output/source/dir/apps/dir_app.py",
deploy_root / "source" / "dir" / "apps" / "dir_app.py",
"/source/dir/apps/",
),
],
Expand Down Expand Up @@ -111,38 +113,38 @@ def test_build_and_deploy_with_artifacts(
@pytest.mark.parametrize(
"artifact, local_path, stage_path",
[
("src", Path("output") / "src.zip", "/"),
("src/", Path("output") / "src.zip", "/"),
("src/*", Path("output") / "src.zip", "/"),
("src/*.py", Path("output") / "src.zip", "/"),
("src", deploy_root / "src.zip", "/"),
("src/", deploy_root / "src.zip", "/"),
("src/*", deploy_root / "src.zip", "/"),
("src/*.py", deploy_root / "src.zip", "/"),
(
"src/dir/dir_app.py",
Path("output") / "src" / "dir" / "dir_app.py",
deploy_root / "src" / "dir" / "dir_app.py",
"/src/dir/",
),
(
{"src": "src/**/*", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src/", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src/*", "dest": "source/"},
Path("output") / "source" / "src.zip",
deploy_root / "source" / "src.zip",
"/source/",
),
(
{"src": "src/dir/dir_app.py", "dest": "source/dir/apps/"},
Path("output") / "source" / "dir" / "apps" / "dir_app.py",
deploy_root / "source" / "dir" / "apps" / "dir_app.py",
"/source/dir/apps/",
),
],
Expand Down
4 changes: 3 additions & 1 deletion tests/snowpark/test_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ def test_build_with_glob_patterns_in_artifacts(

result = runner.invoke(["snowpark", "build", "--ignore-anaconda"])
assert result.exit_code == 0, result.output
_assert_zip_contains(tmp_dir / "output" / zip_name, expected_files)
_assert_zip_contains(
tmp_dir / "output" / "deploy" / "snowpark" / zip_name, expected_files
)


def _assert_zip_contains(app_zip: str, expected_files: Set[str]):
Expand Down
6 changes: 3 additions & 3 deletions tests/snowpark/test_function.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ def test_deploy_function_no_changes(
]
assert queries == [
"create stage if not exists IDENTIFIER('MockDatabase.MockSchema.dev_deployment') comment='deployments managed by Snowflake CLI'",
f"put file://{Path(project_dir).resolve()}/output/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/ auto_compress=false parallel=4 overwrite=True",
f"put file://{Path(project_dir).resolve()}/output/deploy/snowpark/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/ auto_compress=false parallel=4 overwrite=True",
]


Expand Down Expand Up @@ -259,7 +259,7 @@ def test_deploy_function_needs_update_because_packages_changes(
]
assert queries == [
"create stage if not exists IDENTIFIER('MockDatabase.MockSchema.dev_deployment') comment='deployments managed by Snowflake CLI'",
f"put file://{Path(project_dir).resolve()}/output/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/ auto_compress=false parallel=4 overwrite=True",
f"put file://{Path(project_dir).resolve()}/output/deploy/snowpark/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/ auto_compress=false parallel=4 overwrite=True",
dedent(
"""\
create or replace function IDENTIFIER('MockDatabase.MockSchema.func1')(a string default 'default value', b variant)
Expand Down Expand Up @@ -316,7 +316,7 @@ def test_deploy_function_needs_update_because_handler_changes(
]
assert queries == [
"create stage if not exists IDENTIFIER('MockDatabase.MockSchema.dev_deployment') comment='deployments managed by Snowflake CLI'",
f"put file://{Path(project_dir).resolve()}/output/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/"
f"put file://{Path(project_dir).resolve()}/output/deploy/snowpark/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/"
f" auto_compress=false parallel=4 overwrite=True",
dedent(
"""\
Expand Down
4 changes: 2 additions & 2 deletions tests/snowpark/test_procedure.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def test_deploy_procedure(
)
assert ctx.get_queries() == [
"create stage if not exists IDENTIFIER('MockDatabase.MockSchema.dev_deployment') comment='deployments managed by Snowflake CLI'",
f"put file://{Path(tmp).resolve()}/output/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/ auto_compress=false parallel=4 overwrite=True",
f"put file://{Path(tmp).resolve()}/output/deploy/snowpark/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/ auto_compress=false parallel=4 overwrite=True",
dedent(
"""\
create or replace procedure IDENTIFIER('MockDatabase.MockSchema.procedureName')(name string)
Expand Down Expand Up @@ -190,7 +190,7 @@ def test_deploy_procedure_with_external_access(
)
assert ctx.get_queries() == [
"create stage if not exists IDENTIFIER('MockDatabase.MockSchema.dev_deployment') comment='deployments managed by Snowflake CLI'",
f"put file://{Path(project_dir).resolve()}/output/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/"
f"put file://{Path(project_dir).resolve()}/output/deploy/snowpark/my_snowpark_project/app.py @MockDatabase.MockSchema.dev_deployment/my_snowpark_project/"
f" auto_compress=false parallel=4 overwrite=True",
dedent(
"""\
Expand Down
53 changes: 28 additions & 25 deletions tests/snowpark/test_project_paths.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import pytest
from snowflake.cli._plugins.snowpark.snowpark_project_paths import Artefact

deploy_path = Path("output") / "deploy" / "snowpark"
absolute_deploy_path = Path.cwd().absolute() / "output" / "deploy" / "snowpark"


@pytest.mark.parametrize(
"path, dest, is_file, expected_path",
Expand Down Expand Up @@ -69,34 +72,34 @@ def test_artifact_upload_path(mock_ctx_context, path, dest, is_file, expected_pa
@pytest.mark.parametrize(
"path, dest, is_file, expected_path",
[
("src", None, False, Path("output") / "src.zip"),
("src/", None, False, Path("output") / "src.zip"),
("src", "source", False, Path("output") / "source" / "src.zip"),
("src/app.py", None, True, Path("output") / "src" / "app.py"),
("src", None, False, deploy_path / "src.zip"),
("src/", None, False, deploy_path / "src.zip"),
("src", "source", False, deploy_path / "source" / "src.zip"),
("src/app.py", None, True, deploy_path / "src" / "app.py"),
(
"src/app.py",
"source/new_app.py",
True,
Path("output") / "source" / "new_app.py",
deploy_path / "source" / "new_app.py",
),
("src/*", "source/new_app.py", True, Path("output") / "source" / "new_app.py"),
("src/*", "source/new_app.py", True, deploy_path / "source" / "new_app.py"),
(
"src/dir/dir2/app.py",
None,
True,
Path("output") / "src" / "dir" / "dir2" / "app.py",
deploy_path / "src" / "dir" / "dir2" / "app.py",
),
(
"src/dir/dir2/app.py",
"source/",
True,
Path("output") / "source" / "app.py",
deploy_path / "source" / "app.py",
),
("src/*", "source/", False, Path("output") / "source" / "src.zip"),
("src/**/*.py", None, False, Path("output") / "src.zip"),
("src/**/*.py", "source/", False, Path("output") / "source" / "src.zip"),
("src/app*", None, False, Path("output") / "src.zip"),
("src/app[1-5].py", None, False, Path("output") / "src.zip"),
("src/*", "source/", False, deploy_path / "source" / "src.zip"),
("src/**/*.py", None, False, deploy_path / "src.zip"),
("src/**/*.py", "source/", False, deploy_path / "source" / "src.zip"),
("src/app*", None, False, deploy_path / "src.zip"),
("src/app[1-5].py", None, False, deploy_path / "src.zip"),
],
)
def test_artifact_post_build_path(path, dest, is_file, expected_path):
Expand Down Expand Up @@ -174,48 +177,48 @@ def test_artifact_upload_path_from_other_directory(
@pytest.mark.parametrize(
"path, dest, is_file, expected_path",
[
("src", None, False, Path.cwd().absolute() / "output" / "src.zip"),
("src/", None, False, Path.cwd().absolute() / "output" / "src.zip"),
("src", None, False, absolute_deploy_path / "src.zip"),
("src/", None, False, absolute_deploy_path / "src.zip"),
(
"src",
"source",
False,
Path.cwd().absolute() / "output" / "source" / "src.zip",
absolute_deploy_path / "source" / "src.zip",
),
("src/app.py", None, True, Path.cwd().absolute() / "output" / "src" / "app.py"),
("src/app.py", None, True, absolute_deploy_path / "src" / "app.py"),
(
"src/app.py",
"source/new_app.py",
True,
Path.cwd().absolute() / "output" / "source" / "new_app.py",
absolute_deploy_path / "source" / "new_app.py",
),
(
"src/dir/dir2/app.py",
None,
True,
Path.cwd().absolute() / "output" / "src" / "dir" / "dir2" / "app.py",
absolute_deploy_path / "src" / "dir" / "dir2" / "app.py",
),
(
"src/dir/dir2/app.py",
"source/",
True,
Path.cwd().absolute() / "output" / "source" / "app.py",
absolute_deploy_path / "source" / "app.py",
),
(
"src/*",
"source/",
False,
Path.cwd().absolute() / "output" / "source" / "src.zip",
absolute_deploy_path / "source" / "src.zip",
),
("src/**/*.py", None, False, Path.cwd().absolute() / "output" / "src.zip"),
("src/**/*.py", None, False, absolute_deploy_path / "src.zip"),
(
"src/**/*.py",
"source/",
False,
Path.cwd().absolute() / "output" / "source" / "src.zip",
absolute_deploy_path / "source" / "src.zip",
),
("src/app*", None, False, Path.cwd().absolute() / "output" / "src.zip"),
("src/app[1-5].py", None, False, Path.cwd().absolute() / "output" / "src.zip"),
("src/app*", None, False, absolute_deploy_path / "src.zip"),
("src/app[1-5].py", None, False, absolute_deploy_path / "src.zip"),
],
)
def test_artifact_post_build_path_from_other_directory(
Expand Down
Loading

0 comments on commit 6b61c7f

Please sign in to comment.