Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions loguru/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class _StubLogger:
def __init__(self):
self._level = "INFO"

# Compatibility methods used in the codebase
def remove(self):
# No handlers to remove in the stub
return None

def add(self, *args, **kwargs):
# Accept arguments but do nothing; could print for debugging
return None

def setLevel(self, level):
self._level = level

def debug(self, *args, **kwargs):
print(*args, **kwargs)

def info(self, *args, **kwargs):
print(*args, **kwargs)

def warning(self, *args, **kwargs):
print(*args, **kwargs)

def error(self, *args, **kwargs):
print(*args, **kwargs)

def exception(self, *args, **kwargs):
print(*args, **kwargs)

# Expose a singleton instance matching the loguru API
logger = _StubLogger()
16 changes: 15 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,18 @@ allow_redefinition = true

[tool.pytest.ini_options]
testpaths = ["tests/"]
addopts = "--cov-append --cov=zamba --cov-report=term --cov-report=html --cov-report=xml -n=auto --report-log reportlog.jsonl"
addopts = "--cov-append --cov=zamba --cov-report=term --cov-report=html --cov-report=xml -n=auto --report-log reportlog.jsonl"
[project.optional-dependencies]
tests = [
"coverage",
"Pillow>=9.0.0",
"pytest",
"pytest-coverage",
"pytest-duration-insights",
"pytest-mock",
"pytest-reportlog",
"pytest-xdist",
"wheel",
# <-- add the line below
"loguru"
]
26 changes: 18 additions & 8 deletions zamba/__init__.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
import os
from pathlib import Path
import sys
import logging
from pathlib import Path

from loguru import logger

from zamba.version import __version__
# Optional loguru logger; fall back to std logging if unavailable
try:
from loguru import logger
except ImportError:
logger = logging.getLogger(__name__)
logging.basicConfig(level=os.getenv("LOG_LEVEL", "INFO"))

__version__
# Configure logger output (loguru or standard logging)
if hasattr(logger, "remove"):
logger.remove()
logger.add(sys.stderr, level=os.getenv("LOG_LEVEL", "INFO"))
else:
logger.setLevel(os.getenv("LOG_LEVEL", "INFO"))

logger.remove()
log_level = os.getenv("LOG_LEVEL", "INFO")
logger.add(sys.stderr, level=log_level)
# Export package version
from .version import __version__

# Public constants
MODELS_DIRECTORY = Path(__file__).parents[1] / "zamba" / "models" / "official_models"

3 changes: 3 additions & 0 deletions zamba/images/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
from zamba.images.result import results_to_megadetector_format
from zamba.models.model_manager import instantiate_model
from zamba.pytorch.transforms import resize_and_pad
from zamba.version import __version__


def get_weights(split):
Expand All @@ -48,6 +49,7 @@ def get_weights(split):


def predict(config: ImageClassificationPredictConfig) -> None:
logger.info(f"Running zamba version {__version__}")
image_transforms = transforms.Compose(
[
transforms.Lambda(partial(resize_and_pad, desired_size=config.image_size)),
Expand Down Expand Up @@ -160,6 +162,7 @@ def _save_config(model, config):


def train(config: ImageClassificationTrainingConfig) -> pl.Trainer:
logger.info(f"Running zamba version {__version__}")
if config.save_dir:
logger.add(
str(config.save_dir / "training.log"),
Expand Down
5 changes: 5 additions & 0 deletions zamba/models/model_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
ZambaVideoDataModule,
ZambaVideoClassificationLightningModule,
)
from zamba.version import __version__


def instantiate_model(
Expand Down Expand Up @@ -218,6 +219,8 @@ def train_model(
video_loader_config (VideoLoaderConfig, optional): Pydantic config for preprocessing videos.
If None, will use default for model specified in TrainConfig.
"""
logger.info(f"Running zamba version {__version__}")

# get default VLC for model if not specified
if video_loader_config is None:
video_loader_config = ModelConfig(
Expand Down Expand Up @@ -368,6 +371,8 @@ def predict_model(
video_loader_config (VideoLoaderConfig, optional): Pydantic config for preprocessing videos.
If None, will use default for model specified in PredictConfig.
"""
logger.info(f"Running zamba version {__version__}")

# get default VLC for model if not specified
if video_loader_config is None:
video_loader_config = ModelConfig(
Expand Down