88 DVC_STUDIO_TOKEN ,
99 DVC_STUDIO_URL ,
1010)
11+ from dvc .repo import Repo
12+ from dvc .testing .scripts import COPY_SCRIPT
13+ from dvc .utils .studio import get_subrepo_relpath
1114
1215
16+ @pytest .mark .studio
1317@pytest .mark .parametrize ("tmp" , [True , False ])
1418@pytest .mark .parametrize ("offline" , [True , False ])
1519def test_post_to_studio (
@@ -66,10 +70,45 @@ def test_post_to_studio(
6670 }
6771
6872
73+ @pytest .mark .studio
6974@pytest .mark .parametrize ("tmp" , [True , False ])
70- def test_post_to_studio_custom_message (
71- tmp_dir , dvc , scm , exp_stage , mocker , monkeypatch , tmp
72- ):
75+ def test_post_to_studio_subdir (tmp_dir , scm , mocker , monkeypatch , tmp ):
76+ live_exp_subdir = "project_a"
77+
78+ tmp_dir .scm_gen (
79+ {
80+ live_exp_subdir : {
81+ "params.yaml" : "foo: 1" ,
82+ "metrics.yaml" : "foo: 1" ,
83+ "copy.py" : COPY_SCRIPT .encode ("utf-8" ),
84+ },
85+ },
86+ commit = "git init" ,
87+ )
88+
89+ project_a_dvc = Repo .init (tmp_dir / live_exp_subdir , subdir = True )
90+ with monkeypatch .context () as m :
91+ m .chdir (project_a_dvc .root_dir )
92+
93+ exp_stage = project_a_dvc .run (
94+ cmd = "python copy.py params.yaml metrics.yaml" ,
95+ metrics_no_cache = ["metrics.yaml" ],
96+ params = ["foo" ],
97+ name = "copy-file" ,
98+ )
99+
100+ scm .add (
101+ [
102+ ".gitignore" ,
103+ "copy.py" ,
104+ "dvc.lock" ,
105+ "dvc.yaml" ,
106+ "metrics.yaml" ,
107+ "params.yaml" ,
108+ ]
109+ )
110+ scm .commit ("dvc init project_a" )
111+
73112 valid_response = mocker .MagicMock ()
74113 valid_response .status_code = 200
75114 mocked_post = mocker .patch ("requests.post" , return_value = valid_response )
@@ -79,12 +118,16 @@ def test_post_to_studio_custom_message(
79118 monkeypatch .setenv (env .STUDIO_TOKEN , "STUDIO_TOKEN" )
80119
81120 baseline_sha = scm .get_rev ()
82- exp_rev = first (
83- dvc .experiments .run (
84- exp_stage .addressing , params = ["foo=1" ], tmp_dir = tmp , message = "foo"
121+ with monkeypatch .context () as m :
122+ m .chdir (project_a_dvc .root_dir )
123+ exp_rev = first (
124+ project_a_dvc .experiments .run (
125+ exp_stage .addressing , params = ["foo=24" ], tmp_dir = tmp
126+ )
85127 )
86- )
87- name = dvc .experiments .get_exact_name ([exp_rev ])[exp_rev ]
128+
129+ name = project_a_dvc .experiments .get_exact_name ([exp_rev ])[exp_rev ]
130+ project_a_dvc .close ()
88131 assert mocked_post .call_count == 2
89132
90133 start_call = mocked_post .call_args_list [0 ]
@@ -94,7 +137,57 @@ def test_post_to_studio_custom_message(
94137 "repo_url" : "STUDIO_REPO_URL" ,
95138 "baseline_sha" : baseline_sha ,
96139 "name" : name ,
97- "params" : {"params.yaml" : {"foo" : 1 }},
140+ "params" : {"params.yaml" : {"foo" : 24 }},
141+ "subdir" : live_exp_subdir ,
98142 "client" : "dvc" ,
99- "message" : "foo" ,
100143 }
144+
145+
146+ @pytest .mark .studio
147+ def test_monorepo_relpath (tmp_dir , scm ):
148+ from dvc .repo .destroy import destroy
149+
150+ tmp_dir .gen ({"project_a" : {}, "subdir/project_b" : {}})
151+
152+ non_monorepo = Repo .init (tmp_dir )
153+ assert get_subrepo_relpath (non_monorepo ) == ""
154+
155+ destroy (non_monorepo )
156+
157+ monorepo_project_a = Repo .init (tmp_dir / "project_a" , subdir = True )
158+
159+ assert get_subrepo_relpath (monorepo_project_a ) == "project_a"
160+
161+ monorepo_project_b = Repo .init (tmp_dir / "subdir" / "project_b" , subdir = True )
162+
163+ assert get_subrepo_relpath (monorepo_project_b ) == "subdir/project_b"
164+
165+
166+ @pytest .mark .studio
167+ def test_virtual_monorepo_relpath (tmp_dir , scm ):
168+ from dvc .fs .git import GitFileSystem
169+ from dvc .repo .destroy import destroy
170+
171+ tmp_dir .gen ({"project_a" : {}, "subdir/project_b" : {}})
172+ scm .commit ("initial commit" )
173+ gfs = GitFileSystem (scm = scm , rev = "master" )
174+
175+ non_monorepo = Repo .init (tmp_dir )
176+ non_monorepo .fs = gfs
177+ non_monorepo .root_dir = "/"
178+
179+ assert get_subrepo_relpath (non_monorepo ) == ""
180+
181+ destroy (non_monorepo )
182+
183+ monorepo_project_a = Repo .init (tmp_dir / "project_a" , subdir = True )
184+ monorepo_project_a .fs = gfs
185+ monorepo_project_a .root_dir = "/project_a"
186+
187+ assert get_subrepo_relpath (monorepo_project_a ) == "project_a"
188+
189+ monorepo_project_b = Repo .init (tmp_dir / "subdir" / "project_b" , subdir = True )
190+ monorepo_project_b .fs = gfs
191+ monorepo_project_b .root_dir = "/subdir/project_b"
192+
193+ assert get_subrepo_relpath (monorepo_project_b ) == "subdir/project_b"
0 commit comments