Skip to content

Commit cfe8dd3

Browse files
committed
V5.0.1
1 parent b311187 commit cfe8dd3

23 files changed

+2041
-1958
lines changed

tests/context_management/test_context_managers.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
import logging
32
import os
43
import sys
@@ -20,7 +19,10 @@
2019
)
2120

2221

23-
@pytest.mark.skipif(sys.platform == "win32", reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file")
22+
@pytest.mark.skipif(
23+
sys.platform == "win32",
24+
reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file",
25+
)
2426
class TestContextManagers:
2527
"""Test context manager functionality for resource management."""
2628

@@ -35,7 +37,7 @@ def setup_temp_dir(self):
3537
self.temp_dir = temp_dir
3638
self.log_file = "test.log"
3739
yield
38-
40+
3941
# Clear registry after each test
4042
clear_logger_registry()
4143

@@ -64,7 +66,7 @@ def test_size_rotating_context_manager(self):
6466
directory=self.temp_dir,
6567
filenames=[self.log_file],
6668
maxmbytes=1,
67-
daystokeep=2
69+
daystokeep=2,
6870
) as logger:
6971
assert isinstance(logger, logging.Logger)
7072
assert logger.name == logger_name
@@ -91,7 +93,7 @@ def test_timed_rotating_context_manager(self):
9193
directory=self.temp_dir,
9294
filenames=[self.log_file],
9395
when=RotateWhen.HOURLY.value,
94-
daystokeep=3
96+
daystokeep=3,
9597
) as logger:
9698
assert isinstance(logger, logging.Logger)
9799
assert logger.name == logger_name
@@ -180,7 +182,10 @@ def test_stream_handler_cleanup(self):
180182
logger_name = "test_stream_cleanup"
181183

182184
with SizeRotatingLog(
183-
name=logger_name, directory=self.temp_dir, filenames=[self.log_file], streamhandler=True
185+
name=logger_name,
186+
directory=self.temp_dir,
187+
filenames=[self.log_file],
188+
streamhandler=True,
184189
# Enable stream handler
185190
) as logger:
186191
# Should have both file and stream handlers
@@ -217,26 +222,26 @@ def test_nested_context_managers(self):
217222
def test_shutdown_logger(self):
218223
"""Test shutdown_logger functionality."""
219224
logger_name = "test_shutdown_logger"
220-
225+
221226
# Create a logger using factory (with registry caching)
222227
logger = LoggerFactory.get_or_create_logger("basic", name=logger_name, level=LogLevel.INFO.value)
223-
228+
224229
# Verify logger is in registry
225230
assert logger_name in LoggerFactory._logger_registry
226-
231+
227232
# Add some handlers
228233
handler = logging.StreamHandler()
229234
logger.addHandler(handler)
230-
235+
231236
# Verify handler is attached
232237
assert len(logger.handlers) > 0
233-
238+
234239
# Shutdown the specific logger
235240
LoggerFactory.shutdown_logger(logger_name)
236-
241+
237242
# Verify logger handlers are cleaned up
238243
assert len(logger.handlers) == 0
239-
244+
240245
# Verify logger is removed from registry
241246
assert logger_name not in LoggerFactory._logger_registry
242247

tests/context_management/test_resource_management.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
import concurrent.futures
32
import gc
43
import logging
@@ -14,17 +13,21 @@
1413

1514
import pytest
1615
from pythonLogs import (
17-
LoggerFactory, basic_logger,
16+
LoggerFactory,
17+
basic_logger,
1818
size_rotating_logger,
1919
clear_logger_registry,
2020
shutdown_logger,
2121
get_registered_loggers,
22-
LogLevel
22+
LogLevel,
2323
)
2424
from pythonLogs.basic_log import BasicLog
2525

2626

