Skip to content

Commit 06e709f

Browse files
Merge master into pre/v2.1
- Resolve conflicts in settings.py and version.py - Keep use_tls Field with validation_alias from pre/v2.1 - Use database_prefix (renamed from schema_prefix) from master - Bump version to 2.1.0a9 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2 parents 885cbb0 + 8c85a9b commit 06e709f

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

src/datajoint/autopopulate.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ def _populate1(
605605
jobs.complete(key)
606606
return False
607607

608-
logger.debug(f"Making {key} -> {self.full_table_name}")
608+
logger.jobs(f"Making {key} -> {self.full_table_name}")
609609
self.__class__._allow_insert = True
610610

611611
try:
@@ -636,7 +636,7 @@ def _populate1(
636636
exception=error.__class__.__name__,
637637
msg=": " + str(error) if str(error) else "",
638638
)
639-
logger.debug(f"Error making {key} -> {self.full_table_name} - {error_message}")
639+
logger.jobs(f"Error making {key} -> {self.full_table_name} - {error_message}")
640640
if jobs is not None:
641641
jobs.error(key, error_message=error_message, error_stack=traceback.format_exc())
642642
if not suppress_errors or isinstance(error, SystemExit):
@@ -647,7 +647,7 @@ def _populate1(
647647
else:
648648
self.connection.commit_transaction()
649649
duration = time.time() - start_time
650-
logger.debug(f"Success making {key} -> {self.full_table_name}")
650+
logger.jobs(f"Success making {key} -> {self.full_table_name}")
651651

652652
# Update hidden job metadata if table has the columns
653653
if self._has_job_metadata_attrs():

src/datajoint/logging.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,44 @@
22
import os
33
import sys
44

5+
# Custom log level for job/populate status messages
6+
# DEBUG (10) < JOBS (15) < INFO (20) < WARNING (30) < ERROR (40)
7+
JOBS = 15
8+
logging.addLevelName(JOBS, "JOBS")
9+
10+
11+
def jobs(self, message, *args, **kwargs):
12+
"""Log job status messages (make start/success/error)."""
13+
if self.isEnabledFor(JOBS):
14+
self._log(JOBS, message, args, **kwargs)
15+
16+
17+
logging.Logger.jobs = jobs
18+
519
logger = logging.getLogger(__name__.split(".")[0])
620

721
log_level = os.getenv("DJ_LOG_LEVEL", "info").upper()
22+
log_stream = os.getenv("DJ_LOG_STREAM", "stdout").lower()
23+
24+
25+
class LevelAwareFormatter(logging.Formatter):
26+
"""Format INFO messages cleanly, show level for warnings/errors and JOBS."""
27+
28+
def format(self, record):
29+
timestamp = self.formatTime(record, "%Y-%m-%d %H:%M:%S")
30+
if record.levelno >= logging.WARNING:
31+
return f"[{timestamp}][{record.levelname}]: {record.getMessage()}"
32+
elif record.levelno == JOBS:
33+
return f"[{timestamp}][JOBS]: {record.getMessage()}"
34+
else:
35+
return f"[{timestamp}] {record.getMessage()}"
836

9-
log_format = logging.Formatter("[%(asctime)s][%(levelname)s]: %(message)s")
1037

11-
stream_handler = logging.StreamHandler() # default handler
12-
stream_handler.setFormatter(log_format)
38+
# Select output stream: stdout (default, no red highlighting) or stderr
39+
# Configurable via DJ_LOG_STREAM=stdout|stderr
40+
output_stream = sys.stderr if log_stream == "stderr" else sys.stdout
41+
stream_handler = logging.StreamHandler(output_stream)
42+
stream_handler.setFormatter(LevelAwareFormatter())
1343

1444
logger.setLevel(level=log_level)
1545
logger.handlers = [stream_handler]

src/datajoint/settings.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
"database.password": "DJ_PASS",
6666
"database.backend": "DJ_BACKEND",
6767
"database.port": "DJ_PORT",
68-
"database.schema_prefix": "DJ_SCHEMA_PREFIX",
68+
"database.database_prefix": "DJ_DATABASE_PREFIX",
6969
"database.create_tables": "DJ_CREATE_TABLES",
7070
"loglevel": "DJ_LOG_LEVEL",
7171
"display.diagram_direction": "DJ_DIAGRAM_DIRECTION",
@@ -198,11 +198,11 @@ class DatabaseSettings(BaseSettings):
198198
port: int | None = Field(default=None, validation_alias="DJ_PORT")
199199
reconnect: bool = True
200200
use_tls: bool | None = Field(default=None, validation_alias="DJ_USE_TLS")
201-
schema_prefix: str = Field(
201+
database_prefix: str = Field(
202202
default="",
203-
validation_alias="DJ_SCHEMA_PREFIX",
204-
description="Project-specific prefix for schema names. "
205-
"Not automatically applied; use dj.config.database.schema_prefix when creating schemas.",
203+
validation_alias="DJ_DATABASE_PREFIX",
204+
description="Prefix for database/schema names. "
205+
"Not automatically applied; use dj.config.database.database_prefix when creating schemas.",
206206
)
207207
create_tables: bool = Field(
208208
default=True,

src/datajoint/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# version bump auto managed by Github Actions:
22
# label_prs.yaml(prep), release.yaml(bump), post_release.yaml(edit)
33
# manually set this version will be eventually overwritten by the above actions
4-
__version__ = "2.1.0a8"
4+
__version__ = "2.1.0a9"

0 commit comments

Comments
 (0)