Skip to content

Commit 42c8007

Browse files
pre-commit-ci[bot]fperez
authored andcommitted
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 6639e94 commit 42c8007

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
@@ -315,65 +315,73 @@ def __init__(
315315
):
316316
# Forward other arguments to parent class
317317
super().__init__(*args, **kwargs)
318-
318+
319319
# Set default root directory to current working directory if not provided
320320
self.root_dir = root_dir or os.getcwd()
321-
322-
self.log.info(f"LocalPersonaLoader initialized with root directory: {self.root_dir}")
321+
322+
self.log.info(
323+
f"LocalPersonaLoader initialized with root directory: {self.root_dir}"
324+
)
323325

324326
def load_persona_classes(self) -> list[type[BasePersona]]:
325327
"""
326328
Loads persona classes from Python files in the local filesystem.
327-
329+
328330
Scans the root_dir for .py files, dynamically imports them, and extracts
329331
any class declarations that are subclasses of BasePersona.
330332
"""
331333
persona_classes: list[type[BasePersona]] = []
332-
334+
333335
# Check if root directory exists
334336
if not os.path.exists(self.root_dir):
335337
self.log.info(f"Root directory does not exist: {self.root_dir}")
336338
return persona_classes
337-
339+
338340
# Find all .py files in the root directory that contain "persona" in the name
339341
all_py_files = glob(os.path.join(self.root_dir, "*.py"))
340342
py_files = [f for f in all_py_files if "persona" in Path(f).stem.lower()]
341-
343+
342344
if not py_files:
343-
self.log.info(f"No Python files with 'persona' in the name found in directory: {self.root_dir}")
345+
self.log.info(
346+
f"No Python files with 'persona' in the name found in directory: {self.root_dir}"
347+
)
344348
return persona_classes
345-
346-
self.log.info(f"Found {len(py_files)} Python files with 'persona' in the name in {self.root_dir}")
349+
350+
self.log.info(
351+
f"Found {len(py_files)} Python files with 'persona' in the name in {self.root_dir}"
352+
)
347353
self.log.info("PENDING: Loading persona classes from local Python files...")
348354
start_time_ns = time_ns()
349-
355+
350356
for py_file in py_files:
351357
try:
352358
# Get module name from file path
353359
module_name = Path(py_file).stem
354-
360+
355361
# Skip if module name starts with underscore (private modules)
356-
if module_name.startswith('_'):
362+
if module_name.startswith("_"):
357363
continue
358-
364+
359365
# Create module spec and load the module
360366
spec = importlib.util.spec_from_file_location(module_name, py_file)
361367
if spec is None or spec.loader is None:
362368
self.log.warning(f" - Unable to create module spec for {py_file}")
363369
continue
364-
370+
365371
module = importlib.util.module_from_spec(spec)
366372
spec.loader.exec_module(module)
367-
373+
368374
# Find all classes in the module that are BasePersona subclasses
369375
module_persona_classes = []
370376
for name, obj in inspect.getmembers(module, inspect.isclass):
371377
# Check if it's a subclass of BasePersona but not BasePersona itself
372-
if (issubclass(obj, BasePersona) and
373-
obj is not BasePersona and
374-
obj.__module__ == module_name):
378+
if (
379+
issubclass(obj, BasePersona)
380+
and obj is not BasePersona
381+
and obj.__module__ == module_name
382+
):
375383
module_persona_classes.append(obj)
376-
384+
377385
if module_persona_classes:
378386
persona_classes.extend(module_persona_classes)
379387
class_names = [cls.__name__ for cls in module_persona_classes]
@@ -382,21 +390,21 @@ def load_persona_classes(self) -> list[type[BasePersona]]:
382390
)
383391
else:
384392
self.log.debug(f" - No persona classes found in '{py_file}'")
385-
393+
386394
except Exception:
387395
# On exception, log an error and continue
388396
# This mirrors the error handling pattern from entry point loading
389397
self.log.exception(
390398
f" - Unable to load persona classes from '{py_file}' due to an exception printed below."
391399
)
392400
continue
393-
401+
394402
if len(persona_classes) > 0:
395403
elapsed_time_ms = (time_ns() - start_time_ns) // 1_000_000
396404
self.log.info(
397405
f"SUCCESS: Loaded {len(persona_classes)} persona classes from local filesystem. Time elapsed: {elapsed_time_ms}ms."
398406
)
399407
else:
400408
self.log.info("No persona classes found in local filesystem.")
401-
409+
402410
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)