27-
@pytest.mark.skipif(sys.platform == "win32", reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file")
27+
@pytest.mark.skipif(
28+
sys.platform == "win32",
29+
reason="Windows file locking issues with TemporaryDirectory - see equivalent Windows-specific test file",
30+
)
2831
class TestResourceManagement:
2932
"""Test resource management functionality."""
3033

@@ -39,7 +42,7 @@ def setup_temp_dir(self):
3942
self.temp_dir = temp_dir
4043
self.log_file = "resource_test.log"
4144
yield
42-
45+
4346
# Clear registry after each test
4447
clear_logger_registry()
4548

@@ -52,7 +55,7 @@ def test_factory_registry_cleanup(self):
5255
name=logger_name,
5356
directory=self.temp_dir,
5457
filenames=[self.log_file],
55-
maxmbytes=1
58+
maxmbytes=1,
5659
)
5760

5861
# Add to registry
@@ -156,7 +159,7 @@ def test_registry_clear_with_file_handlers(self):
156159
directory=self.temp_dir,
157160
filenames=[self.log_file, "second.log"],
158161
maxmbytes=1,
159-
streamhandler=True # Add stream handler too
162+
streamhandler=True, # Add stream handler too
160163
)
161164

162165
# Add to registry
@@ -191,7 +194,7 @@ def test_resource_cleanup_performance(self):
191194
name=name,
192195
directory=self.temp_dir,
193196
filenames=[f"{name}.log"],
194-
maxmbytes=1
197+
maxmbytes=1,
195198
)
196199
LoggerFactory._logger_registry[name] = (logger, time.time())
197200

@@ -223,7 +226,7 @@ def test_memory_usage_after_cleanup(self):
223226
name=logger_name,
224227
directory=self.temp_dir,
225228
filenames=[self.log_file],
226-
maxmbytes=1
229+
maxmbytes=1,
227230
)
228231

229232
# Add to registry
@@ -259,31 +262,31 @@ def create_and_cleanup_logger(index):
259262
"""Create a logger and immediately clean it up."""
260263
logger_name = f"concurrent_test_{index}"
261264
logger = basic_logger(name=logger_name, level=LogLevel.INFO.value)
262-
265+
263266
# Add to registry
264267
LoggerFactory._logger_registry[logger_name] = (logger, time.time())
265-
268+
266269
# Small delay to increase chance of concurrent access
267270
time.sleep(0.01)
268-
271+
269272
# Shutdown this specific logger
270273
return shutdown_logger(logger_name)
271-
274+
272275
# Create multiple threads doing concurrent operations
273276
num_threads = 5
274277
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
275278
futures = []
276279
for i in range(num_threads):
277280
futures.append(executor.submit(create_and_cleanup_logger, i))
278-
281+
279282
# Wait for all to complete
280283
results = []
281284
for future in concurrent.futures.as_completed(futures):
282285
results.append(future.result())
283-
286+
284287
# All operations should succeed
285288
assert all(results)
286-
289+
287290
# The Registry should be empty
288291
assert len(get_registered_loggers()) == 0
289292

tests/core/test_basic_log.py

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
import logging
32
import os
43
import sys
@@ -43,7 +42,7 @@ def test_basic_log_initialization_with_params(self):
4342
encoding="utf-8",
4443
datefmt="%Y-%m-%d %H:%M:%S",
4544
timezone="UTC",
46-
showlocation=True
45+
showlocation=True,
4746
)
4847
assert basic_log.level == logging.DEBUG
4948
assert basic_log.appname == "test_app"
@@ -56,7 +55,7 @@ def test_basic_log_init_method(self):
5655
"""Test BasicLog init method creates logger."""
5756
basic_log = BasicLog(name="test_init", level=LogLevel.INFO.value)
5857
logger = basic_log.init()
59-
58+
6059
assert isinstance(logger, logging.Logger)
6160
assert logger.name == "test_init"
6261
assert logger.level == logging.INFO
@@ -67,19 +66,19 @@ def test_basic_log_logger_functionality(self):
6766
"""Test that BasicLog logger can log messages."""
6867
basic_log = BasicLog(name="test_logging", level=LogLevel.INFO.value)
6968
logger = basic_log.init()
70-
69+
7170
# Test logging at different levels
7271
logger.info("Test info message")
7372
logger.warning("Test warning message")
7473
logger.error("Test error message")
75-
74+
7675
# Should not raise any exceptions
7776

