Skip to content

Commit 618aa21

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 736c3b5 commit 618aa21

File tree

2 files changed

+53
-42
lines changed

2 files changed

+53
-42
lines changed

packages/jupyter-ai/jupyter_ai/personas/persona_manager.py

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -288,65 +288,73 @@ def __init__(
288288
):
289289
# Forward other arguments to parent class
290290
super().__init__(*args, **kwargs)
291-
291+
292292
# Set default root directory to current working directory if not provided
293293
self.root_dir = root_dir or os.getcwd()
294-
295-
self.log.info(f"LocalPersonaLoader initialized with root directory: {self.root_dir}")
294+
295+
self.log.info(
296+
f"LocalPersonaLoader initialized with root directory: {self.root_dir}"
297+
)
296298

297299
def load_persona_classes(self) -> list[type[BasePersona]]:
298300
"""
299301
Loads persona classes from Python files in the local filesystem.
300-
302+
301303
Scans the root_dir for .py files, dynamically imports them, and extracts
302304
any class declarations that are subclasses of BasePersona.
303305
"""
304306
persona_classes: list[type[BasePersona]] = []
305-
307+
306308
# Check if root directory exists
307309
if not os.path.exists(self.root_dir):
308310
self.log.info(f"Root directory does not exist: {self.root_dir}")
309311
return persona_classes
310-
312+
311313
# Find all .py files in the root directory that contain "persona" in the name
312314
all_py_files = glob(os.path.join(self.root_dir, "*.py"))
313315
py_files = [f for f in all_py_files if "persona" in Path(f).stem.lower()]
314-
316+
315317
if not py_files:
316-
self.log.info(f"No Python files with 'persona' in the name found in directory: {self.root_dir}")
318+
self.log.info(
319+
f"No Python files with 'persona' in the name found in directory: {self.root_dir}"
320+
)
317321
return persona_classes
318-
319-
self.log.info(f"Found {len(py_files)} Python files with 'persona' in the name in {self.root_dir}")
322+
323+
self.log.info(
324+
f"Found {len(py_files)} Python files with 'persona' in the name in {self.root_dir}"
325+
)
320326
self.log.info("PENDING: Loading persona classes from local Python files...")
321327
start_time_ns = time_ns()
322-
328+
323329
for py_file in py_files:
324330
try:
325331
# Get module name from file path
326332
module_name = Path(py_file).stem
327-
333+
328334
# Skip if module name starts with underscore (private modules)
329-
if module_name.startswith('_'):
335+
if module_name.startswith("_"):
330336
continue
331-
337+
332338
# Create module spec and load the module
333339
spec = importlib.util.spec_from_file_location(module_name, py_file)
334340
if spec is None or spec.loader is None:
335341
self.log.warning(f" - Unable to create module spec for {py_file}")
336342
continue
337-
343+
338344
module = importlib.util.module_from_spec(spec)
339345
spec.loader.exec_module(module)
340-
346+
341347
# Find all classes in the module that are BasePersona subclasses
342348
module_persona_classes = []
343349
for name, obj in inspect.getmembers(module, inspect.isclass):
344350
# Check if it's a subclass of BasePersona but not BasePersona itself
345-
if (issubclass(obj, BasePersona) and
346-
obj is not BasePersona and
347-
obj.__module__ == module_name):
351+
if (
352+
issubclass(obj, BasePersona)
353+
and obj is not BasePersona
354+
and obj.__module__ == module_name
355+
):
348356
module_persona_classes.append(obj)
349-
357+
350358
if module_persona_classes:
351359
persona_classes.extend(module_persona_classes)
352360
class_names = [cls.__name__ for cls in module_persona_classes]
@@ -355,21 +363,21 @@ def load_persona_classes(self) -> list[type[BasePersona]]:
355363
)
356364
else:
357365
self.log.debug(f" - No persona classes found in '{py_file}'")
358-
366+
359367
except Exception:
360368
# On exception, log an error and continue
361369
# This mirrors the error handling pattern from entry point loading
362370
self.log.exception(
363371
f" - Unable to load persona classes from '{py_file}' due to an exception printed below."
364372
)
365373
continue
366-
374+
367375
if len(persona_classes) > 0:
368376
elapsed_time_ms = (time_ns() - start_time_ns) // 1_000_000
369377
self.log.info(
370378
f"SUCCESS: Loaded {len(persona_classes)} persona classes from local filesystem. Time elapsed: {elapsed_time_ms}ms."
371379
)
372380
else:
373381
self.log.info("No persona classes found in local filesystem.")
374-
382+
375383
return persona_classes

