@@ -36,11 +36,11 @@ def run_script(script, project_dir=None, args=None, evolve_dir=None, stdin=None,
3636
3737
3838class TestCodexSaveAndRetrieve :
39- def test_save_stamps_owner_and_private_visibility (self , tmp_path ):
40- evolve_dir = tmp_path / ".evolve"
39+ def test_save_stamps_owner_and_private_visibility (self , temp_project_dir ):
40+ evolve_dir = temp_project_dir / ".evolve"
4141 run_script (
4242 SAVE_SCRIPT ,
43- project_dir = tmp_path ,
43+ project_dir = temp_project_dir ,
4444 args = ["--user" , "alice" ],
4545 evolve_dir = evolve_dir ,
4646 stdin = json .dumps ({"entities" : [{"type" : "guideline" , "content" : "Write clear commit messages." }]}),
@@ -51,8 +51,8 @@ def test_save_stamps_owner_and_private_visibility(self, tmp_path):
5151 assert "owner: alice" in content
5252 assert "visibility: private" in content
5353
54- def test_retrieve_annotates_subscribed_entities (self , tmp_path ):
55- evolve_dir = tmp_path / ".evolve"
54+ def test_retrieve_annotates_subscribed_entities (self , temp_project_dir ):
55+ evolve_dir = temp_project_dir / ".evolve"
5656 own_dir = evolve_dir / "entities" / "guideline"
5757 own_dir .mkdir (parents = True )
5858 (own_dir / "tip.md" ).write_text ("---\n type: guideline\n ---\n \n Keep functions small.\n " )
@@ -66,8 +66,8 @@ def test_retrieve_annotates_subscribed_entities(self, tmp_path):
6666 assert "[from: alice]" in result .stdout
6767 assert "Always write tests." in result .stdout
6868
69- def test_retrieve_includes_published_guidelines (self , tmp_path ):
70- evolve_dir = tmp_path / ".evolve"
69+ def test_retrieve_includes_published_guidelines (self , temp_project_dir ):
70+ evolve_dir = temp_project_dir / ".evolve"
7171 own_dir = evolve_dir / "entities" / "guideline"
7272 own_dir .mkdir (parents = True )
7373 (own_dir / "tip.md" ).write_text ("---\n type: guideline\n ---\n \n Keep functions small.\n " )
@@ -85,172 +85,172 @@ def test_retrieve_includes_published_guidelines(self, tmp_path):
8585
8686
8787class TestCodexSharingScripts :
88- def test_publish_moves_entity_to_public_dir_and_audits (self , tmp_path ):
89- guideline_dir = tmp_path / ".evolve" / "entities" / "guideline"
88+ def test_publish_moves_entity_to_public_dir_and_audits (self , temp_project_dir ):
89+ guideline_dir = temp_project_dir / ".evolve" / "entities" / "guideline"
9090 guideline_dir .mkdir (parents = True )
9191 source = guideline_dir / "my-tip.md"
9292 source .write_text ("---\n type: guideline\n ---\n \n Prefer composition over inheritance.\n " )
9393
9494 run_script (
9595 PUBLISH_SCRIPT ,
96- project_dir = tmp_path ,
96+ project_dir = temp_project_dir ,
9797 args = ["--entity" , "my-tip.md" , "--user" , "alice" ],
98- evolve_dir = tmp_path / ".evolve" ,
98+ evolve_dir = temp_project_dir / ".evolve" ,
9999 )
100100
101- published = tmp_path / ".evolve" / "public" / "guideline" / "my-tip.md"
101+ published = temp_project_dir / ".evolve" / "public" / "guideline" / "my-tip.md"
102102 assert published .exists ()
103103 assert not source .exists ()
104104 content = published .read_text ()
105105 assert "visibility: public" in content
106106 assert "owner: alice" in content
107107 assert "published_at:" in content
108108
109- entry = json .loads ((tmp_path / ".evolve" / "audit.log" ).read_text ().strip ())
109+ entry = json .loads ((temp_project_dir / ".evolve" / "audit.log" ).read_text ().strip ())
110110 assert entry ["action" ] == "publish"
111111 assert entry ["actor" ] == "alice"
112112
113- def test_publish_stamps_source_from_public_repo_remote (self , tmp_path ):
114- guideline_dir = tmp_path / ".evolve" / "entities" / "guideline"
113+ def test_publish_stamps_source_from_public_repo_remote (self , temp_project_dir ):
114+ guideline_dir = temp_project_dir / ".evolve" / "entities" / "guideline"
115115 guideline_dir .mkdir (parents = True )
116116 (guideline_dir / "my-tip.md" ).write_text ("---\n type: guideline\n ---\n \n Prefer composition over inheritance.\n " )
117- (tmp_path / "evolve.config.yaml" ).write_text (
117+ (temp_project_dir / "evolve.config.yaml" ).write_text (
118118 'public_repo:\n remote: "git@github.com:alice/evolve-guidelines.git"\n branch: "main"\n '
119119 )
120120
121121 run_script (
122122 PUBLISH_SCRIPT ,
123- project_dir = tmp_path ,
123+ project_dir = temp_project_dir ,
124124 args = ["--entity" , "my-tip.md" ],
125- evolve_dir = tmp_path / ".evolve" ,
125+ evolve_dir = temp_project_dir / ".evolve" ,
126126 )
127127
128- content = (tmp_path / ".evolve" / "public" / "guideline" / "my-tip.md" ).read_text ()
128+ content = (temp_project_dir / ".evolve" / "public" / "guideline" / "my-tip.md" ).read_text ()
129129 assert "source: alice/evolve-guidelines" in content
130130
131- def test_publish_uses_identity_user_as_source_fallback (self , tmp_path ):
132- guideline_dir = tmp_path / ".evolve" / "entities" / "guideline"
131+ def test_publish_uses_identity_user_as_source_fallback (self , temp_project_dir ):
132+ guideline_dir = temp_project_dir / ".evolve" / "entities" / "guideline"
133133 guideline_dir .mkdir (parents = True )
134134 (guideline_dir / "my-tip.md" ).write_text ("---\n type: guideline\n ---\n \n Prefer composition over inheritance.\n " )
135- (tmp_path / "evolve.config.yaml" ).write_text ('identity:\n user: "alice"\n ' )
135+ (temp_project_dir / "evolve.config.yaml" ).write_text ('identity:\n user: "alice"\n ' )
136136
137137 run_script (
138138 PUBLISH_SCRIPT ,
139- project_dir = tmp_path ,
139+ project_dir = temp_project_dir ,
140140 args = ["--entity" , "my-tip.md" ],
141- evolve_dir = tmp_path / ".evolve" ,
141+ evolve_dir = temp_project_dir / ".evolve" ,
142142 )
143143
144- content = (tmp_path / ".evolve" / "public" / "guideline" / "my-tip.md" ).read_text ()
144+ content = (temp_project_dir / ".evolve" / "public" / "guideline" / "my-tip.md" ).read_text ()
145145 assert "source: alice" in content
146146
147- def test_publish_fails_when_entity_not_found (self , tmp_path ):
147+ def test_publish_fails_when_entity_not_found (self , temp_project_dir ):
148148 result = run_script (
149149 PUBLISH_SCRIPT ,
150- project_dir = tmp_path ,
150+ project_dir = temp_project_dir ,
151151 args = ["--entity" , "missing.md" ],
152- evolve_dir = tmp_path / ".evolve" ,
152+ evolve_dir = temp_project_dir / ".evolve" ,
153153 expect_success = False ,
154154 )
155155 assert result .returncode != 0
156156 assert "not found" in result .stderr
157157
158- def test_publish_succeeds_without_user_flag (self , tmp_path ):
159- guideline_dir = tmp_path / ".evolve" / "entities" / "guideline"
158+ def test_publish_succeeds_without_user_flag (self , temp_project_dir ):
159+ guideline_dir = temp_project_dir / ".evolve" / "entities" / "guideline"
160160 guideline_dir .mkdir (parents = True )
161161 (guideline_dir / "my-tip.md" ).write_text ("---\n type: guideline\n ---\n \n Prefer composition.\n " )
162162
163163 run_script (
164164 PUBLISH_SCRIPT ,
165- project_dir = tmp_path ,
165+ project_dir = temp_project_dir ,
166166 args = ["--entity" , "my-tip.md" ],
167- evolve_dir = tmp_path / ".evolve" ,
167+ evolve_dir = temp_project_dir / ".evolve" ,
168168 )
169- content = (tmp_path / ".evolve" / "public" / "guideline" / "my-tip.md" ).read_text ()
169+ content = (temp_project_dir / ".evolve" / "public" / "guideline" / "my-tip.md" ).read_text ()
170170 assert "visibility: public" in content
171171
172- def test_publish_rejects_path_traversal_in_entity_name (self , tmp_path ):
173- guideline_dir = tmp_path / ".evolve" / "entities" / "guideline"
172+ def test_publish_rejects_path_traversal_in_entity_name (self , temp_project_dir ):
173+ guideline_dir = temp_project_dir / ".evolve" / "entities" / "guideline"
174174 guideline_dir .mkdir (parents = True )
175175 (guideline_dir / "tip.md" ).write_text ("---\n type: guideline\n ---\n \n A tip.\n " )
176176 result = run_script (
177177 PUBLISH_SCRIPT ,
178- project_dir = tmp_path ,
178+ project_dir = temp_project_dir ,
179179 args = ["--entity" , "../../etc/passwd" ],
180- evolve_dir = tmp_path / ".evolve" ,
180+ evolve_dir = temp_project_dir / ".evolve" ,
181181 expect_success = False ,
182182 )
183183 assert result .returncode != 0
184184 assert "invalid entity name" in result .stderr
185185
186- def test_subscribe_sync_and_unsubscribe_round_trip (self , tmp_path , local_repo ):
187- evolve_dir = tmp_path / ".evolve"
186+ def test_subscribe_sync_and_unsubscribe_round_trip (self , temp_project_dir , local_repo ):
187+ evolve_dir = temp_project_dir / ".evolve"
188188
189189 run_script (
190190 SUBSCRIBE_SCRIPT ,
191- project_dir = tmp_path ,
191+ project_dir = temp_project_dir ,
192192 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
193193 evolve_dir = evolve_dir ,
194194 )
195195 assert (evolve_dir / "subscribed" / "alice" ).is_dir ()
196196
197- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
197+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
198198 mirrored = evolve_dir / "entities" / "subscribed" / "alice" / "guideline" / "tip-one.md"
199199 assert mirrored .exists ()
200200 assert "Always write tests." in mirrored .read_text ()
201201
202202 run_script (
203203 UNSUBSCRIBE_SCRIPT ,
204- project_dir = tmp_path ,
204+ project_dir = temp_project_dir ,
205205 args = ["--name" , "alice" ],
206206 evolve_dir = evolve_dir ,
207207 )
208208 assert not (evolve_dir / "subscribed" / "alice" ).exists ()
209209 assert not (evolve_dir / "entities" / "subscribed" / "alice" ).exists ()
210210
211- def test_subscribe_updates_config_and_rejects_duplicate (self , tmp_path , local_repo ):
212- evolve_dir = tmp_path / ".evolve"
211+ def test_subscribe_updates_config_and_rejects_duplicate (self , temp_project_dir , local_repo ):
212+ evolve_dir = temp_project_dir / ".evolve"
213213 run_script (
214214 SUBSCRIBE_SCRIPT ,
215- project_dir = tmp_path ,
215+ project_dir = temp_project_dir ,
216216 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
217217 evolve_dir = evolve_dir ,
218218 )
219- config_text = (tmp_path / "evolve.config.yaml" ).read_text ()
219+ config_text = (temp_project_dir / "evolve.config.yaml" ).read_text ()
220220 assert 'name: "alice"' in config_text
221221
222222 result = run_script (
223223 SUBSCRIBE_SCRIPT ,
224- project_dir = tmp_path ,
224+ project_dir = temp_project_dir ,
225225 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
226226 evolve_dir = evolve_dir ,
227227 expect_success = False ,
228228 )
229229 assert result .returncode != 0
230230 assert "already exists" in result .stderr
231231
232- def test_subscribe_rejects_path_traversal_in_name (self , tmp_path , local_repo ):
232+ def test_subscribe_rejects_path_traversal_in_name (self , temp_project_dir , local_repo ):
233233 result = run_script (
234234 SUBSCRIBE_SCRIPT ,
235- project_dir = tmp_path ,
235+ project_dir = temp_project_dir ,
236236 args = ["--name" , "../../evil" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
237- evolve_dir = tmp_path / ".evolve" ,
237+ evolve_dir = temp_project_dir / ".evolve" ,
238238 expect_success = False ,
239239 )
240240 assert result .returncode != 0
241241 assert "invalid subscription name" in result .stderr
242242
243- def test_unsubscribe_list_and_not_found (self , tmp_path , local_repo ):
244- evolve_dir = tmp_path / ".evolve"
243+ def test_unsubscribe_list_and_not_found (self , temp_project_dir , local_repo ):
244+ evolve_dir = temp_project_dir / ".evolve"
245245 run_script (
246246 SUBSCRIBE_SCRIPT ,
247- project_dir = tmp_path ,
247+ project_dir = temp_project_dir ,
248248 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
249249 evolve_dir = evolve_dir ,
250250 )
251251 result = run_script (
252252 UNSUBSCRIBE_SCRIPT ,
253- project_dir = tmp_path ,
253+ project_dir = temp_project_dir ,
254254 args = ["--list" ],
255255 evolve_dir = evolve_dir ,
256256 )
@@ -259,83 +259,83 @@ def test_unsubscribe_list_and_not_found(self, tmp_path, local_repo):
259259
260260 missing = run_script (
261261 UNSUBSCRIBE_SCRIPT ,
262- project_dir = tmp_path ,
262+ project_dir = temp_project_dir ,
263263 args = ["--name" , "missing" ],
264264 evolve_dir = evolve_dir ,
265265 expect_success = False ,
266266 )
267267 assert missing .returncode != 0
268268 assert "not found" in missing .stderr
269269
270- def test_unsubscribe_rejects_path_traversal_in_name (self , tmp_path , local_repo ):
271- evolve_dir = tmp_path / ".evolve"
270+ def test_unsubscribe_rejects_path_traversal_in_name (self , temp_project_dir , local_repo ):
271+ evolve_dir = temp_project_dir / ".evolve"
272272 run_script (
273273 SUBSCRIBE_SCRIPT ,
274- project_dir = tmp_path ,
274+ project_dir = temp_project_dir ,
275275 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
276276 evolve_dir = evolve_dir ,
277277 )
278278 result = run_script (
279279 UNSUBSCRIBE_SCRIPT ,
280- project_dir = tmp_path ,
280+ project_dir = temp_project_dir ,
281281 args = ["--name" , "../../evil" ],
282282 evolve_dir = evolve_dir ,
283283 expect_success = False ,
284284 )
285285 assert result .returncode != 0
286286 assert "invalid subscription name" in result .stderr
287287
288- def test_sync_quiet_exits_cleanly_without_changes (self , tmp_path , local_repo ):
289- evolve_dir = tmp_path / ".evolve"
288+ def test_sync_quiet_exits_cleanly_without_changes (self , temp_project_dir , local_repo ):
289+ evolve_dir = temp_project_dir / ".evolve"
290290 run_script (
291291 SUBSCRIBE_SCRIPT ,
292- project_dir = tmp_path ,
292+ project_dir = temp_project_dir ,
293293 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
294294 evolve_dir = evolve_dir ,
295295 )
296- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
296+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
297297 result = run_script (
298298 SYNC_SCRIPT ,
299- project_dir = tmp_path ,
299+ project_dir = temp_project_dir ,
300300 args = ["--quiet" ],
301301 evolve_dir = evolve_dir ,
302302 expect_success = False ,
303303 )
304304 assert result .returncode == 0
305305 assert result .stdout .strip () == ""
306306
307- def test_sync_no_subscriptions_exits_cleanly (self , tmp_path ):
307+ def test_sync_no_subscriptions_exits_cleanly (self , temp_project_dir ):
308308 result = run_script (
309309 SYNC_SCRIPT ,
310- project_dir = tmp_path ,
311- evolve_dir = tmp_path / ".evolve" ,
310+ project_dir = temp_project_dir ,
311+ evolve_dir = temp_project_dir / ".evolve" ,
312312 expect_success = False ,
313313 )
314314 assert result .returncode == 0
315315 assert "No subscriptions" in result .stdout
316316 assert "evolve-lite:subscribe" in result .stdout
317317
318- def test_sync_writes_audit_log (self , tmp_path , local_repo ):
319- evolve_dir = tmp_path / ".evolve"
318+ def test_sync_writes_audit_log (self , temp_project_dir , local_repo ):
319+ evolve_dir = temp_project_dir / ".evolve"
320320 run_script (
321321 SUBSCRIBE_SCRIPT ,
322- project_dir = tmp_path ,
322+ project_dir = temp_project_dir ,
323323 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
324324 evolve_dir = evolve_dir ,
325325 )
326- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
327- actions = [json .loads (line )["action" ] for line in (tmp_path / ".evolve" / "audit.log" ).read_text ().splitlines () if line .strip ()]
326+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
327+ actions = [json .loads (line )["action" ] for line in (temp_project_dir / ".evolve" / "audit.log" ).read_text ().splitlines () if line .strip ()]
328328 assert "sync" in actions
329329
330- def test_sync_picks_up_new_entity_after_push (self , tmp_path , local_repo ):
331- evolve_dir = tmp_path / ".evolve"
330+ def test_sync_picks_up_new_entity_after_push (self , temp_project_dir , local_repo ):
331+ evolve_dir = temp_project_dir / ".evolve"
332332 run_script (
333333 SUBSCRIBE_SCRIPT ,
334- project_dir = tmp_path ,
334+ project_dir = temp_project_dir ,
335335 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
336336 evolve_dir = evolve_dir ,
337337 )
338- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
338+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
339339
340340 git_env = local_repo ["env" ]
341341 new_entity = local_repo ["work" ] / "guideline" / "tip-two.md"
@@ -344,20 +344,20 @@ def test_sync_picks_up_new_entity_after_push(self, tmp_path, local_repo):
344344 subprocess .run (["git" , "-C" , str (local_repo ["work" ]), "commit" , "-m" , "add tip-two" ], check = True , env = git_env )
345345 subprocess .run (["git" , "-C" , str (local_repo ["work" ]), "push" , "origin" , "main" ], check = True , env = git_env )
346346
347- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
347+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
348348 mirrored = evolve_dir / "entities" / "subscribed" / "alice" / "guideline" / "tip-two.md"
349349 assert mirrored .exists ()
350350 assert "Delete dead code promptly." in mirrored .read_text ()
351351
352- def test_sync_removed_entity_disappears_after_sync (self , tmp_path , local_repo ):
353- evolve_dir = tmp_path / ".evolve"
352+ def test_sync_removed_entity_disappears_after_sync (self , temp_project_dir , local_repo ):
353+ evolve_dir = temp_project_dir / ".evolve"
354354 run_script (
355355 SUBSCRIBE_SCRIPT ,
356- project_dir = tmp_path ,
356+ project_dir = temp_project_dir ,
357357 args = ["--name" , "alice" , "--remote" , str (local_repo ["bare" ]), "--branch" , "main" ],
358358 evolve_dir = evolve_dir ,
359359 )
360- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
360+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
361361
362362 tip_one = evolve_dir / "entities" / "subscribed" / "alice" / "guideline" / "tip-one.md"
363363 assert tip_one .exists ()
@@ -367,5 +367,5 @@ def test_sync_removed_entity_disappears_after_sync(self, tmp_path, local_repo):
367367 subprocess .run (["git" , "-C" , str (local_repo ["work" ]), "commit" , "-m" , "remove tip-one" ], check = True , env = git_env )
368368 subprocess .run (["git" , "-C" , str (local_repo ["work" ]), "push" , "origin" , "main" ], check = True , env = git_env )
369369
370- run_script (SYNC_SCRIPT , project_dir = tmp_path , evolve_dir = evolve_dir )
370+ run_script (SYNC_SCRIPT , project_dir = temp_project_dir , evolve_dir = evolve_dir )
371371 assert not tip_one .exists ()
0 commit comments