7877
def test_basic_log_level_filtering(self):
7978
"""Test that BasicLog respects log level filtering."""
8079
basic_log = BasicLog(name="test_level", level=LogLevel.WARNING.value)
8180
logger = basic_log.init()
82-
81+
8382
assert logger.level == logging.WARNING
8483
assert logger.isEnabledFor(logging.WARNING)
8584
assert logger.isEnabledFor(logging.ERROR)
@@ -90,12 +89,12 @@ def test_basic_log_cleanup_static_method(self):
9089
"""Test BasicLog static cleanup method."""
9190
basic_log = BasicLog(name="test_cleanup", level=LogLevel.INFO.value)
9291
logger = basic_log.init()
93-
92+
9493
# Add a handler
9594
handler = logging.StreamHandler()
9695
logger.addHandler(handler)
9796
assert len(logger.handlers) > 0
98-
97+
9998
# Clean up using static method
10099
BasicLog.cleanup_logger(logger)
101100
assert len(logger.handlers) == 0
@@ -104,12 +103,12 @@ def test_basic_log_instance_cleanup_method(self):
104103
"""Test BasicLog instance cleanup method."""
105104
basic_log = BasicLog(name="test_instance_cleanup", level=LogLevel.INFO.value)
106105
logger = basic_log.init()
107-
106+
108107
# Add a handler
109108
handler = logging.StreamHandler()
110109
logger.addHandler(handler)
111110
assert len(logger.handlers) > 0
112-
111+
113112
# Clean up using instance method
114113
basic_log._cleanup_logger(logger)
115114
assert len(logger.handlers) == 0
@@ -118,11 +117,11 @@ def test_basic_log_thread_safety(self):
118117
"""Test BasicLog thread safety with concurrent operations."""
119118
import threading
120119
import time
121-
120+
122121
basic_log = BasicLog(name="test_thread_safety", level=LogLevel.INFO.value)
123122
logger = basic_log.init()
124123
results = []
125-
124+
126125
def log_messages(thread_id):
127126
try:
128127
for i in range(10):
@@ -131,18 +130,18 @@ def log_messages(thread_id):
131130
results.append(f"thread_{thread_id}_success")
132131
except Exception as e:
133132
results.append(f"thread_{thread_id}_error_{e}")
134-
133+
135134
# Create multiple threads
136135
threads = []
137136
for i in range(5):
138137
thread = threading.Thread(target=log_messages, args=(i,))
139138
threads.append(thread)
140139
thread.start()
141-
140+
142141
# Wait for all threads to complete
143142
for thread in threads:
144143
thread.join()
145-
144+
146145
# All threads should complete successfully
147146
assert len(results) == 5
148147
assert all("success" in result for result in results)
@@ -156,27 +155,27 @@ def test_basic_log_different_log_levels(self):
156155
(LogLevel.ERROR.value, logging.ERROR),
157156
(LogLevel.CRITICAL.value, logging.CRITICAL),
158157
]
159-
158+
160159
for level_str, level_int in log_levels:
161160
basic_log = BasicLog(name=f"test_{level_str}", level=level_str)
162161
logger = basic_log.init()
163162
assert logger.level == level_int
164-
163+
165164
# Clean up
166165
BasicLog.cleanup_logger(logger)
167166

168167
def test_basic_log_multiple_instances(self):
169168
"""Test creating multiple BasicLog instances."""
170169
loggers = []
171-
170+
172171
for i in range(5):
173172
basic_log = BasicLog(name=f"test_multi_{i}", level=LogLevel.INFO.value)
174173
logger = basic_log.init()
175174
loggers.append((basic_log, logger))
176-
175+
177176
assert logger.name == f"test_multi_{i}"
178177
assert logger.level == logging.INFO
179-
178+
180179
# Clean up all loggers
181180
for basic_log, logger in loggers:
182181
BasicLog.cleanup_logger(logger)

0 commit comments

Comments
 (0)