packages/jupyter-ai/jupyter_ai/tests/test_personas.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
Test the local persona manager.
33
"""
44

5-
import pytest
65
import tempfile
76
from pathlib import Path
87

8+
import pytest
99
from jupyter_ai.personas.base_persona import BasePersona, PersonaDefaults
1010
from jupyter_ai.personas.persona_manager import LocalPersonaLoader
1111

@@ -19,59 +19,62 @@ def tmp_persona_dir():
1919

2020
class TestLocalPersonaLoader:
2121
"""Test cases for LocalPersonaLoader class."""
22-
22+
2323
def test_empty_directory_returns_empty_list(self, tmp_persona_dir):
2424
"""Test that an empty directory returns an empty list of persona classes."""
2525
loader = LocalPersonaLoader(root_dir=str(tmp_persona_dir))
2626
result = loader.load_persona_classes()
2727
assert result == []
28-
28+
2929
def test_non_persona_file_returns_empty_list(self, tmp_persona_dir):
3030
"""Test that a Python file without persona classes returns an empty list."""
3131
# Create a file that doesn't contain "persona" in the name
3232
non_persona_file = tmp_persona_dir / "no_personas.py"
3333
non_persona_file.write_text("pass")
34-
34+
3535
loader = LocalPersonaLoader(root_dir=str(tmp_persona_dir))
3636
result = loader.load_persona_classes()
3737
assert result == []
38-
38+
3939
def test_simple_persona_file_returns_persona_class(self, tmp_persona_dir):
4040
"""Test that a file with a BasePersona subclass returns that class."""
4141
# Create a simple persona file
4242
persona_file = tmp_persona_dir / "simple_personas.py"
43-
persona_content = '''
43+
persona_content = """
4444
from jupyter_ai.personas.base_persona import BasePersona
4545
4646
class TestPersona(BasePersona):
4747
id = "test_persona"
4848
name = "Test Persona"
4949
description = "A simple test persona"
50-
50+
5151
def process_message(self, message):
5252
pass
53-
'''
53+
"""
5454
persona_file.write_text(persona_content)
55-
55+
5656
loader = LocalPersonaLoader(root_dir=str(tmp_persona_dir))
5757
result = loader.load_persona_classes()
58-
58+
5959
assert len(result) == 1
6060
assert result[0].__name__ == "TestPersona"
6161
assert issubclass(result[0], BasePersona)
62-
63-
def test_bad_persona_file_logs_exception_returns_empty_list(self, tmp_persona_dir, caplog):
62+
63+
def test_bad_persona_file_logs_exception_returns_empty_list(
64+
self, tmp_persona_dir, caplog
65+
):
6466
"""Test that a file with syntax errors logs an exception and returns empty list."""
6567
# Create a file with invalid Python code
66-
bad_persona_file = tmp_persona_dir / "bad_persona.py"
68+
bad_persona_file = tmp_persona_dir / "bad_persona.py"
6769
bad_persona_file.write_text("1/0")
68-
70+
6971
loader = LocalPersonaLoader(root_dir=str(tmp_persona_dir))
7072
result = loader.load_persona_classes()
71-
73+
7274
assert result == []
7375
# Check that an error was logged
74-
assert any("Unable to load persona classes from" in record.message
75-
for record in caplog.records if record.levelname in ["ERROR", "EXCEPTION"])
76-
77-
76+
assert any(
77+
"Unable to load persona classes from" in record.message
78+
for record in caplog.records
79+
if record.levelname in ["ERROR", "EXCEPTION"]
80+
)

0 commit comments

Comments
 (0)