Skip to content

Commit 7c97922

Browse files
committed
Add gitea_api.common.TemporaryDirectory class that supports 'delete' argument on python 3.6+
1 parent ad96f39 commit 7c97922

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

osc/gitea_api/common.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import re
55
import subprocess
66
import sys
7+
import tempfile
78
from typing import List
89
from typing import Optional
910

@@ -101,8 +102,6 @@ def run_editor(file_path: str):
101102

102103

103104
def edit_message(template: Optional[str] = None) -> str:
104-
import tempfile
105-
106105
with tempfile.NamedTemporaryFile(mode="w+", encoding="utf-8", prefix="git_obs_message_") as f:
107106
if template:
108107
f.write(template)
@@ -138,3 +137,24 @@ def dt_sanitize(date_time: str):
138137
dt = datetime.datetime.fromisoformat(date_time)
139138

140139
return dt.astimezone(datetime.timezone.utc).strftime("%Y-%m-%d %H:%M")
140+
141+
142+
if sys.version_info[:2] >= (3, 12):
143+
TemporaryDirectory = tempfile.TemporaryDirectory
144+
else:
145+
class TemporaryDirectory:
146+
"""
147+
A minimalist implementation of TemporaryDirectory that supports 'delete' argument
148+
"""
149+
def __init__(self, suffix=None, prefix=None, dir=None, delete=True):
150+
self.name = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=dir)
151+
self._delete = delete
152+
153+
def __enter__(self):
154+
return self.name
155+
156+
def __exit__(self, exc_type, exc_val, exc_tb):
157+
import shutil
158+
159+
if self._delete and os.path.isdir(self.name):
160+
shutil.rmtree(self.name)

tests/test_gitea_api_common.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import os
2+
import shutil
13
import unittest
24

35
from osc.gitea_api import dt_sanitize
6+
from osc.gitea_api.common import TemporaryDirectory
47

58

69
class TestGiteaApiCommon(unittest.TestCase):
@@ -21,5 +24,17 @@ def test_dt_sanitize(self):
2124
self.assertEqual(expected, actual)
2225

2326

27+
def test_TemporaryDirectory_delete(self):
28+
with TemporaryDirectory(delete=True) as temp_dir:
29+
pass
30+
self.assertFalse(os.path.isdir(temp_dir))
31+
32+
def test_TemporaryDirectory_no_delete(self):
33+
with TemporaryDirectory(delete=False) as temp_dir:
34+
pass
35+
self.assertTrue(os.path.isdir(temp_dir))
36+
shutil.rmtree(temp_dir)
37+
38+
2439
if __name__ == "__main__":
2540
unittest.main()

0 commit comments

Comments
 (0)